如果你是STM32F4 請查看此篇文章:STM32F4 入門教學:FreeRTOS 移植


0.前言

       本文要描述的問題為:

  • FreeRTOS下載包的文件結構,FreeRTOS源碼結構
  • 移植到Cortex-M3系統需要做那些工作
  • 一些基本RTOS API函數

 

1. FreeRTOS下載包的文件結構

       在FreeRTOS官方網站可以下載到最新版的FreeRTOS包,目前最新版本為V7.40。

       下載包內的總文件數量多的令人敬畏,但文件結構卻很簡潔。FreeRTOS實時操作系統內核僅包含三個必須文件(還有兩個附加的文件,一個用於協程,另一個用於軟件定時器)。

       下載包根目錄下包含兩個子目錄:FreeRTOS和FreeRTOS-Plus。其中,FreeRTOS-Plus文件夾中包含一些FreeRTOS+組件和演示例程(組件大都收費),我們不對這個文件夾下的內容多做了解,重點說一下FreeRTOS文件夾。

       FreeRTOS文件夾下包含兩個子目錄:Demo和Source。其中,Demo包含演示例程的工程文件,Source包含實時操作系統源代碼文件。

       RTOS核心代碼位於三個源文件中,分別是tasks.c、queue.c和list.c。這三個文件位於FreeRTOS/Source目錄下,在同一目錄下還有兩個可選的文件,叫做timers.c和croutine.c,分別用於軟件定時器和協程。

       對於支持的處理器架構,RTOS需要一些與處理器架構相關的代碼。可以稱之為RTOS硬件接口,它們位於FreeRTOS/Source/Portable/[相應編譯器]/[相應處理器架構]文件夾下。我們這次要移植到Cortex-M3為控制,使用Keil MDK編譯器,所以需要的RTOS硬件接口代碼位於:FreeRTOS\Source\portable\RVDS\ARM_CM3文件夾下。

       堆棧分配也是屬於硬件接口(移植層),在FreeRTOS/Source/portable/MemMang文件夾下具有各種類型的堆棧分配方案。FreeRTOS內存管理頁面詳細描述了這些方案。

       FreeRTOS文件夾下的Demo文件夾中還包括各種演示例程,涉及多種架構的處理器以及多種編譯器。FreeRTOS/Demo/Common/Minimal文件夾下的演示例程代碼中,絕大部分對所有移植硬件接口都是適用的。FreeRTOS/Demo/Common/Full文件夾下的代碼屬於歷史遺留代碼,僅用於PC移植層。

2. 移植前的一些準備

  • 一塊具有Cortex-M3微處理器的硬件板子,並且保證板子可以正常運轉。
  • 下載FreeRTOS程序包,點擊這裡進入下載指引頁面
  • 下載CMSIS-M3,其實主要是需要裡面的core_cm3.h文件

 

3.移植過程

 

3.1 添加RTOS核心代碼

       將tasks.c、queue.c和list.c這三個內核代碼加入工程,將port.c和heap_1.c這兩個與處理器相關代碼加入工程。port.c位於FreeRTOS\Source\portable\RVDS\ARM_CM3文件夾下,heap_1.c位於FreeRTOS/Source/portable/MemMang文件夾下。

3.2 添加頭文件路徑

       ...\FreeRTOS\Source\portable\RVDS\ARM_CM3

       …\FreeRTOS\Source\include

3.3 編寫FreeRTOSConfig.h

       對於剛接觸FreeRTOS的用戶來說,最簡單方法是找一個類似的Demo工程,複製該工程下的FreeRTOSConfig.h文件,在這個基礎上進行修改。點擊這裡查看典型FreeRTOSConfig.h文件配置參數說明。

