配置 FreeRTOS

URL: http://blog.csdn.net/liyuanbhu/article/details/7912170

配置FreeRTOS

FreeRTOS 是高度可配置的。所有的可配置項都在FreeRTOSConfig.h 文件中。每一個Demo 程序中都包含了一個配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作爲模板,在其基礎上加以修改。

下面先給出一個典型的FreeRTOSConfig.h 文件,然後再逐項加以說明。

  1. #ifndef FREERTOS_CONFIG_H  
  2. #define FREERTOS_CONFIG_H  
  3.   
  4. /* Here is a good place to include header files that are required across  
  5. your application. */  
  6. #include "something.h"  
  7.   
  8. #define configUSE_PREEMPTION                1  
  9. #define configUSE_IDLE_HOOK                 0  
  10. #define configUSE_TICK_HOOK                 0  
  11. #define configCPU_CLOCK_HZ                  58982400  
  12. #define configTICK_RATE_HZ                  250  
  13. #define configMAX_PRIORITIES                5  
  14. #define configMINIMAL_STACK_SIZE            128  
  15. #define configTOTAL_HEAP_SIZE               10240  
  16. #define configMAX_TASK_NAME_LEN             16  
  17. #define configUSE_TRACE_FACILITY            0  
  18. #define configUSE_16_BIT_TICKS              0  
  19. #define configIDLE_SHOULD_YIELD             1  
  20. #define configUSE_MUTEXES                   0  
  21. #define configUSE_RECURSIVE_MUTEXES         0  
  22. #define configUSE_COUNTING_SEMAPHORES       0  
  23. #define configUSE_ALTERNATIVE_API           0  
  24. #define configCHECK_FOR_STACK_OVERFLOW      0  
  25. #define configQUEUE_REGISTRY_SIZE           10  
  26. #define configGENERATE_RUN_TIME_STATS       0  
  27.   
  28. #define configUSE_CO_ROUTINES               0   
  29. #define configMAX_CO_ROUTINE_PRIORITIES     1  
  30.   
  31. #define configUSE_TIMERS                    1  
  32. #define configTIMER_TASK_PRIORITY           3  
  33. #define configTIMER_QUEUE_LENGTH            10  
  34. #define configTIMER_TASK_STACK_DEPTH        configMINIMAL_STACK_SIZE  
  35.   
  36. #define configKERNEL_INTERRUPT_PRIORITY         [dependent of processor]  
  37. #define configMAX_SYSCALL_INTERRUPT_PRIORITY    [dependent on processor and application]  
  38.   
  39. #define configASSERT( ( x ) )               if( ( x ) == 0 ) vCallAssert( __FILE__, __LINE__ )  
  40.   
  41. #define INCLUDE_vTaskPrioritySet                1  
  42. #define INCLUDE_uxTaskPriorityGet               1  
  43. #define INCLUDE_vTaskDelete                     1  
  44. #define INCLUDE_vTaskSuspend                    1  
  45. #define INCLUDE_xResumeFromISR                  1  
  46. #define INCLUDE_vTaskDelayUntil                 1  
  47. #define INCLUDE_vTaskDelay                      1  
  48. #define INCLUDE_xTaskGetSchedulerState          1  
  49. #define INCLUDE_xTaskGetCurrentTaskHandle       1  
  50. #define INCLUDE_uxTaskGetStackHighWaterMark     0  
  51. #define INCLUDE_xTaskGetIdleTaskHandle          0  
  52. #define INCLUDE_xTimerGetTimerDaemonTaskHandle  0  
  53. #define INCLUDE_pcTaskGetTaskName               0  
  54.   
  55. #endif /* FREERTOS_CONFIG_H */  


可配置的參數

configUSE_PREEMPTION

設爲 1則採用搶佔式調度器, 設爲 0則採用協作式調度器。

configUSE_IDLE_HOOK

設爲1則使能 idle hook,設爲0則禁止idle hook。

configUSE_TICK_HOOK

設爲1則使能 tick hook,設爲0則禁止tick hook。

configCPU_CLOCK_HZ

設置爲 MCU 內核的工作頻率,以Hz爲單位。配置FreeRTOS的時鐘Tick時會用到。對不同的移植代碼也可能不使用這個參數。如果確定移植代碼中不用它就可以註釋掉這行。

configTICK_RATE_HZ

FreeRTOS的時鐘Tick的頻率,也就是FreeRTOS用到的定時中斷的產生頻率。這個頻率越高則定時的精度越高,但是由此帶來的開銷也越大。FreeRTOS 自帶的Demo 程序中將TickRate 設爲了1000Hz只是用來測試內核的性能的。實際的應用程序應該根據需要改爲較小的數值。

當多個任務共用一個優先級時,內核調度器回來每次時鐘中斷到來後輪轉切換任務(round robin),因此,更高的Tick Rate 會導致任務的時間片“time slice”變短。

configMAX_PRIORITIES

程序中可以使用的最大優先級。FreeRTOS 會爲每個優先級建立一個鏈表,因此沒多一個優先級都會增加些RAM 的開銷。所以,要根據程序中需要多少種不同的優先級來設置這個參數。

configMINIMAL_STACK_SIZE

任務堆棧的最小大小,FreeRTOS根據這個參數來給idle task 分配堆棧空間。這個值如果設置的比實際需要的空間小,會導致程序掛掉。因此,最好不要減小Demo 程序中給出的大小。

configTOTAL_HEAP_SIZE

設置堆空間(Heap)的大小。只有當程序中採用FreeRTOS 提供的內存分配算法時纔會用到。

configMAX_TASK_NAME_LEN

