2013年11月29日 星期五

[FreeRTOS] FreeRTOS 移植到 STM32F407Discovery

Porting FreeRTOS最快的方法,就是利用FreeRTOS官網提供DemoCode來改,不過因為DemoCode所使用的STM32 Driver都是比較舊的,而且程式碼又較複雜,所以還是整理一份比較乾淨的版本,掌握度會比較高。
  • FreeRTOS (使用STM32F407)
    圖一
    圖一是FreeRTOS Source目錄架構,這個資料夾是FreeRTOS的核心。而要使用FreeRTOS有幾個重點要注意,
    • Complier
      路徑:Source\portable\{ComplierVersion}\{CPU}\port.c
      • Complier : RVDS(Keil) or GCC
      • CPU : (ARM_CA9/ARM_CM3/ARM_CM4F)

    • MemoryManagement
      路徑:Source\MemMang\heap_X.c
      • X:heap有四個版本
    • FreeRTOSConfig.h
      路徑: Demo\{MCU}\FreeRTOSConfig.h
      • MCU: 這個檔案是根據MCU來設定,通常直接拿DemoCode的來用,不過還是要根據MCU的硬體來設定,所以我選用Demo\CORTEX_M4F_STM32F407ZG-S\FreeRTOSConfig.h
  • STM32 Driver
    • STM32F4xx_StdPeriph_Driver
      此資料夾是STM32的周邊Driver,通常會使用最新版,而我習慣使用GPIO來改。
    • Peripheral_Examples此資料夾是STM32的Demo程式,我習慣使用GPIO來做修改。
  • Porting
  • 圖二
    圖二為程式的目錄架構和要Import的檔案,而接下來就是如何讓FreeRTOS跟STM32綁在一下,有三個重要function需要介接
    • vPortSVCHandler();
    • xPortPendSVHandler();
    • xPortSysTickHandler(); 
    介接這三個Function,以下提供兩個方法
    • 1. 修改 startup_stm32f4xx.s
      將紅色框框的部分加入到startup_stm32f4xx.s
    圖三
    • 2. 修改FreeRTOSConfig.h將紅色框框的部分加入到FreeRTOSConfig.h (如果Complier時,發生multiply defined,記得把它助解,通常會是stm32f4xx_it.c檔案裡)
    圖四
    完成以上步驟,大致上就已經完成Porting部分,接下就是用他啦摟,

    #include "stm32f10x.h"
    #include "FreeRTOS.h"
    #include "task.h"

    void vTask( void *pvParameters )
    {  
        portTickType xLastWakeTime = xTaskGetTickCount();
       
        while(1)
        {
            // do something
            vTaskDelayUntil( &xLastWakeTime, ( 500 / portTICK_RATE_MS ) );
        }
    }

    int main ()
    {
        xTaskCreate( vTask, ( signed portCHAR * ) "Task1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
        vTaskStartScheduler();

        while(1);
    }
  • Note
    Reference [4]
    是已經Porting FreeRTOS for STM32F407-Discovery

Reference:
[1] FreeRTOS 
[2] STM32F4 入門教學:FreeRTOS 移植
[3] STM32 Driver 
[4] DemoCode - STM32F407VG-FreeRTOS

1 則留言:

  1. 你好 我想向你請教stm32f407的相關問題
    請問你有聯絡方式嗎?

    回覆刪除