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. 給隊列一個名字,方便調試時辨認是哪個隊列。
如果你的調試器沒有上述功能,哪個這個注冊表就毫無用處,還占用的寶貴的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()后會增加程序代碼,也會使程序變慢。
以INCLUDE 開頭參數
以 'INCLUDE' 開頭的宏允許我們將部分不需要的API 函數排除在編譯生成的代碼之外。這可以使內核代碼占用更少的ROM 和RAM。
比如,如果代碼中需要用到 vTaskDelete 函數則這樣寫:
#defineINCLUDE_vTaskDelete 1
如果不需要,則這樣寫:
#defineINCLUDE_vTaskDelete 0
評論