可配置的參數
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()後會增加程序代碼,也會使程序變慢。
以INCLUDE 開頭參數
以 'INCLUDE' 開頭的宏允許我們將部分不需要的API 函數排除在編譯生成的代碼之外。這可以使內核代碼佔用更少的ROM 和RAM。
比如,如果代碼中需要用到 vTaskDelete 函數則這樣寫:
#defineINCLUDE_vTaskDelete 1
如果不需要,則這樣寫:
#defineINCLUDE_vTaskDelete 0