自娱自乐的FreeRTOS——config.h配置文件详解
基礎(chǔ)配置項(xiàng)
1、為什么使用config.h?
此頁(yè)面所有的宏定義是用來(lái)配置系統(tǒng)所需要的功能,使用條件編譯的方式減少系統(tǒng)占用的ROM和RAM大小,降低系統(tǒng)消耗。
2、#define configUSE_PREEMPTION
為1時(shí)使用搶占式內(nèi)核,0使用協(xié)程。
(搶占式內(nèi)核是指準(zhǔn)備運(yùn)行的最高優(yōu)先級(jí)任務(wù)始終被賦予 CPU 控制權(quán),當(dāng)一個(gè)任務(wù)使更高優(yōu)先級(jí)的任務(wù)準(zhǔn)備好運(yùn)行時(shí),當(dāng)前任務(wù)被搶占(掛起)并且更高優(yōu)先級(jí)的任務(wù)立即獲得 CPU 的控制權(quán)。)
(協(xié)程是指是通過一個(gè)線程實(shí)現(xiàn)代碼塊相互切換執(zhí)行,對(duì)于并發(fā)執(zhí)行的程序來(lái)講,減少上下文切換的開銷,提升程序的性能,是非搶占式的,前一個(gè)協(xié)程執(zhí)行完畢或者堵塞,才會(huì)讓出CPU,其在FreeRTOS中不再更新)
3、#define configUSE_TIME_SLICING
為1使能時(shí)間片調(diào)度。
(時(shí)間片調(diào)度是指每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則CPU將被剝奪并分配給另一個(gè)進(jìn)程。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束,則CPU當(dāng)即進(jìn)行切換。)
4、#define configUSE_PORT_OPTIMISED_TASK_SELECTION
用于優(yōu)化優(yōu)先級(jí)列表中要執(zhí)行的最高優(yōu)先級(jí)任務(wù)的算法。
配置為1時(shí)進(jìn)行優(yōu)化,此方法部分硬件平臺(tái)支持,比通用方式高效,但有最高優(yōu)先級(jí)數(shù)量限制。
配置為0用于通用方法,所有平臺(tái)的移植文件都可以配置為0,純C語(yǔ)言編寫,但可用的優(yōu)先級(jí)數(shù)量不限制。
5、#define configUSE_TICKLESS_IDLE
為1啟用低功耗tickless模式。
(低功耗模式是指在空閑任務(wù)的鉤子函數(shù)中執(zhí)行低功耗相關(guān)處理,比如關(guān)閉其他外設(shè)時(shí)鐘、降低系統(tǒng)主頻等等。)
6、#define configUSE_QUEUE_SETS
為1時(shí)啟用隊(duì)列集。
(隊(duì)列是任務(wù)與任務(wù)、任務(wù)與中斷之間通信的橋梁,又因?yàn)槠溆脕?lái)傳遞消息,也稱為消息隊(duì)列)
7、#define configCPU_CLOCK_HZ
定義CPU頻率。
(CPU頻率指單片機(jī)型號(hào)HAL庫(kù)定義值,即SystemCoreClock,可能與main函數(shù)中定義的時(shí)鐘頻率不同,但其在運(yùn)行過程中會(huì)自動(dòng)改變)
8、#define configTICK_RATE_HZ
時(shí)鐘節(jié)拍頻率,周期為(1/定義值)秒。
9、#define configMAX_PRIORITIES
可使用的最大優(yōu)先級(jí)。
(設(shè)置任務(wù)的優(yōu)先級(jí)數(shù)量,設(shè)置好以后任務(wù)就可以使用從0到configMAX_PRIORITIES-1的優(yōu)先級(jí),其中0是最低優(yōu)先級(jí),configMAX_PRIORITIES-1是最高優(yōu)先級(jí)。)
10、#define configMINIMAL_STACK_SIZE
空閑任務(wù)使用的堆棧大小,以字為單位,例如一臺(tái)8位機(jī),它的1個(gè)字就等于1個(gè)字節(jié),字長(zhǎng)為8位。如果是一臺(tái)16位機(jī),那么,它的1個(gè)字就由2個(gè)字節(jié)構(gòu)成,字長(zhǎng)為16位。
11、#define configMAX_TASK_NAME_LEN
任務(wù)名最大字符串長(zhǎng)度。
12、#define configUSE_16_BIT_TICKS
系統(tǒng)節(jié)拍計(jì)數(shù)器變量數(shù)據(jù)類型,變量類型為TickType_t,1表示為16位無(wú)符號(hào)整形,0表示為32位無(wú)符號(hào)整形。
13、#define configIDLE_SHOULD_YIELD
為1時(shí)空閑任務(wù)放棄CPU使用權(quán)給其他同優(yōu)先級(jí)的用戶任務(wù)。
(宏定義了與空閑任務(wù)處于同等優(yōu)先級(jí)時(shí),是否放棄CPU使用權(quán)給其他同優(yōu)先級(jí)的用戶任務(wù),但同優(yōu)先級(jí)的搶占任務(wù)與空閑任務(wù)共用一個(gè)時(shí)間片,可能導(dǎo)致用戶任務(wù)運(yùn)行時(shí)間少)
14、#define configUSE_TASK_NOTIFICATIONS
為1時(shí)開啟任務(wù)通知功能,相關(guān)的API函數(shù)會(huì)被編譯,開啟此功能會(huì)使每個(gè)任務(wù)多消耗8個(gè)字節(jié)。
15、#define configUSE_MUTEXES
為1時(shí)使用互斥信號(hào)量。
(互斥信號(hào)量是一個(gè)擁有優(yōu)先級(jí)繼承的二值信號(hào)量,適用于需互斥訪問的應(yīng)用。)
(當(dāng)一個(gè)互斥信號(hào)量正在被一個(gè)低優(yōu)先級(jí)的任務(wù)使用,而此時(shí)有個(gè)高優(yōu)先級(jí)的任務(wù)也嘗試獲取這個(gè)互斥信號(hào)量的話就會(huì)被阻塞。不過這個(gè)高優(yōu)先級(jí)的任務(wù)會(huì)將低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)提升到與自己相同的優(yōu)先級(jí),這個(gè)過程就是優(yōu)先級(jí)繼承。)
16、#define configQUEUE_REGISTRY_SIZE
不為0時(shí)表示啟用隊(duì)列記錄,具體值為記錄隊(duì)列和信號(hào)量最大數(shù)目。
17、#define configCHECK_FOR_STACK_OVERFLOW
大于0時(shí)啟用堆棧溢出檢測(cè)功能,如果使用此功能用戶必須提供一個(gè)棧溢出鉤子函數(shù),如果使用的話此值可以為1或者2,因?yàn)橛袃煞N棧溢出檢測(cè)方法,一般堆棧溢出檢測(cè)會(huì)增加上下文切換的開銷,建議在調(diào)試的時(shí)候使用。
(回調(diào)函數(shù)更多的是目的處理,鉤子函數(shù)更多的是過程監(jiān)控,一般是操作函數(shù)指針實(shí)現(xiàn)且函數(shù)內(nèi)容為用戶定義)
18、#define configUSE_RECURSIVE_MUTEXES
為1時(shí)使用遞歸互斥信號(hào)量。
(遞歸互斥信號(hào)量可以看作是一個(gè)特殊的互斥信號(hào)量,已經(jīng)獲取了互斥信號(hào)量的任務(wù)就不能再次獲取這個(gè)互斥信號(hào)量,但是遞歸互斥信號(hào)量不同,已經(jīng)獲取了遞歸互斥信號(hào)量的任務(wù)可以再次獲取這個(gè)遞歸互斥信號(hào)量,而且次數(shù)不限,但獲取多少次,結(jié)束時(shí)就得釋放多少次)
19、#define configUSE_MALLOC_FAILED_HOOK
1使用內(nèi)存申請(qǐng)失敗鉤子函數(shù)。
20、#define configUSE_APPLICATION_TASK_TAG
為任務(wù)分配標(biāo)簽值,設(shè)置為1來(lái)使用vTaskSetApplicationTaskTag函數(shù),分配的標(biāo)簽只對(duì)應(yīng)用程序有用,內(nèi)核不使用。.
21、#define configUSE_COUNTING_SEMAPHORES
為1時(shí)使用計(jì)數(shù)信號(hào)量。
(計(jì)數(shù)信號(hào)量為長(zhǎng)度大于1的隊(duì)列,同二值信號(hào)量一樣,用戶無(wú)需關(guān)心隊(duì)列中的數(shù)據(jù)內(nèi)容,只需關(guān)心隊(duì)列是否為空即可)
內(nèi)存申請(qǐng)配置項(xiàng)
1、#define configSUPPORT_DYNAMIC_ALLOCATION
為1時(shí)支持動(dòng)態(tài)內(nèi)存申請(qǐng)。
(動(dòng)態(tài)內(nèi)存實(shí)質(zhì)并不是真正意義上的動(dòng)態(tài)分配,而是事先分配了一個(gè)足夠大的靜態(tài)數(shù)組,然后freertos的內(nèi)存管理策略會(huì)對(duì)這一塊大的靜態(tài)數(shù)組進(jìn)行內(nèi)存管理。)
2、#define configSUPPORT_STATIC_ALLOCATION
為1時(shí)支持靜態(tài)內(nèi)存申請(qǐng)。
(需要用戶先申請(qǐng)任務(wù)控制模塊和任務(wù)棧需要的內(nèi)存,然后把內(nèi)存地址傳遞給函數(shù),函數(shù)負(fù)責(zé)其他初始化)
3、#define configTOTAL_HEAP_SIZE
系統(tǒng)所有總的堆大小,即動(dòng)態(tài)內(nèi)存最大占用大小
(靜態(tài)內(nèi)存在棧上分配; 動(dòng)態(tài)內(nèi)存在堆上分配。)
鉤子函數(shù)配置項(xiàng)
1、#define configUSE_IDLE_HOOK
為1時(shí)使用空閑鉤子;為0時(shí)不使用
(空閑任務(wù)鉤子函數(shù)會(huì)在空閑任務(wù)每循環(huán)一次時(shí)就自動(dòng)調(diào)用一次。)
2、#define configUSE_TICK_HOOK
為1時(shí)使用時(shí)間片鉤子;為0時(shí)不使用
(時(shí)間片中斷可以周期性的調(diào)用一個(gè)被稱為鉤子函數(shù)(回調(diào)函數(shù))的應(yīng)用程序。時(shí)間片鉤子函數(shù)可以很方便的實(shí)現(xiàn)一個(gè)定時(shí)器功能。)
狀態(tài)配置項(xiàng)
1、#define configGENERATE_RUN_TIME_STATS
為1時(shí)啟用運(yùn)行時(shí)間統(tǒng)計(jì)功能;
(用于統(tǒng)計(jì)每個(gè)任務(wù)的運(yùn)行時(shí)間。要使用這個(gè)函數(shù)必須有一個(gè)用于時(shí)間統(tǒng)計(jì)的定時(shí)器或計(jì)數(shù)器,這個(gè)定時(shí)器或計(jì)數(shù)器的精度要至少大于10倍的系統(tǒng)節(jié)拍周期。)
2、#define configUSE_TRACE_FACILITY
為1啟用可視化跟蹤調(diào)試;
(使能此配置將添加額外的結(jié)構(gòu)體成員和函數(shù),以此來(lái)協(xié)助可視化和跟蹤。)
3、#define configUSE_STATS_FORMATTING_FUNCTIONS
與宏configUSE_TRACE_FACILITY同時(shí)為1時(shí)會(huì)編譯下面3個(gè)函數(shù)
prvWriteNameToBuffer(),vTaskList(),vTaskGetRunTimeStats();啟用可視化跟蹤調(diào)試;
協(xié)程配置項(xiàng)
1、#define configUSE_CO_ROUTINES
設(shè)置為1,將使用(協(xié)同例程)合作輪轉(zhuǎn)式程序,啟用協(xié)程以后必須添加文件croutine.c.
2、#define configMAX_CO_ROUTINE_PRIORITIES
協(xié)程的有效優(yōu)先級(jí)數(shù)目;
軟件定時(shí)器配置項(xiàng)
1、#define configUSE_TIMERS
為1時(shí)啟用軟件定時(shí)器;
(軟件定時(shí)器允許設(shè)置一段時(shí)間,當(dāng)設(shè)置的時(shí)間到達(dá)之后就執(zhí)行指定的功能函數(shù),被定時(shí)器調(diào)用的這個(gè)功能函數(shù)叫做定時(shí)器的回調(diào)函數(shù)?;卣{(diào)函數(shù)的兩次執(zhí)行間隔叫做定時(shí)器的定時(shí)周期,當(dāng)定時(shí)器的定時(shí)周期到了以后就會(huì)執(zhí)行回調(diào)函數(shù)。)
2、#define configTIMER_TASK_PRIORITY
軟件定時(shí)器優(yōu)先級(jí),一般設(shè)為最大優(yōu)先級(jí)
3、#define configTIMER_QUEUE_LENGTH
軟件定時(shí)器隊(duì)列長(zhǎng)度;
(隊(duì)列長(zhǎng)度指定時(shí)器任務(wù)同一時(shí)間能容納的定時(shí)器命令個(gè)數(shù))
4、#define configTIMER_TASK_STACK_DEPTH
軟件定時(shí)器任務(wù)堆棧大小;
可選函數(shù)配置項(xiàng)
#define INCLUDE_xTaskGetSchedulerState
#define INCLUDE_vTaskPrioritySet
#define INCLUDE_uxTaskPriorityGet
#define INCLUDE_vTaskDelete
#define INCLUDE_vTaskCleanUpResources
#define INCLUDE_vTaskSuspend
#define INCLUDE_vTaskDelayUntil
#define INCLUDE_vTaskDelay
#define INCLUDE_eTaskGetState
#define INCLUDE_xTimerPendFunctionCall
此類函數(shù)一般為1,用于對(duì)應(yīng)函數(shù)的編譯;
中斷配置項(xiàng)
1、#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY
設(shè)置中斷最低優(yōu)先級(jí);
(STM32優(yōu)先級(jí)使用了4位,而且STM32配置的使用組4,也就是4位都是搶占優(yōu)先級(jí)。因此優(yōu)先級(jí)數(shù)就是16個(gè),最低優(yōu)先級(jí)那就是15。不同的MCU此值不同,具體是多少要看所使用的MCU的架構(gòu))
2、#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
設(shè)置系統(tǒng)可管理的最高中斷優(yōu)先級(jí);
(用于系統(tǒng)開關(guān)中斷時(shí),不同任務(wù)優(yōu)先級(jí)在系統(tǒng)程序運(yùn)行過程中可以搶占的上限)
3、#define configKERNEL_INTERRUPT_PRIORITY
設(shè)置內(nèi)核中斷優(yōu)先級(jí);
(RTOS內(nèi)核中斷不允許搶占用戶使用的中斷,因此這個(gè)宏一般定義為硬件最低優(yōu)先級(jí)。)
4、#define configMAX_SYSCALL_INTERRUPT_PRIORITY
設(shè)置優(yōu)先級(jí),低于此優(yōu)先級(jí)的中斷可以安全的調(diào)用FreeRTOS 的API函數(shù),高于此優(yōu)先級(jí)的中斷FreeRTOS不能調(diào)用FreeRTOS的API函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的自娱自乐的FreeRTOS——config.h配置文件详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈HOOK
- 下一篇: 逍遥天龙八部服务器技能修改,泣诉天龙八部