FreeRTOS移植

1. 准备
- FreeRTOS 源码
在 freeRTOS 官网即可下载到
https://www.freertos.org/zh-cn-cmn-s/a00104.html
- ARM GCC
在 ARM 官网下载适合自己linux系统的版本
https://launchpad.net/gcc-arm-embedded/+series
- make
2. 移植
将下载到的文件解压,可得到如下的文件结构

其中,我们只需要 FreeRTOS 文件夹
新建一个目录,将 FreeRTOS 移入该目录,删除FreeRTOS/Demo,创建MIAN函数和makefile文件
根据自己的编译器,选择 FreeRTOS/Source/portable 内的文件夹。本文使用的是GCC编译器,故将除了GCC、MemMang和Common以外的文件夹全删除。

再进入GCC文件夹,只保留自己处理器类型的文件夹,其余全部删除

进入 MemMang 文件夹,只保留自己需要的heap类型,其余文件可以删除,也可以都保留,在编译时指定一种也可

2.1 修改makefile
打开刚刚创建的makefile
将以上代码中的各个文件 path 修改为与自己的工程一致,尤其是 LINKER_SCRIPT 和 startup_CMSDK_CM3.s 和相关的 incude 文件夹。将 heap 文件添加在 FRTOS_FILES
生成的 bin 文件即可以直接用来下载运行,verilog 形式的 hex 文件可以用来仿真 M3 核心时给 tb 使用。
2.2 FreeRTOSConfig.h
在解压的 FreeRTOS/Demo 下找一个合适的 demo 将该文件夹内的 FreeRTOSConfig.h 文件复制到工程下的 FreeRTOS/Source/include 文件夹内
打开 FreeRTOSConfig.h,删除第52行,即取消低功耗模式。
其余的配置根据实际需求进行修改即可
2.3 修改 default_handlers
default_handlers.c 内为中断处理函数
通过系统默认的中断处理函数来调用 freertos 的系统中断响应函数
- xPortSysTickHandler 为系统的 systick 中断处理,即系统的心跳
- vPortSVCHandler 为系统服务调用中断,该中断会在使用 svc 指令后触发,主要用于上下文切换的触发
- xPortPendSVHandler 为可挂起的SVC中断,该中断一般为优先级最低的中断,只有在处理完所有的中断后,才会处理该中断。系统通常使用该中断进行上下文切换。
移植中,只需要在相应的默认中断处理函数中调用 FreeRTOS 的中断处理函数即可,不需要额外的修改。
2.4 编写main
在main函数内创建一个简单的task,也可以通过定义函数 vPortSetupTimerInterrupt 覆写 对 systick 初始化的函数。
若需要使用 configTICK_RATE_HZ 宏配置的参数,那么就不要覆写 vPortSetupTimerInterrupt 函数,让 FreeRTOS 自行配置 systick 即可。
2.5 linkScripts
linkScripts 主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局。可以根据自己芯片的内存是如何分配的来修改
2.6 编译运行
在配置好的文件夹内运行 make 即可成功编译
将生成的 .hex 文件移动到 TB 文件夹内,运行m3仿真可以观察到每 5 个周期打印一次 “task”
