[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置

【本文为百问网&韦东山【物联网智能家居实战训练营】学习笔记系列】


引言

目前在单片机领域,FreeRTOS和RT-Thread为两个最常用的实时多任务操作系统。在单片机领域,FreeRTOS是应用最广的,很多芯片厂家默认就支持FreeRTOS。但是FreeRTOS没有丰富的生态,没有很多基于FreeRTOS的组件。RT-Thread相比于FreeRTOS起步稍晚,但是它的生态更强,基于RT-Thread可以使用更丰富的组件,快速开发产品。

1 引入RTOS的益处

在开发嵌入式软件时,对于复杂的项目,使用实时操作系统有如下好处:

(1)用户无需关系时间信息

内核复杂计时,并由相关的API完成,从而使得应用程序代码结构更加简洁。

(2)模块化、可拓展性强

各个任务为独立模块,每个模块目的明确,可降低代码的耦合性;程序性能不易受底层硬件更改的影响,可移植性强。

(3)效率高

内核可以让软件完全由事件驱动,相当于采用中断进行任务切换,从而减少对未发生事件进行轮询造成的资源浪费。

(4)中断进程更短

通过把中断的处理推迟到用户创建的任务中,可实现中断处理程序更短。

2 采用STM32CubeMX实现FreeRTOS的配置

2.1 采用STM32CubeMX进行配置的具体步骤

(1)首先在STM32CubeMX中打开Demo工程Code8,

(2)选择FreeRTOS的mode

选择“MiddleWare”——>“FreeRTOS”,在Mode窗口中为“Interface”选择“CMSIS_V2”,如图1所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第1张图片

图1 进行Mode选择

(3)为FreeRTOS进行参数配置

在“Config parameters”菜单中,保持默认参数,如图2所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第2张图片

图2 参数配置

(4)创建一个新任务。

在图3中,点击“Tasks and Queues”——>“Add”,弹出图4所示的对话框。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第3张图片

图3 添加新任务

在图4中,将新任务命名为“MyTask”,将“Code Generation Option”设为“As external”选项,其他保持默认值。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第4张图片

图4 任务编辑对话框

注意:新创建的任务(MyTask)的默认Stack size为128 words(即512bytes),栈空间太小,程序运行过程中可能会发生栈溢出现象,因此需要增大栈空间(一般可在代码中进行所需栈空间估算,然后再返回来进行栈空间的合理设置),此处设置为512words,如图5所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第5张图片

图5 栈空间设置

(5)修改系统的时基源。HAL库时基:

系统的默认时基源(Timebase Source)为SysTick,此即为HAL库的时基源。启用FreeRTOS后,其默认时基源为SysTick,未避免冲突,需要更改系统的时基源。可选择除SysTick外的其它任意一个定时器,这里改为Time1。如图6所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第6张图片

图6 修改时基源

(6)设置外部中断EXTI0的抢占优先级

在图7中,选择“NVIC”——>“EXTI line0 interrupt”,其“抢占优先级”(Preemption Priority)应设为>=5,这里选择5。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第7张图片

图7 中断设置

(7)生成工程

在图8中,点击“GENERATECODE”,生成工程。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第8张图片

图8 生成工程

2.2 代码解析

(1)目录树

新生成工程的目录树如图9所示,"\Core"目录下新增文件有“freertos.c”和“stm32f1xx_hal_timebase_tim.c”,新增了目录“Middlewares/FreeRTOS”,其文件目录如图10所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第9张图片

图9 工程目录树

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第10张图片

图10 “Middlewares/FreeRTOS”目录下的文件列表

(2)关键代码

main.c中新增的关键代码如图11和图12所示:

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第11张图片

图11 main.c中的新增关键代码

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第12张图片

图12 main.c中的新增关键代码(续)

freertos.c文件中的新增关键代码如图13和图14所示:

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第13张图片

图13 freertos.c文件中的新增关键代码

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第14张图片

图14 freertos.c文件中的新增关键代码(续)

3 程序改写

在main.c中实现MyTask的具体工作代码,将main()函数中while(1)循环移植到StartMyTask()函数中,代码段如图15所示。

[006]嵌入式学习:采用STM32CubeMX进行FreeRTOS配置_第15张图片

图15 StartMyTask()函数的代码

编译烧写后即可查看实验现象。

结语

本文对采用STM32CubeMX进行FreeRTOS配置的过程进行了讲解和演示。

你可能感兴趣的:(嵌入式开发,单片机,stm32,嵌入式硬件)