FreeRTOS 是高度可配置的。所有的可配置項(xiàng)都在FreeRTOSConfig.h 文件中。每一個(gè)Demo 程序中都包含了一個(gè)配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作為模板,在其基礎(chǔ)上加以修改。
下面先給出一個(gè)典型的FreeRTOSConfig.h 文件,然后再逐項(xiàng)加以說(shuō)明。
#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 */
可配置的參數(shù)
configUSE_PREEMPTION
設(shè)為 1則采用搶占式調(diào)度器, 設(shè)為 0則采用協(xié)作式調(diào)度器。
configUSE_IDLE_HOOK
設(shè)為1則使能 idle hook,設(shè)為0則禁止idle hook。
configUSE_TICK_HOOK
設(shè)為1則使能 tick hook,設(shè)為0則禁止tick hook。
configCPU_CLOCK_HZ
設(shè)置為 MCU 內(nèi)核的工作頻率,以Hz為單位。配置FreeRTOS的時(shí)鐘Tick時(shí)會(huì)用到。對(duì)不同的移植代碼也可能不使用這個(gè)參數(shù)。如果確定移植代碼中不用它就可以注釋掉這行。
configTICK_RATE_HZ
FreeRTOS的時(shí)鐘Tick的頻率,也就是FreeRTOS用到的定時(shí)中斷的產(chǎn)生頻率。這個(gè)頻率越高則定時(shí)的精度越高,但是由此帶來(lái)的開(kāi)銷也越大。FreeRTOS 自帶的Demo 程序中將TickRate 設(shè)為了1000Hz只是用來(lái)測(cè)試內(nèi)核的性能的。實(shí)際的應(yīng)用程序應(yīng)該根據(jù)需要改為較小的數(shù)值。
當(dāng)多個(gè)任務(wù)共用一個(gè)優(yōu)先級(jí)時(shí),內(nèi)核調(diào)度器回來(lái)每次時(shí)鐘中斷到來(lái)后輪轉(zhuǎn)切換任務(wù)(round robin),因此,更高的Tick Rate 會(huì)導(dǎo)致任務(wù)的時(shí)間片“time slice”變短。
configMAX_PRIORITIES
程序中可以使用的最大優(yōu)先級(jí)。FreeRTOS 會(huì)為每個(gè)優(yōu)先級(jí)建立一個(gè)鏈表,因此沒(méi)多一個(gè)優(yōu)先級(jí)都會(huì)增加些RAM 的開(kāi)銷。所以,要根據(jù)程序中需要多少種不同的優(yōu)先級(jí)來(lái)設(shè)置這個(gè)參數(shù)。
configMINIMAL_STACK_SIZE
任務(wù)堆棧的最小大小,F(xiàn)reeRTOS根據(jù)這個(gè)參數(shù)來(lái)給idle task 分配堆??臻g。這個(gè)值如果設(shè)置的比實(shí)際需要的空間小,會(huì)導(dǎo)致程序掛掉。因此,最好不要減小Demo 程序中給出的大小。
configTOTAL_HEAP_SIZE
設(shè)置堆空間(Heap)的大小。只有當(dāng)程序中采用FreeRTOS 提供的內(nèi)存分配算法時(shí)才會(huì)用到。
configMAX_TASK_NAME_LEN
任務(wù)名稱最大的長(zhǎng)度,這個(gè)長(zhǎng)度是以字節(jié)為單位的,并且包括最后的 NULL 結(jié)束字節(jié)。
configUSE_TRACE_FACILITY
如果程序中需要用到TRACE功能,則需將這個(gè)宏設(shè)為1。否則設(shè)為0。開(kāi)啟TRACE功能后,RAM占用量會(huì)增大許多,因此在設(shè)為1之前請(qǐng)三思。
configUSE_16_BIT_TICKS
將 configUSE_16_BIT_TICKS設(shè)為 1后portTickType 將被定義為無(wú)符號(hào)的16位整形類型,configUSE_16_BIT_TICKS 設(shè)為0 后portTickType 則被定義為無(wú)符號(hào)的32位整型。
configIDLE_SHOULD_YIELD
這個(gè)參數(shù)控制那些優(yōu)先級(jí)與idle 任務(wù)相同的任務(wù)的行為,并且只有當(dāng)內(nèi)核被配置為搶占式任務(wù)調(diào)度時(shí)才有實(shí)際作用。
內(nèi)核對(duì)具有同樣優(yōu)先級(jí)的任務(wù)會(huì)采用時(shí)間片輪轉(zhuǎn)調(diào)度算法。當(dāng)任務(wù)的優(yōu)先級(jí)高于idle任務(wù)時(shí),各個(gè)任務(wù)分到的時(shí)間片是同樣大小的。
但當(dāng)任務(wù)的優(yōu)先級(jí)與idle任務(wù)相同時(shí)情況就有些不同了。當(dāng)configIDLE_SHOULD_YIELD 被配置為1時(shí),當(dāng)任何優(yōu)先級(jí)與idle 任務(wù)相同的任務(wù)處于就緒態(tài)時(shí),idle任務(wù)會(huì)立刻要求調(diào)度器進(jìn)行任務(wù)切換。這會(huì)使idle任務(wù)占用最少的CPU時(shí)間,但同時(shí)會(huì)使得優(yōu)先級(jí)與idle 任務(wù)相同的任務(wù)獲得的時(shí)間片不是同樣大小的。因?yàn)閕dle任務(wù)會(huì)占用某個(gè)任務(wù)的部分時(shí)間片。
configUSE_MUTEXES
設(shè)為 1 則程序中會(huì)包含mutex 相關(guān)的代碼,設(shè)為 0 則忽略相關(guān)的代碼。
configUSE_RECURSIVE_MUTEXES
設(shè)為 1 則程序中會(huì)包含recursive mutex 相關(guān)的代碼,設(shè)為 0 則忽略相關(guān)的代碼。
configUSE_COUNTING_SEMAPHORES
設(shè)為 1 則程序中會(huì)包含semaphore 相關(guān)的代碼,設(shè)為 0 則忽略相關(guān)的代碼。
configUSE_ALTERNATIVE_API
設(shè)為 1 則程序中會(huì)包含一些關(guān)于隊(duì)列操作的額外API函數(shù),設(shè)為 0 則忽略相關(guān)的代碼。這些額外提供的API運(yùn)行速度更快,但是臨界區(qū)(關(guān)中斷)的長(zhǎng)度也更長(zhǎng)。有利也有弊,是否要采用需要用戶自己考慮了。
configCHECK_FOR_STACK_OVERFLOW
控制是否檢測(cè)堆棧溢出。
configQUEUE_REGISTRY_SIZE
隊(duì)列注冊(cè)表有兩個(gè)作用,但是這兩個(gè)作用都依賴于調(diào)試器的支持:
1. 給隊(duì)列一個(gè)名字,方便調(diào)試時(shí)辨認(rèn)是哪個(gè)隊(duì)列。
2. 包含調(diào)試器需要的特定信息用來(lái)定位隊(duì)列和信號(hào)量。
如果你的調(diào)試器沒(méi)有上述功能,哪個(gè)這個(gè)注冊(cè)表就毫無(wú)用處,還占用的寶貴的RAM空間。
configGENERATE_RUN_TIME_STATS
設(shè)置是否產(chǎn)生運(yùn)行時(shí)的統(tǒng)計(jì)信息,這些信息只對(duì)調(diào)試有用,會(huì)保存在RAM 中,占用RAM空間。因此,最終程序建議配置成不產(chǎn)生運(yùn)行時(shí)統(tǒng)計(jì)信息。
configUSE_CO_ROUTINES
設(shè)置為1則包含co-routines 功能,如果包含了co-routines功能,則編譯時(shí)需包含croutine.c 文件
configMAX_CO_ROUTINE_PRIORITIES
co-routines 可以使用的優(yōu)先級(jí)的數(shù)量。
configUSE_TIMERS
設(shè)置為1則包含軟件定時(shí)器功能。
configTIMER_TASK_PRIORITY
設(shè)置軟件定時(shí)器任務(wù)的優(yōu)先級(jí)。
configTIMER_QUEUE_LENGTH
設(shè)置軟件定時(shí)器任務(wù)中用到的命令隊(duì)列的長(zhǎng)度。
configTIMER_TASK_STACK_DEPTH
設(shè)置軟件定時(shí)器任務(wù)需要的任務(wù)堆棧大小。
configKERNEL_INTERRUPT_PRIORITY 和 configMAX_SYSCALL_INTERRUPT_PRIORITY
Cortex-M3, PIC24, dsPIC, PIC32, SuperH 和 RX600 的移植代碼中會(huì)使用到 configKERNEL_INTERRUPT_PRIORITY.
PIC32, RX600 和 Cortex-M系列 會(huì)使用到 configMAX_SYSCALL_INTERRUPT_PRIORITY
configKERNEL_INTERRUPT_PRIORITY應(yīng)該被設(shè)為最低優(yōu)先級(jí)。
對(duì)那些只定義了 configKERNEL_INTERRUPT_PRIORITY 的系統(tǒng):
configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內(nèi)核使用的優(yōu)先級(jí)。
所有調(diào)用API函數(shù)的中斷的優(yōu)先級(jí)都應(yīng)設(shè)為這個(gè)值,不調(diào)用API函數(shù)的中斷可以設(shè)為更高的優(yōu)先級(jí)。
對(duì)那些定義了configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY的系統(tǒng):
configKERNEL_INTERRUPT_PRIORITY決定了FreeRTOS內(nèi)核使用的優(yōu)先級(jí)。
configMAX_SYSCALL_INTERRUPT_PRIORITY決定了可以調(diào)用API函數(shù)的中斷的最高優(yōu)先級(jí)。高于這個(gè)值的中斷處理函數(shù)不能調(diào)用任何API 函數(shù)。
configASSERT
宏configASSERT()的作用類似C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的宏assert(),configASSERT() 可以幫助調(diào)試,但是定義了configASSERT()后會(huì)增加程序代碼,也會(huì)使程序變慢。
以INCLUDE 開(kāi)頭參數(shù)
以 'INCLUDE' 開(kāi)頭的宏允許我們將部分不需要的API 函數(shù)排除在編譯生成的代碼之外。這可以使內(nèi)核代碼占用更少的ROM 和RAM。
比如,如果代碼中需要用到 vTaskDelete 函數(shù)則這樣寫(xiě):
#defineINCLUDE_vTaskDelete 1
如果不需要,則這樣寫(xiě):
#defineINCLUDE_vTaskDelete 0
評(píng)論
查看更多