news 2026/6/23 4:45:33

时间片轮询框架

作者头像

张小明

前端开发工程师

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/23 18:38:25

Python大数据基于Spark的南昌房价数据分析系统的设计与实现_45i0b357_论文

文章目录系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 Python大数据基于Spark的南昌房价数据分析系统的设计与实现_45i0b357_论文 项…

作者头像 李华
网站建设 2026/6/23 15:01:06

9 个降AI率工具,自考人必备的降重神器!

9 个降AI率工具&#xff0c;自考人必备的降重神器&#xff01; AI降重工具&#xff1a;自考人论文的“隐形守护者” 随着人工智能技术的迅猛发展&#xff0c;越来越多的自考学生在论文写作过程中开始依赖AI工具来提升效率。然而&#xff0c;AI生成的内容往往存在明显的痕迹&…

作者头像 李华
网站建设 2026/6/23 19:36:54

9 个降AI率工具,自考人必备!

9 个降AI率工具&#xff0c;自考人必备&#xff01; AI降重工具&#xff0c;自考论文的“隐形助手” 在当前的学术环境中&#xff0c;越来越多的高校和考试机构开始使用AIGC检测系统来评估论文的原创性。对于自考学生来说&#xff0c;这无疑增加了论文写作的难度。为了应对这一…

作者头像 李华
网站建设 2026/6/23 20:20:16

旅行记录应用新建旅行 - Cordova OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 &#x1f4cc; 概述 新建旅行功能允许用户创建新的旅行记录。用户需要填写旅行的基本信息&#xff0c;如目的地、开始日期、结束日期、花费等。新建旅行页面提供了表单验证、自动保存、图片上传…

作者头像 李华
网站建设 2026/6/23 19:33:13

9 个降AI率工具推荐,继续教育学生必备

9 个降AI率工具推荐&#xff0c;继续教育学生必备 AI降重工具&#xff1a;让论文更自然&#xff0c;让学术更纯粹 在当前的学术环境中&#xff0c;随着AI技术的广泛应用&#xff0c;越来越多的学生和研究者开始面临“AIGC率过高”的问题。无论是使用AI生成初稿&#xff0c;还是…

作者头像 李华
网站建设 2026/6/23 19:36:15

Java八股文(Java基础面试题)

为什么重写 equals() 时必须重写 hashCode() 方法&#xff1f; 因为两个相等的对象的hashCode值一定相等&#xff0c;也就是说如果equals()方法判断两个对象是相等的&#xff0c;那这两个对象的hashCode值也要相等。如果重写equals()时没有重写hashCode()方法的话就可能会导致…

作者头像 李华