news 2026/6/10 2:15:24

时间片轮询框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
时间片轮询框架

单片机裸机常常会使用时间篇轮询框架,类似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 */}

测试

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 0:22:05

掌握定价权:在价值重估的时代定义未来

在并购取代部分IPO成为退出主通道、监管为“烧钱换规模”明确划出红线的双重变局下&#xff0c;企业的价值坐标正被悄然改写。2025年12月16日&#xff0c;由极新、AI原点学堂、原点企业家club、中国银行联合主办的「极新友趣CFO私董会」在东升大厦举行。十余位企业CFO、创始人、…

作者头像 李华
网站建设 2026/6/7 2:19:40

趋势分析模块 Cordova 与 OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 &#x1f4cc; 概述 趋势分析模块是福报养成计应用中的一个重要分析工具&#xff0c;它展示了用户福报积累的长期趋势和变化规律。通过趋势分析&#xff0c;用户可以清晰地看到自己在不同时间段…

作者头像 李华
网站建设 2026/6/8 16:43:00

“人民咖啡馆“的商标驳回原因分析!

近日"人民咖啡馆"在网上引起争议&#xff0c;最后宣布对中国大陆地区所有门店进行整改&#xff0c;在门头和宣传中规范使用其已注册的"要潮人民咖啡馆"商标。"人民咖啡馆"商标注册类别属于43类餐饮已经驳回&#xff0c;所以他们前面加字申请了&q…

作者头像 李华
网站建设 2026/6/9 7:59:33

如何设计分布式延时消息?——以机票购买场景为例

前言在真实业务中&#xff0c;“延时触发”是一类非常常见但又容易被低估的需求&#xff0c;例如&#xff1a;机票下单后 15 分钟未支付自动取消订单创建后 30 分钟关闭活动开始前 定时推送通知资源锁定一段时间后 自动释放在单机系统中&#xff0c;这类需求实现并不复杂&#…

作者头像 李华
网站建设 2026/6/7 6:36:50

EmotiVoice在客服机器人中的应用潜力分析

EmotiVoice在客服机器人中的应用潜力分析 在客户服务领域&#xff0c;一次通话的语气往往比内容本身更能决定用户的满意度。当用户焦急地询问订单状态时&#xff0c;一句冷冰冰的“系统显示正常”可能激化情绪&#xff0c;而同样的信息如果以温和关切的语调说出&#xff0c;反而…

作者头像 李华
网站建设 2026/6/6 20:14:15

Python语言之数据结构操作对比:字典、列表、元组、集合

Python数据结构操作对比&#xff1a;字典、列表、元组、集合 以下是四种主要数据结构的操作对比&#xff0c;包含详细示例和注释&#xff1a; 1. 创建&#xff08;初始化&#xff09; # 字典 (dict) # 创建空字典 dict1 {} dict2 dict() # 创建带初始值的字典 dict3 …

作者头像 李华