轉載:FreeRTOS 配置文件詳細功能解釋
原文鏈接:http://blog.sina.com.cn/s/blog_98ee3a930102wf8c.html
本章節為大家講解FreeRTOS的配置文件FreeRTOSConfig.h中每個選項的作用。初學的話,一定要有個了解,隨著以後的學習一定要熟練操作每個配置選項。
本章節內容主要整理自官網:http://www.freertos.org/a00110.html
7.1 配置選項說明
7.2 基本配置
7.3 鉤子函數配置
7.4 任務運行信息獲取配置
7.5 合作式任務配置
7.6 軟件定時器配置
7.7 內核配置
7.8 斷言配置
7.9 函數Include配置
7.10 總結
7.1 配置選項說明
對於初學者來說,要在以後的時間裏達到熟練操作FreeRTOS的配置選項。大部分的選項在FreeRTOS.h文件裏面都有默認的配置。用戶在使用時,把用到配置選項放在FreeRTOSConfig.h文件配置即可。
7.2 基本配置
基本配置是FreeRTOS中經常用到的配置,下面分別進行介紹,這裏有個感性認識即可,隨著後面的使用中會熟練起來。
7.2.1 configUSE_PREEMPTION
u 配置為1
使能搶占式調度器。
u 配置為0
使能合作式調度器。
7.2.2 configUSE_PORT_OPTIMISED_TASK_SELECTION
此配置用於優化優先級列表中要執行的最高優先級任務的算法。對CM內核的移植文件,默認已經在文件portmacro.h文件中使能。
u 通用方式---配置為0:
l 所有平臺的移植文件都可以配置為0,因為這是通用方式。
l 純C編寫,比專用方式效率低。
l 可用的優先級數量不限制。
u 專用方式---配置為1:
l 部分平臺支持。
l 這些平臺架構有專用的匯編指令,比如CLZ(Count Leading Zeros)指令,通過這些指令可以加快算法執行速度。
l 比通用方式高效。
l 有最大優先級數限制,通常限制為32個。
7.2.3 configUSE_TICKLESS_IDLE
此配置用於使能tickless低功耗模式
u 配置為1
使能tickless低功耗模式
u 配置為0
禁能tickless低功耗模式
7.2.4 configCPU_CLOCK_HZ
此參數用於定義CPU的主頻,單位Hz。
7.2.5 configTICK_RATE_HZ
此參數用於定義系統時鐘節拍數,單位Hz,一般取1000Hz即可。本教程配套的例子也全部采用這個時鐘節拍數。過高的的系統時鐘節拍將使得FreeRTOS內核運行占用過多的時間,增加系統負荷。
7.2.6 configMAX_PRIORITIES
此參數用於定義可供用戶使用的最大優先級數,如果這個定義的是5,那麽用戶可以使用的優先級號是0,1,2,3,4,不包含5,對於這一點,初學者要特別的註意。
7.2.7 configMINIMAL_STACK_SIZE
此參數用於定義空閑任務的棧空間大小,單位字,即4字節。
7.2.8 configTOTAL_HEAP_SIZE
定義堆大小,FreeRTOS內核,用戶動態內存申請,任務棧,任務創建,信號量創建,消息隊列創建等都需要用這個空間。
7.2.9 configMAX_TASK_NAME_LEN
定義任務名最大的字符數,末尾的結束符 ‘\0‘也要計算在內。
7.2.10configUSE_16_BIT_TICKS
系統時鐘節拍計數使用TickType_t數據類型定義的。
如果用戶使能了宏定義 configUSE_16_BIT_TICKS,那麽TickType_t定義的就是16位無符號數,如果沒有使能,那麽TickType_t定義的就是32位無符號數。對於32位架構的處理器,一定要禁止此宏定義,即設置此宏定義數值為0即可。而16位無符號數類型主要用於8位和16位架構的處理器。
7.2.11configIDLE_SHOULD_YIELD
此參數用於使能與空閑任務同優先級的任務,只有滿足以下兩個條件時,此參數才有效果:
1. 使能搶占式調度器。
2. 有創建與空閑任務同優先級的任務。
配置為1,就可以使能此特性了,實際應用中不建議用戶使用此功能,將其配置為0即可。
7.2.12configUSE_TASK_NOTIFICATIONS
u 配置為1
使能任務間直接的消息傳遞,包含信號量,事件標誌組和消息郵箱。
u 配置為0
禁能此特性。
7.2.13configUSE_MUTEXES
u 配置為1
使能互斥信號量
u 配置為0
禁能互斥信號量
7.2.14configUSE_RECURSIVE_MUTEXES
u 配置為1
使能遞歸互斥信號量
u 配置為0
禁能遞歸互斥信號量
7.2.15configUSE_COUNTING_SEMAPHORES
u 配置為1
使能計數信號量
u 配置為0
禁能計數信號量
7.2.16configUSE_ALTERNATIVE_API
此配置將在以後的版本中被刪除,建議用戶不要再使用。
7.2.17configQUEUE_REGISTRY_SIZE
通過此定義來設置可以註冊的信號量和消息隊列個數。
隊列註冊有兩個目的,這兩個目的都與內核調試有關:
u 註冊隊列的時候,可以給隊列起一個名字,當使用調試組件的時候,通過名字可以很容易的區分不同隊列。
u 通過隊列的相關信息,調試器可以很容易定位隊列和信號量,能夠定位信號量是因為FreeRTOS信號量也是基於隊列實現的。
當然,如果用戶沒有使用內核方面的調試器,這個宏定義是沒有意義的。
7.2.18configUSE_QUEUE_SETS
u 配置為1
使能消息隊列。
u 配置為0
禁能消息隊列。
7.2.19configUSE_TIME_SLICING
u 配置為1
使能時間片調度。
u 配置為0
禁能時間片調度。
u 用戶沒有配置此選項
如果用戶沒有配置此選項,默認在FreeRTOS.h文件中已經配置為1,即使能時間片調度。
7.2.20configUSE_NEWLIB_REENTRANT
u 配置為1
每個任務創建的時候將分配Newlib的重入結構體。
u 配置為0
禁止此特性。
7.2.21configENABLE_BACKWARD_COMPATIBILITY
u 配置為1
使能新版本對老版本的兼容特性,即向後兼容或者說向下兼容。
u 配置為0
禁止此特性。
7.2.22configNUM_THREAD_LOCAL_STORAGE_POINTERS
此配置用於定義線程局部指針變量的個數。
7.3 鉤子函數配置
鉤子函數的主要功能是用於函數的擴展,用戶可以根據自己的需要往裏面添加相關的測試函數。
7.3.1 configUSE_IDLE_HOOK
u 配置為1
使能空閑任務的鉤子函數
u 配置為0
禁能空閑任務鉤子函數
7.3.2 configUSE_MALLOC_FAILED_HOOK
當創建任務,信號量或者消息隊列時,FreeRTOS通過函數pvPortMalloc()申請動態內存。
u 配置為1
使能動態內存申請失敗時的鉤子函數
u 配置為0
禁能動態內存申請失敗時的鉤子函數
7.3.3 configUSE_TICK_HOOK
u 配置為1
使能滴答定時器中斷裏面執行的鉤子函數
u 配置為0
禁能滴答定時器中斷裏面執行的鉤子函數
7.3.4 configCHECK_FOR_STACK_OVERFLOW
FreeRTOS的棧溢出檢測支持兩種方法,為了方便描述,我們這裏將其稱之為方法一和方法二。
u 配置為2
棧溢出檢測使用方法二。
u 配置為1
棧溢出檢測使用方法一。
u 配置為0
禁止棧溢出檢測。
7.4 任務運行信息獲取配置
7.4.1 configGENERATE_RUN_TIME_STATS
u 配置為1
使能任務運行狀態參數統計。
u 配置為0
禁止此特性。
7.4.2 configUSE_TRACE_FACILITY
u 配置為1
使能此配置將添加額外的結構體成員和函數,以此來協助可視化和跟蹤,在使用IAR中的FreeRTOS插件時要使能這個配置,否則無法顯示任務棧的使用情況。
u 配置為0
禁能此特性。
7.4.3 configUSE_STATS_FORMATTING_FUNCTIONS
用戶配置宏定義configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS都為1的時候,將使能函數vTaskList() 和 vTaskGetRunTimeStats(),如果兩者中任何一個為0,那麽這兩個函數都將被禁能。
7.5 合作式任務配置
7.5.1 configUSE_CO_ROUTINES
u 配置為1
使能合作式調度相關函數。
u 配置為0
禁能合作式調度相關函數。
7.5.2 configMAX_CO_ROUTINE_PRIORITIES
此參數用於定義可供用戶使用的最大的合作式任務優先級數,如果這個定義的是5,那麽用戶可以使用的優先級號是0,1,2,3,4,不包含5,對於這一點,初學者要特別的註意。
7.6 軟件定時器配置
7.6.1 configUSE_TIMERS
u 配置為1
使能軟件定時器。
u 配置為0
禁能軟件定時器。
7.6.2 configTIMER_TASK_PRIORITY
配置軟件定時器任務的優先級。
7.6.3 configTIMER_QUEUE_LENGTH
配置軟件定時器命令隊列的長度。
7.6.4 configTIMER_TASK_STACK_DEPTH
配置軟件定時器任務的棧空間大小。
7.7 內核配置
內核配置相關的幾個宏定義參看第12章的12.3小節,這幾個配置稍復雜些,專門放在了12.3小節進行詳細說明。
7.8 斷言配置
FreeRTOS中的斷言函數configASSERT()和標準C中的斷言函數assert()是一樣的,如果斷言函數的參數為0時將觸發斷言函數的執行。
FreeRTOS的斷言功能在調試階段是非常有用的,可以有效地檢查參數錯誤和運行中的錯誤,但在正式發布軟件時,請將此功能關閉,因為斷言功能會增加工程代碼大小並降低工程執行效率。關閉斷言也比較簡單,如果FreeRTOSConfig.h文件中有斷言的宏定義,將其註釋掉即可,如果沒有宏定義,默認在FreeRTOS.h文件中就是關閉的。
教程配套的例子統一采用如下的斷言方法:
#define configASSERT( ( x ) ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
在使用調試器的情況下,一旦出現斷言失敗,會關閉中斷,程序會死在這個for循環中,此時用戶可以很容易就鎖定函數出錯位置。
當然,采用下面這種方法也是可以的:
#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )
其中關鍵字 __LINE__ 表示源代碼行號,關鍵字__FILE__表示源代碼文件名。用戶可以自行測試下這個函數vAssertCalled,在這個函數裏面調用一下串口打印之類的功能,將出現錯誤的源文件和代碼行號打印出來。這種方法也可以很方便的鎖定出錯的位置。
調試階段出現斷言失敗的情況下,不限制以上兩種處理方法,用戶采用適合自己的方法即可。
7.9 函數Include配置
函數Include配置主要是指用戶可以根據需要使能或者禁止在工程中使用相應的函數,配置為1,表示使能,即可以在工程中使用相應函數。配置為0,表示禁止,即禁止在工程中使用相應函數。可以這樣設置的函數主要有如下幾種:
#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
#define INCLUDE_eTaskGetState 0
#define INCLUDE_xEventGroupSetBitFromISR 1
#define INCLUDE_xTimerPendFunctionCall 0
對於配置1,但用戶在工程中沒有用到的函數,編譯器一般都會把這些冗余函數刪掉,不會添加到最終的hex文件中。
7.10總結
本章節僅是對每個配置選項進行介紹,等有了幾次工程的配置經驗後基本就熟練了。
轉載:FreeRTOS 配置文件詳細功能解釋