FreeRTOS 操作系統(tǒng)移植(MDK)
1.?開發(fā)環(huán)境使用 MDK,用 MDK4.7X 或者 MDK5.XX 均可,保證支持 STM32F103,F(xiàn)407 和 F429 即可。
(不可以使用 MDK4.7X 以下版本,一方面是不支持 F429,另外就是 FreeRTOS V8.2.3 要用到 C 代碼中嵌套匯編代碼,MDK4.7X 以下版本是不支持的)。
2. 找一個簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個簡單的工程上面移植即可。
3. 大家使用的簡單工程里面不能有 SysTick,PendSV 和 SVC 三個系統(tǒng)中斷的使用,因?yàn)?FreeRTOS 系統(tǒng)要使用這三個中斷。
?
首先準(zhǔn)備好一個簡單的裸機(jī)工程模板
◆ 第 1 步:從網(wǎng)址 https://sourceforge.net/projects/freertos/files/FreeRTOS/V8.2.3/
下載 V8.2.3 版本
FreeRTOSV8.2.3.zip 和 FreeRTOSV8.2.3.exe 內(nèi)容是一樣的,只是后綴為 exe 的壓縮率更高些。下載后 解壓出來。?
?
◆ 第 2 步:在工程模板創(chuàng)建 FreeRTOS 文件夾?

?
◆ 第 3 步:添加源碼文件到相應(yīng)文件夾
將 FreeRTOSV8.2.3 軟件包中路徑:FreeRTOSV8.2.3\FreeRTOS\Source 里面如下所有文復(fù)制到剛剛創(chuàng)建的 FreeRTOS 文件夾下。

?
文件夾 User 中還需要添加如下文件:

?
文件 FreeRTOSConfig.h 文件在 FreeRTOSV8.2.3 軟件包中的中的路徑:
FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_STM32F103_Keil,
其實(shí)就是官方整理好的配置文件
?
?
將源碼文件添加到 MDK 的工程項目中,添加后的效果如下:
?

其中 heap_4.c 文件路徑: FreeRTOS\Source\portable\MemMang
?
port.c 和 portmacro.h 文件的路徑:FreeRTOS\Source\portable\RVDS\ARM_CM3,由于 STM32F103 是 M3 內(nèi)核的,所以移植文件也要添加 M3 內(nèi)核的。
?
◆ 第 4 步:新創(chuàng)建一個 includes.h 文件,將所有的頭文件都集中到這個頭文件下。
?
這樣做的好處是引用頭文件的時候,只添加這個頭文件就可以了。includes.h 文件放在了 User 文件夾中。然后再將這個文件也添加到 MDK 工程項目中(將.h 文件添加到工程的好處是方便查看和修改)
?
includes.h 文件中的內(nèi)容如下:
?
◆ 第 5 步:添加相應(yīng)的頭文件路徑,在原來工程模板的基礎(chǔ)上新添加的兩個路徑:?
?
?
◆第 6 步:最后一步,同時也是最重要的一步,修改 FreeRTOSConfig.h 配置文件
(用戶根據(jù)自己的配置進(jìn)行修改,不修改也是沒問題的,進(jìn)行修改是為了方便初學(xué)者學(xué)習(xí)),主要兩個方面:
1.添加宏定義__NVIC_PRIO_BITS,STM32 系列產(chǎn)品優(yōu)先級僅使用 4 位。?
2.修改優(yōu)先級相關(guān)的幾個宏定義,具體修改了哪個可以對比原始文件查看。?
?
修改后在這個文件的末尾加上 Systick,PendSV 和 SVC 中斷函數(shù)的宏定義,
目的是將 FreeRTOS 移植文件 port.c 文件里面的中斷服務(wù)程序映射到 CMSIS 定義的標(biāo)準(zhǔn)名稱,這樣就不需要用戶去修改工程啟動代碼中這幾個中斷的名字了,很方便就實(shí)現(xiàn)了兩個函數(shù)的統(tǒng)一。
其中 vPortSVCHandler,xPortPendSVHandler 和 xPortSysTickHandler 是在 port.c 文件里面定義的。
SVC_Handler,PendSV_Handler 和SysTick_Handler startup_stm32f10x_hd.s 文件里面進(jìn)行了定義。
?
下面是 FreeRTOSConfig.h 配置文件的完整內(nèi)容:?
FreeRTOS 操作系統(tǒng)應(yīng)用實(shí)例
FreeRTOSConfig.h 配置文件里面幾個重要選項說明:?
◆ #define configUSE_PREEMPTION ?1
使能搶占式調(diào)度器
?
◆ #define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
系統(tǒng)主頻 72MHz。
?
◆ #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
系統(tǒng)時鐘節(jié)拍 1KHz,即 1ms。
◆ #define configMAX_PRIORITIES ( 5 )?
????定義可供用戶使用的最大優(yōu)先級數(shù),如果這個定義的是 5,那么用戶可以使用的優(yōu)先級號是 0,1,2,3,4, 不包含 5,對于這一點(diǎn),初學(xué)者要特別的注意。?
◆ #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )?
????定義堆大小,F(xiàn)reeRTOS 內(nèi)核,用戶動態(tài)內(nèi)存申請,任務(wù)棧等都需要用這個空間。?
????經(jīng)過上面的移植和配置之后,在 main.c 文件中添加如下代碼,代碼中簡單地創(chuàng)建了四個用戶任務(wù):
vTaskTaskUserIF 任務(wù):接口消息處理,這里用作 LED 閃爍。
AppTaskLED 任務(wù) :LED 閃爍。?
vTaskMsgPro 任務(wù) :消息處理,這里用作 LED 閃爍。?
AppTaskStart 任務(wù) :啟動任務(wù),也是最高優(yōu)先級任務(wù),這里實(shí)現(xiàn) LED 閃爍。
?
?
?
?