【本文为百问网&韦东山【物联网智能家居实战训练营】学习笔记系列】
目前在单片机领域,FreeRTOS和RT-Thread为两个最常用的实时多任务操作系统。在单片机领域,FreeRTOS是应用最广的,很多芯片厂家默认就支持FreeRTOS。但是FreeRTOS没有丰富的生态,没有很多基于FreeRTOS的组件。RT-Thread相比于FreeRTOS起步稍晚,但是它的生态更强,基于RT-Thread可以使用更丰富的组件,快速开发产品。
在开发嵌入式软件时,对于复杂的项目,使用实时操作系统有如下好处:
(1)用户无需关系时间信息
内核复杂计时,并由相关的API完成,从而使得应用程序代码结构更加简洁。
(2)模块化、可拓展性强
各个任务为独立模块,每个模块目的明确,可降低代码的耦合性;程序性能不易受底层硬件更改的影响,可移植性强。
(3)效率高
内核可以让软件完全由事件驱动,相当于采用中断进行任务切换,从而减少对未发生事件进行轮询造成的资源浪费。
(4)中断进程更短
通过把中断的处理推迟到用户创建的任务中,可实现中断处理程序更短。
(1)首先在STM32CubeMX中打开Demo工程Code8,
(2)选择FreeRTOS的mode
选择“MiddleWare”——>“FreeRTOS”,在Mode窗口中为“Interface”选择“CMSIS_V2”,如图1所示。
图1 进行Mode选择
(3)为FreeRTOS进行参数配置
在“Config parameters”菜单中,保持默认参数,如图2所示。
图2 参数配置
(4)创建一个新任务。
在图3中,点击“Tasks and Queues”——>“Add”,弹出图4所示的对话框。
图3 添加新任务
在图4中,将新任务命名为“MyTask”,将“Code Generation Option”设为“As external”选项,其他保持默认值。
图4 任务编辑对话框
注意:新创建的任务(MyTask)的默认Stack size为128 words(即512bytes),栈空间太小,程序运行过程中可能会发生栈溢出现象,因此需要增大栈空间(一般可在代码中进行所需栈空间估算,然后再返回来进行栈空间的合理设置),此处设置为512words,如图5所示。
图5 栈空间设置
(5)修改系统的时基源。HAL库时基:
系统的默认时基源(Timebase Source)为SysTick,此即为HAL库的时基源。启用FreeRTOS后,其默认时基源为SysTick,未避免冲突,需要更改系统的时基源。可选择除SysTick外的其它任意一个定时器,这里改为Time1。如图6所示。
图6 修改时基源
(6)设置外部中断EXTI0的抢占优先级
在图7中,选择“NVIC”——>“EXTI line0 interrupt”,其“抢占优先级”(Preemption Priority)应设为>=5,这里选择5。
图7 中断设置
(7)生成工程
在图8中,点击“GENERATECODE”,生成工程。
图8 生成工程
(1)目录树
新生成工程的目录树如图9所示,"\Core"目录下新增文件有“freertos.c”和“stm32f1xx_hal_timebase_tim.c”,新增了目录“Middlewares/FreeRTOS”,其文件目录如图10所示。
图9 工程目录树
图10 “Middlewares/FreeRTOS”目录下的文件列表
(2)关键代码
main.c中新增的关键代码如图11和图12所示:
图11 main.c中的新增关键代码
图12 main.c中的新增关键代码(续)
freertos.c文件中的新增关键代码如图13和图14所示:
图13 freertos.c文件中的新增关键代码
图14 freertos.c文件中的新增关键代码(续)
在main.c中实现MyTask的具体工作代码,将main()函数中while(1)循环移植到StartMyTask()函数中,代码段如图15所示。
图15 StartMyTask()函数的代码
编译烧写后即可查看实验现象。
本文对采用STM32CubeMX进行FreeRTOS配置的过程进行了讲解和演示。