上一次,我們簡單的測試了FreeRTOS的基於IAR EWARM v6.4和STM32F103VET6平台的Demo,對其有了一個基本認識。接下來我們開始自己移植FreeRTOS的過程。
1、創建一個“FreeRTOSTestProject”項目文件夾,並在其下創建FreeRTOS、Libraries、Project、User文件夾。
與無操作系統的項目一樣User中存放應用文件;Project中存放項目文件;Libraries中存放STM32F1xx標准庫文件。而在FreeRTOS文件夾中存放操作系統文件。
將\FreeRTOSv9.0.0\FreeRTOS\Source目錄下的6個源文件及include文件夾復制到新建項目的FreeRTOS文件夾。
將\FreeRTOSv9.0.0\FreeRTOS\Source\portable\IAR\ARM_CM3目錄下的三個文件也復制到新建項目的FreeRTOS文件夾。
將FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang目錄下的heap_4.c文件復制到新建項目的FreeRTOS文件夾。
對於內存管理的幾個文件的大致內容如下:
- heap_1.c:這是所有實現中最簡單的一個。一旦分配內存之后,它甚至不允許釋放分配的內存。
- heap_2.c:和heap_1不同,這個方案使用一個最佳匹配算法,它允許釋放之前分配的內存塊。它不會把相鄰的空閑塊合成一個更大的塊,可能會造成內存碎片。
- heap_3.c:簡單的包裝了標准庫中的malloc()和free()函數,包裝后的malloc()和free()函數具備線程保護。
- heap_4.c:這個方案使用一個最佳匹配算法,但不像方案2那樣。它會將相鄰的空閑內存塊合並成一個更大的塊。
- heap_5.c:這個方案同樣實現了heap_4.c中的合並算法,並且允許堆棧跨越多個非連續的內存區。
將\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_IAR目錄下的FreeRTOSConfig.h文件復制到新建項目的FreeRTOS文件夾。
至此,全部用於移植的文件准備完成。
2、在IAR EWARM中新建workspace,再一個項目,取名為FreeRTOSTest,並添加組:
並向個組中添加相應的文件。
3、配置項目選項
項目的屬性選項配置與誤操作系統時一樣,需要說一下的是在Assembler中的Preprocessor標簽下添加$PROJ_DIR$\..\..\User\inc路徑,因為在會變文件中有對FreeRTOSConfig.h文件的引用。
4、修改FreeRTOSConfig.h 配置文件,這個根據需要修改,目前只定義如下3個宏定義,避免去修改啟動文件:
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
如果僅作次修改,編譯時會報警說重復定義,所以還需要注釋掉stm32f10x_it.c文件中對三個函數的定義。
5、編寫測試應用
在main.c文件中添加相應的代碼,聲明如下函數及代碼(我計划4個任務):
/*************************************************************************** 函數聲明 ***************************************************************************/ static void vTask1(void *pvParameters); static void vTask2(void *pvParameters); static void vTask3(void *pvParameters); static void vTask4(void *pvParameters); static void AppTaskCreate (void); /*************************************************************************** 變量聲明 ***************************************************************************/ static TaskHandle_t xHandleTask1 = NULL; static TaskHandle_t xHandleTask2 = NULL; static TaskHandle_t xHandleTask3 = NULL; static TaskHandle_t xHandleTask4 = NULL; 任務創建函數如下: static void AppTaskCreate (void) { xTaskCreate( vTask1, "vTask1",512, NULL,1, &xHandleTask1); xTaskCreate( vTask2, "vTask2",512, NULL,1, &xHandleTask2); xTaskCreate( vTask3, "vTask3",512, NULL,1, &xHandleTask3); xTaskCreate( vTask4, "vTask4",512, NULL,1, &xHandleTask4); } 主函數如下: int main(void) { /* 創建任務 */ AppTaskCreate(); /* 啟動任務調度,開始執行任務 */ vTaskStartScheduler(); }
編譯無錯誤4個任務同時運行。移植初步測試成功。