是一款开放源代码且完全免费的嵌入式实时操作系统,近年来受到越来越多开源社区和初创企业的青睐。在物联网领域,许多主流设备都基于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、 烧录程序并运行,串口显示正确输出信息。
评论
更多评论