配置FreeRTOS

可配置的參數

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

發佈了2 篇原創文章 · 獲贊 25 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章