当前位置: 首页 > news >正文

时间片轮询框架

单片机裸机常常会使用时间篇轮询框架,类似RTOS。参考AI,记录下时间片轮询

1.创建task结构体

typedefstruct{uint8_trun;// 任务运行标志uint16_ttimer;// 任务计时器uint16_tinterval;// 任务执行间隔(ms)void(*task)(void);// 任务函数指针}Task_t;

2. 任务初始化

// 任务初始化voidTask_Init(void){TaskCount=0;for(uint8_ti=0;i<MAX_TASKS;i++){TaskList[i].run=0;TaskList[i].timer=0;TaskList[i].interval=0;TaskList[i].task=NULL;}}

3. 添加任务

/添加任务uint8_tTask_Add(void(*task)(void),uint16_tinterval){if(TaskCount>=MAX_TASKS){return0;// 添加失败}TaskList[TaskCount].task=task;TaskList[TaskCount].interval=interval;TaskList[TaskCount].timer=interval;TaskList[TaskCount].run=0;TaskCount++;return1;// 添加成功}

4.处理任务

// 主循环中调用,处理所有就绪任务voidTask_Process(void){for(uint8_ti=0;i<TaskCount;i++){if(TaskList[i].run){TaskList[i].run=0;// 清除运行标志TaskList[i].timer=TaskList[i].interval;// 重设定时器TaskList[i].task();// 执行任务}}}

5. 计时更新

voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim->Instance==TIM6){HAL_IncTick();// 更新所有任务的计时器for(uint8_ti=0;i<TaskCount;i++){if(TaskList[i].timer>0){TaskList[i].timer--;if(TaskList[i].timer==0){TaskList[i].run=1;// 设置任务运行标志}}}}}

6. 测试

添加任务

/LED闪烁任务voidLED_Task(void){printf("LED_Task is Running \r\n");}// 按键扫描任务voidKeyScan_Task(void){printf("keyScan_task is Running \r\n");}// 数据处理任务voidDataProcess_Task(void){printf("DataProcess_Task is Running \r\n");}// 显示任务voidDisplay_Task(void){printf("Display_Task is Running \r\n");}intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();MX_USART2_UART_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 *//* 任务初始化 */Task_Init();/* 添加任务(任务函数,执行间隔ms) */Task_Add(LED_Task,500);// 500ms执行一次Task_Add(KeyScan_Task,100);// 10ms执行一次Task_Add(DataProcess_Task,1000);// 1000ms执行一次Task_Add(Display_Task,5000);// 20ms执行一次SendBefore();// SendOver();// UART_Timeout_Manager_Init();// UART_Register_Timeout(&huart2, 1, User_UART_Data_Handler);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Task_Process();}/* USER CODE END 3 */}

测试

可以看到各个任务按照设置的时间在运行

http://www.gsyq.cn/news/117857.html

相关文章:

  • 基于springboot百度公司工作报告管理系统
  • 9个AI写作工具,助你轻松搞定本科论文!
  • 【MongoDB实战】6.3 索引优化实战:慢查询解决
  • 避开 35 岁职场危机:网络安全为何能成为越沉淀越吃香的赛道?
  • 蓝桥杯 嵌入式 客观题 [1000道]第二期 持续更新中
  • 拥抱AI,HPE Networking以“自动驾驶的网络”引领智能网络新时代
  • AngularJS 表单
  • 2025 IT 行业就业全景:26 届及以后考生,计算机专业仍值得报考吗?
  • SQL必会必知整理-11-分组数据
  • 10个SolidWorks研发设计共享一台工作站——昆山精密机械工厂降本增效一举三得
  • SVG 多边形
  • JavaScript Window Location
  • Web 渗透测试零基础入门全攻略:核心概念梳理 + 实操步骤拆解 + 工具使用教程,一篇文章全掌握!
  • Harbor磁盘空间清理指南:如何安全清理半年前的镜像
  • 计算机小程序毕设实战-基于springboot+微信小程序的钓鱼交友与渔具回收的微信小程序开发基于微信小程序的钓鱼交友渔具回收系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • EtherCAT分布式时钟
  • 【毕业设计】基于springboot+微信小程序的跑腿小程序的设计与实现(源码+文档+远程调试,全bao定制等)
  • Python 爬虫实战:从零搭建第一个网页爬虫
  • 【毕业设计】基于Java的采购管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 【技术深度】钱包安全威胁模型 + 防御蓝图
  • Java中的锁机制总结
  • 【毕业设计】基于java案件管理系统设计与实现(源码+文档+远程调试,全bao定制等)
  • 计算机小程序毕设实战-基于springboot+微信小程序的校园生活娱乐学习活动管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 越努力,越不幸
  • 计算机小程序毕设实战-基于springboot+微信小程序的应急救援小能手软件系统的设计与实现学习火灾、地震、急救等应急知识【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 亚马逊卖家容易失误的3个坑,有人这样做亏了10w!
  • PostgreSQL数据库
  • 西门子博途1200-V/N积分法卷径计算功能块(SCL源代码)在收放卷设备中的应用
  • sizeof 核心原理:编译期的 “内存大小计算器”
  • [后端进阶] 详解分布式锁的三种实现方式:MySQL vs Redis vs ZooKeeper