以下轉載自安富萊電子: http://forum.armfly.com/forum.php
FreeRTOS 的初始化流程
推薦的初始化流程如下,本教程配套的所有例子都是采用的這種形式,當然,不限制必須采用這種初
始化方式,適合自己項目的才是最好的:
int main(void) { /* 在啟動調度前,為了防止初始化 STM32 外設時有中斷服務程序執行,這里禁止全局中斷(除了 NMI 和 HardFault)。 這樣做的好處是: 1. 防止執行的中斷服務程序中有 FreeRTOS 的 API 函數。 2. 保證系統正常啟動,不受別的中斷影響。 3. 關於是否關閉全局中斷,大家根據自己的實際情況設置即可。 在移植文件 port.c 中的函數 prvStartFirstTask 中會重新開啟全局中斷。通過指令 cpsie i 開啟,__set_PRIMASK(1) 和 cpsie i 是等效的。 */ __set_PRIMASK(1); /* 硬件初始化 */ bsp_Init(); /* 創建任務 */ AppTaskCreate(); /* 創建任務通信機制 */ AppObjCreate(); /* 啟動調度,開始執行任務 */ vTaskStartScheduler(); /* 如果系統正常啟動是不會運行到這里的,運行到這里極有可能是用於定時器任務或者空閑任務的 heap 空間不足造成創建失敗,此要加大 FreeRTOSConfig.h 文件中定義的 heap 大小: #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) */ while(1); }
中斷優先級分組設置
強烈推薦用戶將 Cortex-M3 內核的 STM32F103 和 Cortex-M4 內核的 STM32F407 以及 F429 的
NVIC 優先級分組設置為 4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);這樣中斷優先級的
管理將非常方便。 此函數在 bsp_Init 中第一個被調用:
FreeRTOS 中使用中斷注意事項
對於初學者來說,首先,務必要把FreeRTOS 中斷優先級配置弄明白,非常重要。 其次,
FreeRTOS 中斷方式的同步或者通信機制,在教程中都有配套的例子及其使用注意事項,使用時務必要注
意。 另外,用戶要注意以下兩個問題,在前面的章節中也有啰嗦過:
PendSV 中斷,SysTick 中斷和 SVC 0 中斷用戶不可調用,這三個被 FreeRTOS 占用。
對於 STM32F103,STM32F407 和 STM32F429 來說,當用戶將優先級分組設置為 4 的時候,PendSV
的中斷優先級是 15,SysTick 的中斷優先級也是 15,而 SVC 的中斷優先級是 0。 其中 SVC 中斷,僅
在系統啟動的時候調用了一次。
FreeRTOS 官方整理的 FAQ
官方總結的問題匯總地址:http://www.freertos.org/FAQ.html
寫在最后:
到這里,FreeRTOS的基礎篇,即了解基本操作系統原理和能使用提供的API函數操作已經告一段落,如果確實到了需要分析源碼和匯編的時候,再進行之后的提高練習。先做好應用層,再慢慢深入。提高自身水平的永遠是自己的不斷學習,不斷練習,多動手操作,多動腦思考,有了FreeRTOS基礎之后,學習之后的小型嵌入式系統,會很得心應手。最后會出一個所有關於FreeRTOS的隨筆目錄,方便之后復習的瀏覽。
之后的提高篇是根據自己的使用經驗的分享。