13.2.1 FreeRTOS应用案例

更新于 2026年10月10日 版权声明
13.2.1 FreeRTOS应用案例

1.任务要求

利用FreeRTOS建立3个任务Task1_led、Task2_led和Task3_led,分别控制3个LED,控制其轮流亮灭,示意图如图13.5所示。LED1间隔100 ms亮和熄灭一次,LED2间隔200 ms亮和熄灭一次,LED3间隔500 ms亮和熄灭一次。

2.硬件和软件设计

在STM32CubeMX中建立工程,在中间件中选择操作系统FreeRTOS,相关参数采用默认值即可。在“System Core”下拉列表中选择“GPIO”选项,配置PB10、PB11、PB12为输出;选择“SYS”选项,配置“Timebase Source”为“TIM2”,这是因为FreeRTOS用到了节拍定时器SysTick。生成MDK工程文件,在“main.c”文件中添加任务,参考程序如下。

图示

图13.5 应用案例示意图

图示

图示

这3个任务均无限循环,并通过FreeRTOS管理,按优先级高低运行。Task1_led中的LED1间隔100 ms亮一次、熄灭一次;Task2_led中的LED2间隔200 ms亮一次、熄灭一次;Task3_led中的LED3间隔500 ms亮一次、熄灭一次。在串口调试助手上可观察3个任务的执行情况,在Keil-MDK的“Logic Analyzer”窗口中可以观察波形,如图13.6所示。按照3个任务优先级的顺序,依次执行Task3_led、Task2_led、Task1_led任务。

图示(https://www.daowen.com)

图13.6 任务执行情况和波形

首先FreeRTOS通过调整计算机,使处于就绪态的高优先级任务Task3_led执行,“LED_On(3);printf("The LED3 is ON!\r\n");”语句执行后,遇到“vTaskDelay(500);”语句,任务会被阻塞,等待500 ms后再执行。轮到同优先级的任务Task2_led执行,遇到“vTaskDelay(200);”语句时,任务被阻塞。

其次,低优先级Task1_led任务再执行,“LED_On(1);printf("The LED1 is ON!\r\n");”语句执行后,遇到“vTaskDelay(100);”语句时任务会被阻塞,等100 ms后再执行。

最后,3个任务都阻塞,CPU运行优先级最低的空闲任务。如果Task1_led的延时时间到,调度器会调度Task1_led剩下的程序继续执行“LED_Off(1);printf("The LED1 is OFF!\r\n");”语句,执行完后,Task3_led还在阻塞,因此继续执行前面的语句。当Task2_led的200 ms延时时间到时,退出阻塞,执行“LED_Off(2);printf("The LED2 is OFF!\r\n");”语句。

综上所述,该案例的执行过程引出以下几个问题,请读者带着这些问题来认识FreeRTOS。

(1)什么是任务、任务堆栈、任务控制块、任务运行状态?

(2)任务是怎样就绪的?怎样进行多任务调度的?任务是怎样切换的?

(3)怎样写中断服务子程序?

(4)什么是时钟节拍?FreeRTOS是怎样处理时钟节拍的?

(5)任务与任务之间是如何进行同步与互斥通信的?

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)