3.4 編寫一些鉤子函數

       如果你在FreeRTOSConfig.h中設置了configUSE_TICK_HOOK=1,則必須編寫void vApplicationTickHook( void )函數。該函數利用時間片中斷,可以很方便的實現一個定時器功能。

       如果你在FreeRTOSConfig.h中設置了configCHECK_FOR_STACK_OVERFLOW=1或=2,則必須編寫void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName )函數,該函數用於檢測堆棧溢出,關於FreeRTOS堆棧用法和堆棧溢出檢查,請點擊這裡

3.5 檢查硬件

       為了驗證你的硬件板子是否可靠的工作,首先編寫一個小程序片,比如閃爍一個LED燈或者發送一個字符等等,代碼如下所示(假設你已經配置好了啟動代碼):

   1:  //這裡放置其它頭文件
   2:  #include  "task.h"
   3:  #include  "queue.h"
   4:  #include  "list.h"
   5:  #include  "portable.h"
   6:  
   7:  #include  "debug.h"
   8:  
   9:  int main( void )
  10: {
  11:      init_rtos_debug();            //初始化調試串口
  12:      MAP_UARTCharPut( 'A' );         //發送一個字符
  13:      while (1);
  14: }

       如果硬件可以正常發送字符,說明硬件以及啟動代碼OK。

3.6 掛接中斷

       在Cortex-M3硬件下,FreeRTOS使用SysTick作為系統節拍時鐘,使用SVC和PendSVC進行上下文切換。異常中斷服務代碼位於port.c文件中,FreeRTOS的作者已經為各種架構的CPU寫好了這些代碼,可以直接拿來用,需要用戶做的,僅僅是將這些異常中斷入口地址掛接到啟動代碼中。

       在startup.s中,使用IMPORT關鍵字聲明要掛接的異常中斷服務函數名,然後將:

                DCD SVC_Handler換成: DCD vPortSVCHandler 
                 DCD PendSV_Handler換成: DCD xPortPendSVHandler 
                 DCD SysTick_Handler換成: DCD xPortSysTickHandler

3.7 建立第一個任務Task

       在步驟3.5中,我們為了測試硬件是是否能夠工作,編寫了一個發送字符的小函數,這裡我們將把這個小函數作為我們第一個任務要執行的主要代碼:每隔1秒鐘,發送一個字符。代碼如下所示:

   1:  void vTask( void )
   2: {
   3:     
   4:      while (1)
   5:      {
   6:          MAP_UARTCharPut(0x31);
   7:          vTaskDelay(1000/portTICK_RATE_MS);
   8:      }
   9: }

3.8 設置節拍時鐘

       這裡我們使用SysTick定時器作為系統的節拍時鐘,設定每隔10ms產生一次節拍中斷。代碼如下所示:

   1: uint32_t cclk;
   2: cclk=CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU);
   3: SysTick_Config(cclk/100); //定時10ms

3.9 創建任務

       調用FreeRTOS提供的API函數來創建任務,代碼如下所示:

   1: xTaskCreate(vTask, "Task1" ,50,NULL,1,NULL);

3.10 開啟調度器

       調用FreeRTOS提供的API函數來啟動調度器,代碼如下所示:

   1: vTaskStartScheduler();

      此時的main函數代碼如下所示:

   1:  int main( void )
   2: {
   3:      //初始化系統時鐘
   4:      uint32_t cclk;
   5:      cclk=CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU);
   6:      SysTick_Config(cclk/100);                        //定時10ms
   7:      init_rtos_debug();                               //初始化調試串口
   8:     
   9:      xTaskCreate(vTask, "Task1" ,50,NULL,1,NULL);
  10:      vTaskStartScheduler();
  11:      while (1);    
  12: }

 

4. 小結

      到這裡,一個最基本的FreeRTOS應用程序就已經運行起來,將硬件板子接到PC的RS232串口,可以觀察到每隔一秒鐘,板子都會向PC發送一個指定的字符。

 

 

 

原文:http://openmcu.net/wap.asp?act=View&id=23

 

 

 

 

 

arrow
arrow
    全站熱搜

    黃彥霖 發表在 痞客邦 留言(5) 人氣()