FreeRTOS 是高度可配置的。所有的可配置項都在FreeRTOSConfig.h 文件中。每一個Demo 程序中都包含了一個配置好的FreeRTOSConfig.h 文件,可以以Demo程序中的FreeRTOSConfig.h 文件作為模板,在其基礎(chǔ)上加以修改。
下面先給出一個典型的FreeRTOSConfig.h 文件,然后再逐項加以說明。
#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的時鐘Tick時會用到。對不同的移植代碼也可能不使用這個參數(shù)。如果確定移植代碼中不用它就可以注釋掉這行。
configTICK_RATE_HZ
FreeRTOS的時鐘Tick的頻率,也就是FreeRTOS用到的定時中斷的產(chǎn)生頻率。這個頻率越高則定時的精度越高,但是由此帶來的開銷也越大。FreeRTOS 自帶的Demo 程序中將TickRate 設(shè)為了1000Hz只是用來測試內(nèi)核的性能的。實際的應(yīng)用程序應(yīng)該根據(jù)需要改為較小的數(shù)值。
當多個任務(wù)共用一個優(yōu)先級時,內(nèi)核調(diào)度器回來每次時鐘中斷到來后輪轉(zhuǎn)切換任務(wù)(round robin),因此,更高的Tick Rate 會導(dǎo)致任務(wù)的時間片“time slice”變短。
configMAX_PRIORITIES
程序中可以使用的最大優(yōu)先級。FreeRTOS 會為每個優(yōu)先級建立一個鏈表,因此沒多一個優(yōu)先級都會增加些RAM 的開銷。所以,要根據(jù)程序中需要多少種不同的優(yōu)先級來設(shè)置這個參數(shù)。
configMINIMAL_STACK_SIZE
任務(wù)堆棧的最小大小,F(xiàn)reeRTOS根據(jù)這個參數(shù)來給idle task 分配堆棧空間。這個值如果設(shè)置的比實際需要的空間小,會導(dǎo)致程序掛掉。因此,最好不要減小Demo 程序中給出的大小。
configTOTAL_HEAP_SIZE
設(shè)置堆空間(Heap)的大小。只有當程序中采用FreeRTOS 提供的內(nèi)存分配算法時才會用到。
configMAX_TASK_NAME_LEN
任務(wù)名稱最大的長度,這個長度是以字節(jié)為單位的,并且包括最后的 NULL 結(jié)束字節(jié)。
configUSE_TRACE_FACILITY
如果程序中需要用到TRACE功能,則需將這個宏設(shè)為1。否則設(shè)為0。開啟TRACE功能后,RAM占用量會增大許多,因此在設(shè)為1之前請三思。
configUSE_16_BIT_TICKS
將 configUSE_16_BIT_TICKS設(shè)為 1后portTickType 將被定義為無符號的16位整形類型,configUSE_16_BIT_TICKS 設(shè)為0 后portTickType 則被定義為無符號的32位整型。
configIDLE_SHOULD_YIELD
這個參數(shù)控制那些優(yōu)先級與idle 任務(wù)相同的任務(wù)的行為,并且只有當內(nèi)核被配置為搶占式任務(wù)調(diào)度時才有實際作用。
內(nèi)核對具有同樣優(yōu)先級的任務(wù)會采用時間片輪轉(zhuǎn)調(diào)度算法。當任務(wù)的優(yōu)先級高于idle任務(wù)時,各個任務(wù)分到的時間片是同樣大小的。
評論