FreeRTOS_01 | 系统移植
FreeRTOS_01 | 系统移植
本篇文章主要介绍如何移植FreeRTOS到STM32单片机上,并创建任务实现LED闪烁(标准库)。
为什么嵌入式需要跑操作系统?
1.实时性强,程序中如果发生了延迟,能挂起当前任务执行其他任务,而不是整个程序在等待。
2.操作系统隔离了各个功能程序让它们的耦合程度降低,方便编写各个功能模块。
3.可读性和可移植性更好,每个任务的优先级和执行周期还有功能模块都是可以预知的。
至于为什么选择FreeRTOS而不选择资料更多的UCOS和国内开发的RT-Thread,主要还是工作中使用的是FreeRTOS。
FreeRTOS的介绍
相关资料
FreeRTOS 官网及手册在线版
到官网下载现在最新的10.4.1版本的软件包
FreeRTOS特点
- 支持抢占式调度,合作式调度和时间片调度。
- SafeRTOS 作为 FreeRTOS 的衍生品大大提高了 FreeRTOS 在代码完整性方面的信心。
- 用于低功耗的 Tickless 模式。
- 支持 35 种系统架构。
- FreeRTOS-MPU 支持 M3/M4/M7 内核的 MPU(内存保护单元)。
- 设计的简单易用,典型的内核使用大小在 4k-9k。
- 移植非常简单,代码主要用 C 编写。
- 同时支持合作式和抢占式任务。
- 支持消息队列、 二值信号量、 计数信号量、 递归信号量和互斥信号量,可用于任务与任务间的消息传递和同步, 任务与中断间的消息传递和同步。
- 优先级继承方式的互斥信号量。
- 高效的软件定时器。
- 强大的跟踪执行函数。
- 堆栈溢出检查。
- 提供丰富的,配置好的工程例子。
- 提供论坛技术支持, 有可选的商业支持和许可版本。
- 任务的数量不限。
- 任务优先级数量不限。
- 多个任务可以分配相同优先级, 即支持时间片调度。
- 免费的开发工具。
- 免费的嵌入式软件源码。
- 免版权费。
FreeRTOS移植
复制标准库的代码并增加一个名为FreeRTOS的文件用于添加FreeRTOS源码
将源码文件、FreeRTOS配置文件、内存管理方式文件与硬件相关接口文件添加到MDK的工程项目中并添加头文件路径
FreeRTOSConfig.h配置文件的路径在\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK
heap_4.c 文件路径:\FreeRTOS\Source\portable\MemMang
port.c 和 portmacro.h 文件的路径:\FreeRTOS\Source\portable\RVDS\ARM_CM4F
这两个是M4硬件相关接口代码
编译报错\FreeRTOS\portable\RVDS\ARM_CM4F\port.c(732): error: #20: identifier "SystemCoreClock" is undefined
填加MDK的编译器编译器预定义宏
接着又报未定义的错误
这是因为在FreeRTOSConfig.h中开启了这些钩子函数,但是没有定义这些钩子函数导致的。我们在FreeRTOSConfig.h中关闭使用这些钩子函数的宏就行了,这里将宏configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configUSE_MALLOC_FAILED_HOOK和configCHECK_FOR_STACK_OVERFLOW定义为0。
最后编译成功
效果测试
添加任务创建代码
#include "includes.h"
#include "FreeRTOS.h"
#include "task.h"
void vTaskLed(void * pvParameters)
{
while(1)
{
LED1_ON;
vTaskDelay(1000);
LED1_OFF;
vTaskDelay(1000);
}
}
int main(void)
{
/* LED初始化 */
LED_Init();
/* 创建任务 */
xTaskCreate(vTaskLed,"Task Led",512,NULL,1,NULL);
/* 启动调度, 开始执行任务 */
vTaskStartScheduler();
while(1);
}
LED1开始闪烁
总结
使用实时操作系统能一定程度上,提高实时性,不像裸机系统,一个while死循环顺序执行程序,并加点中断去执行其他功能,如果程序中有模块发生了延迟,其他模块都要等待这个延迟(除了中断);因每个任务的功能较为明确,也大大增加了可移植性。对于系统逻辑结构复杂,功能模块较多的情况下建议使用实时操作系统。
代码已全部上传到gitee