FreeRTOS_01 | 系统移植

FreeRTOS_01 | 系统移植

本篇文章主要介绍如何移植FreeRTOS到STM32单片机上,并创建任务实现LED闪烁(标准库)。
为什么嵌入式需要跑操作系统?
1.实时性强,程序中如果发生了延迟,能挂起当前任务执行其他任务,而不是整个程序在等待。
2.操作系统隔离了各个功能程序让它们的耦合程度降低,方便编写各个功能模块。
3.可读性和可移植性更好,每个任务的优先级和执行周期还有功能模块都是可以预知的。

至于为什么选择FreeRTOS而不选择资料更多的UCOS和国内开发的RT-Thread,主要还是工作中使用的是FreeRTOS。

FreeRTOS的介绍

相关资料

FreeRTOS 官网及手册在线版
到官网下载现在最新的10.4.1版本的软件包

FreeRTOS特点

  1. 支持抢占式调度,合作式调度和时间片调度。
  2. SafeRTOS 作为 FreeRTOS 的衍生品大大提高了 FreeRTOS 在代码完整性方面的信心。
  3. 用于低功耗的 Tickless 模式。
  4. 支持 35 种系统架构。
  5. FreeRTOS-MPU 支持 M3/M4/M7 内核的 MPU(内存保护单元)。
  6. 设计的简单易用,典型的内核使用大小在 4k-9k。
  7. 移植非常简单,代码主要用 C 编写。
  8. 同时支持合作式和抢占式任务。
  9. 支持消息队列、 二值信号量、 计数信号量、 递归信号量和互斥信号量,可用于任务与任务间的消息传递和同步, 任务与中断间的消息传递和同步。
  10. 优先级继承方式的互斥信号量。
  11. 高效的软件定时器。
  12. 强大的跟踪执行函数。
  13. 堆栈溢出检查。
  14. 提供丰富的,配置好的工程例子。
  15. 提供论坛技术支持, 有可选的商业支持和许可版本。
  16. 任务的数量不限。
  17. 任务优先级数量不限。
  18. 多个任务可以分配相同优先级, 即支持时间片调度。
  19. 免费的开发工具。
  20. 免费的嵌入式软件源码。
  21. 免版权费。

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

posted @ 2022-08-13 22:20  半截心跳  阅读(630)  评论(0编辑  收藏  举报