FreeRTOS學習及移植筆記之二:在IAR和STM32F103VET上移植FreeRTOS


上一次,我們簡單的測試了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個任務同時運行。移植初步測試成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM