FreeRTOS移植

1. 準備
- FreeRTOS 源碼
在 freeRTOS 官網(wǎng)即可下載到
https://www.freertos.org/zh-cn-cmn-s/a00104.html
- ARM GCC
在 ARM 官網(wǎng)下載適合自己linux系統(tǒng)的版本
https://launchpad.net/gcc-arm-embedded/+series
- make
2. 移植
將下載到的文件解壓,可得到如下的文件結構

其中,我們只需要 FreeRTOS 文件夾
新建一個目錄,將 FreeRTOS 移入該目錄,刪除FreeRTOS/Demo,創(chuàng)建MIAN函數(shù)和makefile文件
根據(jù)自己的編譯器,選擇 FreeRTOS/Source/portable 內的文件夾。本文使用的是GCC編譯器,故將除了GCC、MemMang和Common以外的文件夾全刪除。

再進入GCC文件夾,只保留自己處理器類型的文件夾,其余全部刪除

進入 MemMang 文件夾,只保留自己需要的heap類型,其余文件可以刪除,也可以都保留,在編譯時指定一種也可

2.1 修改makefile
打開剛剛創(chuàng)建的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行,即取消低功耗模式。
其余的配置根據(jù)實際需求進行修改即可
2.3 修改 default_handlers
default_handlers.c 內為中斷處理函數(shù)
通過系統(tǒng)默認的中斷處理函數(shù)來調用 freertos 的系統(tǒng)中斷響應函數(shù)
- xPortSysTickHandler 為系統(tǒng)的 systick 中斷處理,即系統(tǒng)的心跳
- vPortSVCHandler 為系統(tǒng)服務調用中斷,該中斷會在使用 svc 指令后觸發(fā),主要用于上下文切換的觸發(fā)
- xPortPendSVHandler 為可掛起的SVC中斷,該中斷一般為優(yōu)先級最低的中斷,只有在處理完所有的中斷后,才會處理該中斷。系統(tǒng)通常使用該中斷進行上下文切換。
移植中,只需要在相應的默認中斷處理函數(shù)中調用 FreeRTOS 的中斷處理函數(shù)即可,不需要額外的修改。
2.4 編寫main
在main函數(shù)內創(chuàng)建一個簡單的task,也可以通過定義函數(shù) vPortSetupTimerInterrupt 覆寫 對 systick 初始化的函數(shù)。
若需要使用 configTICK_RATE_HZ 宏配置的參數(shù),那么就不要覆寫 vPortSetupTimerInterrupt 函數(shù),讓 FreeRTOS 自行配置 systick 即可。
2.5 linkScripts
linkScripts 主要用于規(guī)定如何把輸入文件內的section放入輸出文件內, 并控制輸出文件內各部分在程序地址空間內的布局??梢愿鶕?jù)自己芯片的內存是如何分配的來修改
2.6 編譯運行
在配置好的文件夾內運行 make 即可成功編譯
將生成的 .hex 文件移動到 TB 文件夾內,運行m3仿真可以觀察到每 5 個周期打印一次 “task”
