STM32F1系列移植freertos
FreeRTOS 是一个可裁剪的小型 RTOS 系统,其特点包括:
● FreeRTOS 的内核支持抢占式,合作式和时间片调度。
● SafeRTOS 衍生自 FreeRTOS,SafeRTOS 在代码完整性上相比 FreeRTOS 更胜一筹。
● 提供了一个用于低功耗的 Tickless 模式。
● 系统的组件在创建时可以选择动态或者静态的 RAM,比如任务、消息队列、信号量、 软件定时器等等。
● 已经在超过 30 种架构的芯片上进行了移植。
● FreeRTOS-MPU 支持 Corex-M 系列中的 MPU 单元,如 STM32F103。
● FreeRTOS 系统简单、小巧、易用,通常情况下内核占用 4k-9k 字节的空间。
● 高可移植性,代码主要 C 语言编写。
● 支持实时任务和协程(co-routines 也有称为合作式、协同程序,本教程均成为协程)。
● 任务与任务、任务与中断之间可以使用任务通知、消息队列、二值信号量、数值型信 号量、递归互斥信号量和互斥信号量进行通信和同步。
● 创新的事件组(或者事件标志)。
● 具有优先级继承特性的互斥信号量。
● 高效的软件定时器。
● 强大的跟踪执行功能。
● 堆栈溢出检测功能。
● 任务数量不限。
● 任务优先级不限。
STM32F1系列移植freertos
以STM32F103ZET6为例:
1. 准备空白工程
这里使用STM32cudemx生成示例代码(点灯代码):
生成代码如下:
注意事项:
由于FreeRTOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器当作超时计数用,FreeRTOS和HAL库不能同时使用SysTick定时器,所在在这里将HAL库的定时器改为其他的定时器,这里改成了定时器4:
配置中断,注意这里一定要选择组4,也就是全部为抢占优先级:
2. 准备freertos源码
去freertos官网下载源码:https://www.freertos.org/zh-cn-cmn-s/a00104.html
内容如下:
3.进行代码裁剪:
删除不必要的文件:
portable文件夹:
MemMang文件夹:
4. 将文件添加到工程:
在项目里新建文件夹:根目录/Middlewares /FreeRTOS
将 FreeRTOS 内核源码的 Source 文件夹下的所有文件添加到工程的 FreeRTOS 文件夹中
在工程分组里添加新的分组,分 别 为 Middlewares/FreeRTOS_CORE 和 Middlewares/FreeRTOS_PORT,如下图所示:
Middlewares/FreeRTOS_CORE 分组用于存放 FreeRTOS 的内核 C 源码文件, 将 FreeRTOS 目录下所有的 FreeRTOS 的内核 C 源文件添加到 Middlewares/FreeRTOS_CORE 分组中。
Middlewares/FreeRTOS_PORT 分组用于存放 FreeRTOS 内核的移植文件,需要添加两个文件到这个分组,分别为 heap_x.c 和 port.c。
首先是 heap_x.c, 在路径 FreeRTOS/portable/MemMang 下有五个 C 源文件,这五个 C 源文 件对应了五种 FreeRTOS 提供的内存管理算法,读者在进行 FreeRTOS 移植的时候可以根据需 求选择合适的方法,具体这五种内存管理的算法,在后续 FreeRTOS 内存管理章节会具体分析, 这里就先使用 heap_4.c,将 heap_4.c 添加到 Middlewares/FreeRTOS_PORT 分组中。
接着是 port.c, port.c 是 FreeRTOS 这个软件与 MCU 这个硬件连接的桥梁,因此对于 STM32 系列不同的开发板,所使用的 port.c 文件是不同的。 port.c 文件的路径在 FreeRTOS/portable/RVDS 下。进入到 FreeRTOS/portable/RVDS,可以看到 FreeRTOS 针对不同 的 MCU 提供了不同的 port.c 文件,具体STM32 系列开发板与不同 port.c 的对应关 系如下表所示:
将所有 FreeRTOS 相关的所需文件添加到工程后,如下图所示:
5.添加头文件路径
6.添加并修改 FreeRTOSConfig.h 文件
FreeRTOSConfig.h 是 FreeRTOS 操作系统的配置文件, FreeRTOS 操作系统是可裁剪的,用 户可以根据需求对 FreeRTOS 进行裁剪,裁剪掉不需要用到的 FreeRTOS 功能.
新建空白的FreeRTOSConfig.h到core/inc文件夹;
修改FreeRTOSConfig.h:
添加代码:
1 |
|
7.修改 stm32f1xx_it.c文件
打开stm32f1xx_it.c
文件,在头部添加FreeRTOS的三个函数导入:
1 |
|
在函数SVC_Handler
中添加函数调用:
在函数PendSV_Handler
中添加函数调用:
在函数SysTick_Handler
中添加函数调用:
8.建立工程进行测试
main.c里添加头文件:
1 |
|
新建两个点灯任务:
1 |
|
开启任务:
两个灯交替闪烁,移植成功!
总结:移植FreeRTOS还是相对简单的,主要是配置文件FreeRTOSConfig.h
的配置,每个宏定义所代表的意思需要好好查阅!
参考链接
FreeRTOS之在STM32F103移植
https://blog.csdn.net/m0_37895576/article/details/120435482
STM32CubeMX | STM32使用HAL库手动移植FreeRTOS10.4.1
https://blog.csdn.net/qq153471503/article/details/108999523