FreeRTOS操作系統(tǒng)的配置示例解析
FreeRTOS 的系統(tǒng)配置文件為 FreeRTOSConfig.h,在此配置文件中可以完成 FreeRTOS 的裁剪和配置。
1. FreeRTOSConfig.h 文件
FreeRTOS 的配置基本是通過在 FreeRTOSConfig.h 中使用“#define”這樣的語句來定義宏定義實(shí)現(xiàn)的。在 FreeRTOS 的官方 demo 中,每個(gè)工程都有一個(gè) FreeRTOSConfig.h 文件,我們在使用的時(shí)候可以參考這個(gè)文件,甚至直接復(fù)制粘貼使用。
2.INCLUDE_ 開始的宏
使用“INCLUDE_”開頭的宏用來表示使能或除能 FreeRTOS 中相應(yīng)的 API 函數(shù),作用就是用來配置 FreeRTOS 中的可選 API 函數(shù)的。比如當(dāng)宏 INCLUDE_vTaskPrioritySet 設(shè)置為 0 的時(shí)候表示不能使用函數(shù) vTaskPrioritySet(),當(dāng)設(shè)置為 1 的時(shí)候就表示可以使用函數(shù)vTaskPrioritySet()。這個(gè)功能其實(shí)就是條件編譯,條件編譯的好處就是節(jié)省空間,不需要的功能就不用編譯,這樣就可以根據(jù)實(shí)際需求來減少系統(tǒng)占用的 ROM 和 RAM 大小,根據(jù)自己所使用的 MCU 來調(diào)整系統(tǒng)消耗,降低成本。
3.config開始的宏
“config”開始的宏和“INCLUDE_”開始的宏一樣,都是用來完成 FreeRTOS 的配置和裁剪的。
想要充分理解FreeRTOSConfig.h文件中的宏定義,必須要對FreeRTOS的代碼有一定的了解,所以此處就不把宏定義一個(gè)一個(gè)列出來了,僅僅附上我自己用并注釋好的FreeRTOSConfig.h文件
#ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H //針對不同的編譯器調(diào)用不同的stdint.h文件 //并確保stdint只被編譯器使用,不被匯編器使用 #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) #include <stdint.h> extern uint32_t SystemCoreClock; #endif /***********************************************************************************************************************/ /* FreeRTOS基礎(chǔ)配置配置選項(xiàng) */ /**********************************************************************************************************************/ //#define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 1 //使用非systick中斷作為調(diào)度時(shí)鐘 #define configUSE_PREEMPTION 1 //置1:RTOS使用搶占式調(diào)度器;置0:RTOS使用協(xié)作式調(diào)度器(時(shí)間片) /* 注: * 在多任務(wù)管理機(jī)制上,操作系統(tǒng)可以分為搶占式和協(xié)作式兩種。 * 搶占式:根據(jù)任務(wù)的優(yōu)先級,優(yōu)先級高的任務(wù)就緒后,獲取CPU的使用權(quán)。 * 協(xié)作式:任務(wù)主動(dòng)釋放CPU后,切換到下一個(gè)任務(wù)。 */ #define configUSE_TIME_SLICING 1 //1:使能時(shí)間片調(diào)度(默認(rèn)是使能的) /* 注: * 為了實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)調(diào)度,系統(tǒng)把所有就緒進(jìn)程按先入先出的原則排成一個(gè)隊(duì)列。新來的進(jìn)程加到就緒隊(duì)列末尾。 * 每當(dāng)執(zhí)行進(jìn)程調(diào)度時(shí),進(jìn)程調(diào)度程序總是選出就緒隊(duì)列的隊(duì)首進(jìn)程,讓它在CPU上運(yùn)行一個(gè)時(shí)間片的時(shí)間。 * 當(dāng)進(jìn)程用完分給它的時(shí)間片后,系統(tǒng)的計(jì)時(shí)器發(fā)出時(shí)鐘中斷,調(diào)度程序便停止該進(jìn)程的運(yùn)行,把它放入就緒隊(duì)列的末尾; * 然后,把CPU分給就緒隊(duì)列的隊(duì)首進(jìn)程,同樣也讓它運(yùn)行一個(gè)時(shí)間片,如此往復(fù)。 */ #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1:使用特殊方法選擇下一個(gè)要執(zhí)行的任務(wù)(硬件支持) /* 注: * 某些運(yùn)行FreeRTOS的硬件有兩種方法選擇下一個(gè)要執(zhí)行的任務(wù):通用方法和特定于硬件的方法(以下簡稱“特殊方法”)。 * 通用方法: * 1.configUSE_PORT_OPTIMISED_TASK_SELECTION 為 0 或者硬件不支持這種特殊方法。 * 2.可以用于所有FreeRTOS支持的硬件 * 3.完全用C實(shí)現(xiàn),效率略低于特殊方法。 * 4.不強(qiáng)制要求限制最大可用優(yōu)先級數(shù)目 * 特殊方法: * 1.必須將configUSE_PORT_OPTIMISED_TASK_SELECTION設(shè)置為1。 * 2.依賴一個(gè)或多個(gè)特定架構(gòu)的匯編指令(一般是類似計(jì)算前導(dǎo)零[CLZ]指令)。 * 3.比通用方法更高效 * 4.一般強(qiáng)制限定最大可用優(yōu)先級數(shù)目為32 * 一般是硬件計(jì)算前導(dǎo)零指令,如果所使用的,MCU沒有這些硬件指令的話此宏應(yīng)該設(shè)置為0! */ #define configUSE_TICKLESS_IDLE 0 //0:不啟用低功耗tickless模式 /* 注: * 置1:使能低功耗tickless模式;置0:保持系統(tǒng)節(jié)拍(tick)中斷一直運(yùn)行 * * 假設(shè)開啟低功耗的話可能會導(dǎo)致下載出現(xiàn)問題,因?yàn)槌绦蛟谒咧?可用以下辦法解決 * 下載方法: * 1.將開發(fā)版正常連接好 * 2.按住復(fù)位按鍵,點(diǎn)擊下載瞬間松開復(fù)位按鍵 * * 1.通過跳線帽將 BOOT 0 接高電平(3.3V) * 2.重新上電,下載 * * 1.使用FlyMcu擦除一下芯片,然后進(jìn)行下載 * STMISP -> 清除芯片(z) */ #define configUSE_QUEUE_SETS 1 //1:啟用隊(duì)列集合 /* 注: * 隊(duì)列集合:用于對多個(gè)隊(duì)列以及信號量進(jìn)行“監(jiān)聽”, * 只要其中不管哪一個(gè)有消息到來,都可以讓任務(wù)退出阻塞狀態(tài)。 */ #define configCPU_CLOCK_HZ (SystemCoreClock) //CPU頻率 /* 注: * 寫入實(shí)際的CPU內(nèi)核時(shí)鐘頻率,也就是CPU指令執(zhí)行頻率,通常稱為Fclk * Fclk為供給CPU內(nèi)核的時(shí)鐘信號,我們所說的cpu主頻為 XX MHz, * 就是指的這個(gè)時(shí)鐘信號,相應(yīng)的,1/Fclk即為cpu時(shí)鐘周期; */ #define configTICK_RATE_HZ (( TickType_t )1000) //時(shí)鐘節(jié)拍頻率1000HZ,周期就是1ms /* 注: * RTOS系統(tǒng)節(jié)拍中斷的頻率。 * 即一秒中斷的次數(shù),每次中斷RTOS都會進(jìn)行任務(wù)調(diào)度 */ #define configMAX_PRIORITIES (32) //可使用的最大優(yōu)先級 /* 注: * 設(shè)置任務(wù)優(yōu)先級時(shí),數(shù)字越小,優(yōu)先級越高 */ #define configMINIMAL_STACK_SIZE ((unsigned short)128) //空閑任務(wù)使用的堆棧大小 /* 注: * 空閑任務(wù)就是CPU無事可做的時(shí)候,操作系統(tǒng)為了不讓CPU閑著,強(qiáng)行讓它做的一個(gè)任務(wù) * 空閑任務(wù)是FreeRTOS不可缺少的任務(wù),因?yàn)镕reeRTOS設(shè)計(jì)要求必須至少有一個(gè)任務(wù)處于運(yùn)行狀態(tài)。 */ #define configMAX_TASK_NAME_LEN (16) //任務(wù)名字字符串的長度 #define configUSE_16_BIT_TICKS 0 //系統(tǒng)節(jié)拍計(jì)數(shù)器變量的數(shù)據(jù)類型, //1表示為16位無符號整形,0表示為32位無符號整形 #define configIDLE_SHOULD_YIELD 1 //1:空閑任務(wù)放棄CPU使用權(quán)給其他同優(yōu)先級的用戶任務(wù) #define configUSE_TASK_NOTIFICATIONS 1 //1:開啟任務(wù)通知功能,默認(rèn)開啟 #define configUSE_MUTEXES 1 //1:使用互斥信號量 #define configQUEUE_REGISTRY_SIZE 8 //設(shè)置可以注冊的信號量和消息隊(duì)列個(gè)數(shù) #define configCHECK_FOR_STACK_OVERFLOW 0 //不使用堆棧溢出檢測功能 /* 注: * 大于0時(shí)啟用堆棧溢出檢測功能,如果使用此功能 * 用戶必須提供一個(gè)棧溢出鉤子函數(shù),如果使用的話 * 此值可以為1或者2,因?yàn)橛袃煞N棧溢出檢測方法 */ #define configUSE_RECURSIVE_MUTEXES 1 //1:使用遞歸互斥信號量 #define configUSE_COUNTING_SEMAPHORES 1 //1:使用計(jì)數(shù)信號量 #define configUSE_APPLICATION_TASK_TAG 0 //不可為任務(wù)分配標(biāo)簽(默認(rèn)不可) /***************************************************************** FreeRTOS與內(nèi)存申請有關(guān)配置選項(xiàng) *****************************************************************/ #define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持動(dòng)態(tài)內(nèi)存申請 #define configTOTAL_HEAP_SIZE ((size_t)(32*1024)) //系統(tǒng)所有總的堆大小 /*************************************************************** FreeRTOS與鉤子函數(shù)有關(guān)的配置選項(xiàng) **************************************************************/ #define configUSE_IDLE_HOOK 0 //置1:使用空閑鉤子;置0:忽略空閑鉤子 /* 注: * 空閑任務(wù)鉤子是一個(gè)函數(shù),這個(gè)函數(shù)由用戶來實(shí)現(xiàn), * FreeRTOS規(guī)定了函數(shù)的名字和參數(shù):void vApplicationIdleHook(void ), * 這個(gè)函數(shù)在每個(gè)空閑任務(wù)周期都會被調(diào)用 * 對于已經(jīng)刪除的RTOS任務(wù),空閑任務(wù)可以釋放分配給它們的堆棧內(nèi)存。 * 因此必須保證空閑任務(wù)可以被CPU執(zhí)行 * 使用空閑鉤子函數(shù)設(shè)置CPU進(jìn)入省電模式是很常見的 * 不可以調(diào)用 會引起空閑任務(wù)阻塞 的API函數(shù) */ #define configUSE_TICK_HOOK 0 //置1:使用時(shí)間片鉤子;置0:忽略時(shí)間片鉤子 /* 注: * 時(shí)間片鉤子是一個(gè)函數(shù),這個(gè)函數(shù)由用戶來實(shí)現(xiàn), * FreeRTOS規(guī)定了函數(shù)的名字和參數(shù):void vApplicationTickHook(void ) * 時(shí)間片中斷可以周期性的調(diào)用 * 函數(shù)必須非常短小,不能大量使用堆棧, * 不能調(diào)用以”FromISR" 或 "FROM_ISR”結(jié)尾的API函數(shù) */ /*xTaskIncrementTick函數(shù)是在xPortSysTickHandler中斷函數(shù)中被調(diào)用的。因此,vApplicationTickHook()函數(shù)執(zhí)行的時(shí)間必須很短才行*/ //使用內(nèi)存申請失敗鉤子函數(shù) #define configUSE_MALLOC_FAILED_HOOK 0 //不使用內(nèi)存申請失敗鉤子函數(shù) /******************************************************************** FreeRTOS與運(yùn)行時(shí)間和任務(wù)狀態(tài)收集有關(guān)的配置選項(xiàng) **********************************************************************/ #define configGENERATE_RUN_TIME_STATS 0 //不啟用運(yùn)行時(shí)間統(tǒng)計(jì)功能(一般調(diào)試的使用用) #define configUSE_TRACE_FACILITY 1 //啟用可視化跟蹤調(diào)試 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* 與宏configUSE_TRACE_FACILITY同時(shí)為1時(shí)會編譯下面3個(gè)函數(shù) * prvWriteNameToBuffer() * vTaskList(), * vTaskGetRunTimeStats() */ /******************************************************************** FreeRTOS與協(xié)程有關(guān)的配置選項(xiàng) *********************************************************************/ #define configUSE_CO_ROUTINES 0 //1:啟用協(xié)程,啟用協(xié)程以后必須添加文件croutine.c #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //協(xié)程的有效優(yōu)先級數(shù)目 /*********************************************************************** FreeRTOS與軟件定時(shí)器有關(guān)的配置選項(xiàng) **********************************************************************/ #define configUSE_TIMERS 1 //1:啟用軟件定時(shí)器 #define configTIMER_TASK_PRIORITY ( 2 ) //設(shè)置軟件定時(shí)器優(yōu)先級 #define configTIMER_QUEUE_LENGTH 10 //軟件定時(shí)器隊(duì)列長度 #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //軟件定時(shí)器任務(wù)堆棧大小 /************************************************************ FreeRTOS可選函數(shù)配置選項(xiàng) ************************************************************/ #define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 1 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #define INCLUDE_eTaskGetState 1 #define INCLUDE_xTimerPendFunctionCall 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 #define INCLUDE_xTaskGetHandle 1 /****************************************************************** FreeRTOS與中斷有關(guān)的配置選項(xiàng) ******************************************************************/ #ifdef __NVIC_PRIO_BITS #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 #endif //由于STM32是4位的中斷優(yōu)先級控制,所以此處為4(不同的MCU不同) #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中斷最低優(yōu)先級 //4位優(yōu)先級全部分組給主優(yōu)先級,所以總共有16位優(yōu)先級配置:0-15--優(yōu)先級最低的為15 //不同的MCU不同 #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) /* 240 */ //設(shè)置內(nèi)核中斷優(yōu)先級,這個(gè)宏是用來設(shè)置PendSV和滴答定時(shí)器的中斷優(yōu)先級的,port.c中使用到 //此處的左移四位的原因是:STM32采用的是從MSB開始的高四位作為優(yōu)先級配置 //其實(shí)這個(gè)宏定義可以簡化成:#define configKERNEL_INTERRUPT_PRIORITY 0xF0 #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //設(shè)置系統(tǒng)可管理的最大優(yōu)先級 //這個(gè)就是 BASEPRI 寄存器說的那個(gè)閾值優(yōu)先級,這里我設(shè)置為了 5。 //也就是高于 5 的優(yōu)先級(優(yōu)先級數(shù)小于 5)不歸 FreeRTOS 管理! //這個(gè)是給人看的,下面一個(gè)宏是給系統(tǒng)看的 #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) //此處需要左移四位的原因:同上 //低于此優(yōu)先級的中斷可以安全的調(diào)用 FreeRTOS 的 API 函數(shù),高于此優(yōu)先級的中斷 FreeRTOS 是不能禁止的, //中斷服務(wù)函數(shù)也不能調(diào)用 FreeRTOS 的 API 函數(shù)! //也就是:#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x50 /* * 以上配置的結(jié)果就是: * 優(yōu)先級為0-4的中斷 不會被FreeRTOS禁止,不會因?yàn)閳?zhí)行FreeRTOS內(nèi)核而延時(shí),中斷不可調(diào)用FreeRTOS的API函數(shù) * 優(yōu)先級為5-15的中斷 能夠被FreeRTOS禁止,可以調(diào)用以 FromISR 結(jié)尾的FreeRTOS API函數(shù),并且它們可以中斷嵌套 * 所以:不掉用任何FreeRTOS API的中斷可以使用所有的中斷優(yōu)先級,并且它們可以中斷嵌套 * 那些對實(shí)時(shí)性要求嚴(yán)格的任務(wù)就可以使用0-4的優(yōu)先級,比如四軸飛行器中的壁障檢測 */ /**************************************************************** FreeRTOS與中斷服務(wù)函數(shù)有關(guān)的配置選項(xiàng) ****************************************************************/ #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler //#define xPortSysTickHandler SysTickHandler 自行在delay.c函數(shù)中實(shí)現(xiàn) #endif /* FREERTOS_CONFIG_H */
以上就是FreeRTOS操作系統(tǒng)的配置示例解析的詳細(xì)內(nèi)容,更多關(guān)于FreeRTOS操作系統(tǒng)配置的資料請關(guān)注腳本之家其它相關(guān)文章!
- FreeRTOS任務(wù)控制API函數(shù)的功能分析
- FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)創(chuàng)建和刪除
- FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解
- FreeRTOS實(shí)時(shí)操作系統(tǒng)的內(nèi)存管理分析
- freertos實(shí)時(shí)操作系統(tǒng)臨界段保護(hù)開關(guān)中斷及進(jìn)入退出
- FreeRTOS實(shí)時(shí)操作系統(tǒng)結(jié)構(gòu)示例
- FreeRTOS實(shí)時(shí)操作系統(tǒng)支持時(shí)間片示例詳解
相關(guān)文章
FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_5示例
這篇文章主要為大家介紹了FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_5示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的任務(wù)概要講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS任務(wù)控制API函數(shù)的功能分析
這篇文章主要為大家介紹了FreeRTOS任務(wù)控制API函數(shù)的功能分析,F(xiàn)reeRTOS任務(wù)控制API函數(shù)主要實(shí)現(xiàn)任務(wù)延時(shí)、任務(wù)掛起、解除任務(wù)掛起、任務(wù)優(yōu)先級獲取和設(shè)置等功能2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)內(nèi)核配置說明
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)內(nèi)核配置及說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級實(shí)現(xiàn)
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)的多優(yōu)先級實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南
這篇文章主要為大家介紹了FreeRTOS編碼標(biāo)準(zhǔn)及風(fēng)格指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS進(jìn)階之任務(wù)創(chuàng)建完全解析
這篇文章主要為大家介紹了FreeRTOS進(jìn)階之任務(wù)創(chuàng)建完全解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS實(shí)時(shí)操作系統(tǒng)支持時(shí)間片示例詳解
這篇文章主要為大家介紹了FreeRTOS實(shí)時(shí)操作系統(tǒng)支持的時(shí)間片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_4示例
這篇文章主要為大家介紹了FreeRTOS動(dòng)態(tài)內(nèi)存分配管理heap_4示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04