ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

FreeRTOS_01 | 系统移植

2022-08-13 22:31:46  阅读:173  来源: 互联网

标签:01 优先级 FreeRTOS 代码 信号量 任务 移植


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

标签:01,优先级,FreeRTOS,代码,信号量,任务,移植
来源: https://www.cnblogs.com/zhanxiaohong0303/p/2022_08_13.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有