中关村在线

软件

FreeRTOS移植指南

是一款开放源代码且完全免费的嵌入式实时操作系统,近年来受到越来越多开源社区和初创企业的青睐。在物联网领域,许多主流设备都基于FreeRTOS进行开发,例如ESP8267的固件以及RTL8710的官方SDK均采用该系统作为核心。FreeRTOS具备良好的可移植性,移植过程十分简便,只需引入必要的源码文件,无需涉及复杂的底层操作,仅需配置三个宏定义即可完成基础搭建。接下来将详细介绍具体实现步骤。

1、 嵌入式操作系统包括分时系统和实时系统两类。当系统能迅速响应外部事件的请求,有效管理和协调各类实时设备与任务,并在规定时限内完成处理,确保任务按时执行,则该系统被称为实时操作系统。

2、 实时操作系统根据任务时限的严格程度分为两类:时限极为苛刻、需硬件配合的称为硬件实时系统,时限相对宽松、由软件实现的则为软件实时系统。

3、 访问官方网站获取最新版本的FreeRTOS系统,下载后将其解压至本地目录。解压后包含两个主要文件夹:其中FreeRTOS文件夹存放操作系统核心代码,FreeRTOS-Plus则提供多种中间件支持,如文件系统与网络协议栈等功能模块。

4、 FreeRTOS的教学书籍与API参考手册已提供免费电子版,建议在安装系统时同步下载至本地,便于后续学习与查阅,为深入掌握其功能与应用打下坚实基础。

5、 FreeRTOS具备轻量高效、实时性强等特点

6、 支持抢占、协作及时间片三种调度方式

7、 具备低功耗的无节拍模式,有效节省能耗。

8、 FreeRTOS-MPU可兼容M3、M4、M7内核的内存保护单元,实现任务间的内存隔离与安全防护。

9、 内核典型使用大小通常在4千到9千字节之间。

10、 支持消息队列及多种信号量机制,包括二值、计数、递归信号量和互斥量,适用于任务间以及任务与中断间的通信与同步操作。

11、 任务及优先级数量均无限制。

12、 高效的软件定时器无需额外消耗CPU时间,仅在执行定时任务时才占用资源。

13、 任务间直接通信,传递消息速度快。

14、 FreeRTOS队列作为核心,支撑着各类通信与同步机制的实现。

15、 在移植FreeRTOS前,原工程中不得使用SysTick、PendSV和SVC这三个系统中断,因其已被FreeRTOS内核占用。建议选择如跑马灯等简单工程进行移植,以避免中断冲突,确保系统正常运行。

16、 准备好简易工程模板

17、 在工程模板内新建FreeRTOS文件夹,将解压后的源码中Source目录下的全部内容复制至该文件夹中。

18、 在user目录下需手动创建FreeRTOSConfig.h配置文件,也可参考官方示例进行修改使用。例如,可从源码包中的FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK路径下复制该文件,再根据实际项目需求调整相关配置参数,以确保系统正常运行。

19、 将源码文件加入MDK工程目录时,需注意路径设置:heap_4.c位于Source/portable/MemMang目录下,而port.c应放在FreeRTOS/Source/portable/RVDS/ARM_CM4F路径中。由于M451芯片采用的是CM4F内核架构,因此必须选用对应ARM_CM4F的移植文件,以确保FreeRTOS能正确运行于该硬件平台之上。

20、 添加新头文件搜索路径到工程中

21、 打开FreeRTOSConfig.h文件,根据实际硬件参数调整配置。

22、 将文件起始处的__ICCARM__替换为__CC_ARM,实现从IAR编译器切换至RealView编译器。

23、 将以下宏设置为零

24、 将宏定义 configUSE_PREEMPTION 设为 1 可启用抢占式调度功能,使任务能被高优先级任务立即中断并切换执行。

25、 将系统主频定义为configCPU_CLOCK_HZ,对应M451型号的主频值为72MHz,通过SystemCoreClock获取实际时钟频率,确保系统运行基于准确的时钟源。

26、 将系统节拍频率设定为1000Hz,相当于每1毫秒产生一次时钟节拍,用于精确控制任务调度的时间间隔。

27、 将最大优先级数设为5,即configMAX_PRIORITIES为5,表示系统允许的优先级范围是0到4,用户可在该范围内选择任务优先级。

28、 该宏定义设置了堆内存总大小为30KB,供FreeRTOS系统使用。内核运行、任务栈分配及用户动态内存申请均依赖此区域。合理配置该值对系统稳定性和资源利用至关重要,过小可能导致分配失败,过大则浪费内存。

29、 重新编译整个工程,标志着FreeRTOS的移植工作基本完成。

30、 编写测试程序验证FreeRTOS的一致性与可用性。

31、 在main.c中引入所需的几个头文件。

32、 在main函数起始处,需关闭全局中断(保留NMI和HardFault异常),可通过执行__set_PRIMASK(1)实现。此举旨在避免系统启动过程中,有中断服务程序调用FreeRTOS的API函数,从而确保内核初始化过程不受干扰,稳定运行。待系统完成基础配置后,在port.c文件中的prvStartFirstTask函数会自动重新开启全局中断,恢复正常中断响应机制,使系统进入多任务调度状态,保障实时操作系统的正确启动与后续任务的顺利执行。

33、 创建任务,调用AppTaskCreate函数。

34、 启动任务调度,调用vTaskStartScheduler()函数开始执行各项任务。

35、 烧录程序并运行,串口显示正确输出信息。

展开全文
人赞过该文
内容纠错

相关电商优惠

评论

更多评论
还没有人评论~ 快来抢沙发吧~

读过此文的还读过

点击加载更多

内容相关产品

说点什么吧~ 0

发评论,赚金豆

收藏 0 分享
首页查报价问答论坛下载手机笔记本游戏硬件数码影音家用电器办公打印 更多

更多频道

频道导航
辅助工具