但當(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)論