任務名稱最大的長度,這個長度是以字節爲單位的,並且包括最後的 NULL 結束字節。

configUSE_TRACE_FACILITY

如果程序中需要用到TRACE功能,則需將這個宏設爲1。否則設爲0。開啓TRACE功能後,RAM佔用量會增大許多,因此在設爲1之前請三思。

configUSE_16_BIT_TICKS

將 configUSE_16_BIT_TICKS設爲 1後portTickType 將被定義爲無符號的16位整形類型,configUSE_16_BIT_TICKS 設爲0 後portTickType 則被定義爲無符號的32位整型。

configIDLE_SHOULD_YIELD

這個參數控制那些優先級與idle 任務相同的任務的行爲,並且只有當內核被配置爲搶佔式任務調度時纔有實際作用。

內核對具有同樣優先級的任務會採用時間片輪轉調度算法。當任務的優先級高於idle任務時,各個任務分到的時間片是同樣大小的。

但當任務的優先級與idle任務相同時情況就有些不同了。當configIDLE_SHOULD_YIELD 被配置爲1時,當任何優先級與idle 任務相同的任務處於就緒態時,idle任務會立刻要求調度器進行任務切換。這會使idle任務佔用最少的CPU時間,但同時會使得優先級與idle 任務相同的任務獲得的時間片不是同樣大小的。因爲idle任務會佔用某個任務的部分時間片。

configUSE_MUTEXES

設爲 1 則程序中會包含mutex 相關的代碼,設爲 0 則忽略相關的代碼。

configUSE_RECURSIVE_MUTEXES

設爲 1 則程序中會包含recursive mutex 相關的代碼,設爲 0 則忽略相關的代碼。

configUSE_COUNTING_SEMAPHORES

設爲 1 則程序中會包含semaphore 相關的代碼,設爲 0 則忽略相關的代碼。

configUSE_ALTERNATIVE_API

設爲 1 則程序中會包含一些關於隊列操作的額外API函數,設爲 0 則忽略相關的代碼。這些額外提供的API運行速度更快,但是臨界區(關中斷)的長度也更長。有利也有弊,是否要採用需要用戶自己考慮了。

configCHECK_FOR_STACK_OVERFLOW

控制是否檢測堆棧溢出。

configQUEUE_REGISTRY_SIZE

隊列註冊表有兩個作用,但是這兩個作用都依賴於調試器的支持:

1.        給隊列一個名字,方便調試時辨認是哪個隊列。

2.        包含調試器需要的特定信息用來定位隊列和信號量。

如果你的調試器沒有上述功能,哪個這個註冊表就毫無用處,還佔用的寶貴的RAM空間。

configGENERATE_RUN_TIME_STATS

設置是否產生運行時的統計信息,這些信息只對調試有用,會保存在RAM 中,佔用RAM空間。因此,最終程序建議配置成不產生運行時統計信息。

configUSE_CO_ROUTINES

設置爲1則包含co-routines 功能,如果包含了co-routines功能,則編譯時需包含croutine.c 文件

configMAX_CO_ROUTINE_PRIORITIES

co-routines 可以使用的優先級的數量。

configUSE_TIMERS

設置爲1則包含軟件定時器功能。

configTIMER_TASK_PRIORITY

設置軟件定時器任務的優先級。

configTIMER_QUEUE_LENGTH

設置軟件定時器任務中用到的命令隊列的長度。

configTIMER_TASK_STACK_DEPTH

設置軟件定時器任務需要的任務堆棧大小。

configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY

Cortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代碼中會使用到 configKERNEL_INTERRUPT_PRIORITY.

PIC32, RX600 和 Cortex-M系列 會使用到 configMAX_SYSCALL_INTERRUPT_PRIORITY

configKERNEL_INTERRUPT_PRIORITY應該被設爲最低優先級。


對那些只定義了 configKERNEL_INTERRUPT_PRIORITY 的系統:

configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內核使用的優先級。

所有調用API函數的中斷的優先級都應設爲這個值,不調用API函數的中斷可以設爲更高的優先級。


對那些定義了configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY的系統:

configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內核使用的優先級。

configMAX_SYSCALL_INTERRUPT_PRIORITY決定了可以調用API函數的中斷的最高優先級。高於這個值的中斷處理函數不能調用任何API 函數。

configASSERT

宏configASSERT()的作用類似C語言標準庫中的宏assert(),configASSERT() 可以幫助調試,但是定義了configASSERT()後會增加程序代碼,也會使程序變慢。 

/*   configASSERT 斷言,調試時可以檢查傳入的參數是否合法。FreeRTOS內核代碼的關鍵點都會調用  configASSERT( x )函數,如果參數x爲0,則會拋出一個錯誤。這個錯誤很可能是傳遞給  FreeRTOS API函數的無效參數引起的。定義configASSERT()有助於調試時發現錯誤,但是,定義configASSERT()也會增大應用程序代碼量,增大運行時間。 configASSERT()等同於標準C庫中的assert()宏。不使用標準C庫中的assert()宏是因爲不是所有的編譯器都能夠編譯FreeRTOS提供的assert.h頭文件。#define configASSERT( x ) 在7.30版本 估計是不用了 */

以INCLUDE 開頭參數

以 'INCLUDE' 開頭的宏允許我們將部分不需要的API 函數排除在編譯生成的代碼之外。這可以使內核代碼佔用更少的ROM 和RAM。

比如,如果代碼中需要用到 vTaskDelete 函數則這樣寫:

#defineINCLUDE_vTaskDelete    1

如果不需要,則這樣寫:

#defineINCLUDE_vTaskDelete    0


發佈了11 篇原創文章 · 獲贊 37 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章