URL: http://blog.csdn.net/liyuanbhu/article/details/7912170
配置FreeRTOS
FreeRTOS 是高度可配置的。所有的可配置項都在FreeRTOSConfig.h 文件中。每一個Demo 程序中都包含了一個配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作爲模板,在其基礎上加以修改。
下面先給出一個典型的FreeRTOSConfig.h 文件,然後再逐項加以說明。
- #ifndef FREERTOS_CONFIG_H
- #define FREERTOS_CONFIG_H
- /* Here is a good place to include header files that are required across
- your application. */
- #include "something.h"
- #define configUSE_PREEMPTION 1
- #define configUSE_IDLE_HOOK 0
- #define configUSE_TICK_HOOK 0
- #define configCPU_CLOCK_HZ 58982400
- #define configTICK_RATE_HZ 250
- #define configMAX_PRIORITIES 5
- #define configMINIMAL_STACK_SIZE 128
- #define configTOTAL_HEAP_SIZE 10240
- #define configMAX_TASK_NAME_LEN 16
- #define configUSE_TRACE_FACILITY 0
- #define configUSE_16_BIT_TICKS 0
- #define configIDLE_SHOULD_YIELD 1
- #define configUSE_MUTEXES 0
- #define configUSE_RECURSIVE_MUTEXES 0
- #define configUSE_COUNTING_SEMAPHORES 0
- #define configUSE_ALTERNATIVE_API 0
- #define configCHECK_FOR_STACK_OVERFLOW 0
- #define configQUEUE_REGISTRY_SIZE 10
- #define configGENERATE_RUN_TIME_STATS 0
- #define configUSE_CO_ROUTINES 0
- #define configMAX_CO_ROUTINE_PRIORITIES 1
- #define configUSE_TIMERS 1
- #define configTIMER_TASK_PRIORITY 3
- #define configTIMER_QUEUE_LENGTH 10
- #define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
- #define configKERNEL_INTERRUPT_PRIORITY [dependent of processor]
- #define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application]
- #define configASSERT( ( x ) ) if( ( x ) == 0 ) vCallAssert( __FILE__, __LINE__ )
- #define INCLUDE_vTaskPrioritySet 1
- #define INCLUDE_uxTaskPriorityGet 1
- #define INCLUDE_vTaskDelete 1
- #define INCLUDE_vTaskSuspend 1
- #define INCLUDE_xResumeFromISR 1
- #define INCLUDE_vTaskDelayUntil 1
- #define INCLUDE_vTaskDelay 1
- #define INCLUDE_xTaskGetSchedulerState 1
- #define INCLUDE_xTaskGetCurrentTaskHandle 1
- #define INCLUDE_uxTaskGetStackHighWaterMark 0
- #define INCLUDE_xTaskGetIdleTaskHandle 0
- #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
- #define INCLUDE_pcTaskGetTaskName 0
- #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