<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計(jì)應(yīng)用 > 學(xué)RTOS從配置文件開始!

          學(xué)RTOS從配置文件開始!

          作者: 時(shí)間:2024-12-24 來源: 收藏

          最近有小伙伴問:學(xué)從哪里開始?這個(gè)問題說簡單也簡單,說難也難,因?yàn)槊總€(gè)人掌握的基礎(chǔ)不同,自然,從哪里開始學(xué)起也各有不同。首先你要去了解相關(guān)的一些基礎(chǔ)知識,然后再下載源碼實(shí)踐運(yùn)行,跑起來!接下來真正入門的第一步,大概率還得從“配置”文件開始,這里的配置,可以理解為大家說的“裁剪系統(tǒng)”及相關(guān)的一些配置。

          本文引用地址:http://www.ex-cimer.com/article/202412/465754.htm

          比如 Free 中“FreeRTOSConfig.h”

          640.gif

          當(dāng)然,是你已經(jīng)具備一定基礎(chǔ)知識,上手源碼第一步要掌握的內(nèi)容。不僅僅是 FreeRTOS,其他μCOS、RT-Thread,甚至Linux都是從配置開啟第一步的。

          可能會(huì)有老鐵說,使用STM32CubeMX配置FreeRTOS,就不用修改(配置)FreeRTOSConfig.h文件?這么說吧,第三方工具圖形化配置,也會(huì)牽涉到,而且僅僅是基礎(chǔ)的配置,你要做項(xiàng)目還是會(huì)修改配置文件。通過第三方配置工具,你不會(huì)真正掌握RTOS底層原理,后期做項(xiàng)目你會(huì)發(fā)現(xiàn)很困難。

          FreeRTOS配置文件常見內(nèi)容

          本文結(jié)合流程的FreeRTOS給大家講講其中配置文件的內(nèi)容。FreeRTOS配置文件看起來有點(diǎn)多,但它都有分類,多了解一下,你會(huì)發(fā)現(xiàn)理解起來也不是很難。

          通用配置

          通用配置基本配置,就是需要我們定義的一些配置,也是比較重要的配置。   

          1.configUSE_PREEMPTION調(diào)度模式配置

          配置為0:合作式調(diào)度,即時(shí)間片輪流執(zhí)行;

          配置為1:搶占式調(diào)度,即優(yōu)先級高的任務(wù)搶先執(zhí)行;

          由于我們要求實(shí)時(shí)響應(yīng),就配置為1,使用搶占式調(diào)度方式。否則就發(fā)揮不到實(shí)時(shí)操作系統(tǒng)的作用。

          2.configCPU_CLOCK_HZ

          CPU時(shí)鐘,就是我們常說的主頻。注意:單位是Hz。

          如:STM32F407主頻為168M

          #define configCPU_CLOCK_HZ      (168000000)

          3.configTICK_RATE_HZ

          系統(tǒng)滴答,即系統(tǒng)每秒鐘滴答的次數(shù),可以說是系統(tǒng)的心跳,但需要和主頻區(qū)分開來。系統(tǒng)滴答的值要根據(jù)CPU主頻來看,一般主頻越高,取值相對越大,一般在100至1000之間。

          簡單舉例:系統(tǒng)滴答決定vTaskDelay。

          比如:

          #define configTICK_RATE_HZ    (1000)

          則:vTaskDelay(1000),表示延時(shí)1S。

          4.configMAX_PRIORITIES

          系統(tǒng)最大優(yōu)先級值:我們創(chuàng)建任務(wù)是,配置的優(yōu)先級值不能超過這個(gè)最大值。

          xTaskCreate(vAppTask1, "Task1", TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);

          提示:

          a.系統(tǒng)優(yōu)先級和中斷優(yōu)先級原理類似,高優(yōu)先級的會(huì)搶在低優(yōu)先級的前面,但需要區(qū)分系統(tǒng)和中斷優(yōu)先級的應(yīng)用場景。

          b.FreeRTOS中優(yōu)先級數(shù)值越大,優(yōu)先級越高。而UCOS則相反。

          5.configMINIMAL_STACK_SIZE

          最小堆棧值:在系統(tǒng)中,一般用于空閑、定時(shí)等一些系統(tǒng)任務(wù)中,當(dāng)然,我們有些地方也可以使用這個(gè)定義的堆棧值。

          注意數(shù)值的單位,一般在ARM中為4個(gè)字節(jié)。

          6.configTOTAL_HEAP_SIZE

          系統(tǒng)總共堆(棧)大?。何覀冃枰鶕?jù)需要使用的情況定義這個(gè)值。不能定義太小,太小內(nèi)存容易溢出;也不能定義太大,有些芯片RAM本身就不大(有些就只有幾K),如果太大我們就沒法定義太多全局變量,或分配其他堆??臻g。

          7.configMAX_TASK_NAME_LEN

          任務(wù)名稱最大長度:也就是創(chuàng)建任務(wù)定義任務(wù)名稱的字符串長度。

          xTaskCreate(vAppTask1, "Task1", TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, NULL);

          提示:結(jié)束符 '?'也包含在內(nèi)。

          8.configUSE_16_BIT_TICKS

          是否使用16位滴答計(jì)數(shù)值

          配置為0:則使用32位的滴答計(jì)數(shù)值,一般在32位處理器中都是配置為0;

          配置為1:則使用16位的滴答計(jì)數(shù)值,一般8位或者16位處理器中配置為1。

          9.configIDLE_SHOULD_YIELD

          是否讓空閑任務(wù)“放棄”搶占:也就是說在執(zhí)行與空閑任務(wù)相同優(yōu)先級的任務(wù)過程中,空閑任務(wù)是否具有搶占的機(jī)會(huì)。

          配置為0:不放棄搶占;

          配置為1:放棄搶占;

          10.configUSE_MUTEXES

          是否使用互斥鎖

          配置為0:不使用

          配置為1:使用

          提示:互斥鎖也叫互斥信號量,也就是說對資源“加鎖”。它的作用是實(shí)現(xiàn)多任務(wù)間共享資源的獨(dú)占式處理。簡單的說,就是某個(gè)資源在某一時(shí)刻只允許一個(gè)任務(wù)處理,處理完之后才允許其他任務(wù)處理該資源。

          比如:A任務(wù)優(yōu)先級高,B任務(wù)優(yōu)先級低;AB任務(wù)都會(huì)使用一個(gè)串口發(fā)送指令數(shù)據(jù),(即每次必須發(fā)送完成,不能發(fā)送到一半就被打斷)。

          當(dāng)B任務(wù)正在發(fā)送數(shù)據(jù)時(shí),A任務(wù)處于就緒狀態(tài)(要打斷B任務(wù))。那么B任務(wù)就需要使用互斥鎖占有該串口(加鎖,占有該資源),等發(fā)送完指令,就釋放該串口(開鎖,釋放該資源)。一旦釋放了該資源,A任務(wù)就可以使用該串口(資源)了。

          11.configUSE_RECURSIVE_MUTEXES

          是否使用遞歸互斥鎖

          配置為0:不使用

          配置為1:使用

          13.configQUEUE_REGISTRY_SIZE(*)

          可添加(或登記)隊(duì)列名的數(shù)量:這個(gè)配置信息不好翻譯,它主要結(jié)合vQueueAddToRegistry與vQueueUnregisterQueue這兩個(gè)函數(shù)使用。

          直接上函數(shù)接口:

          void vQueueAddToRegistry(QueueHandle_t xQueue, const char *pcQueueName);
          void vQueueUnregisterQueue(QueueHandle_t xQueue);

          從函數(shù)接口可以知道,一個(gè)函數(shù)是登記(已經(jīng)創(chuàng)建的)隊(duì)列的名稱;一個(gè)函數(shù)是注銷隊(duì)列的名稱;其實(shí),主要目的就是給(已經(jīng)創(chuàng)建的)隊(duì)列取名,方便調(diào)試查找。

          提示:很多初學(xué)者理解為“可創(chuàng)建隊(duì)列的最大數(shù)”,這個(gè)配置參數(shù)與其完全不一樣的概念。

          14.configUSE_QUEUE_SETS(*)

          是否使用消息隊(duì)列“SET”功能

          配置為0:不使用

          配置為1:使用

          15.configUSE_TIME_SLICING

          是否使用時(shí)間片進(jìn)行調(diào)度:這個(gè)參數(shù)結(jié)合上面第1各配置參數(shù)configUSE_PREEMPTION一起使用。這個(gè)配置參數(shù)是在后面新版本增加的,好像在V7版本之前是沒有這個(gè)配置參數(shù)。所以,在FreeRTOSConfig.h配置文件中默認(rèn)是沒有的,而是定義在FreeRTOS.h中。

          #ifndef configUSE_TIME_SLICING  
          #define configUSE_TIME_SLICING 1
          #endif

          HOOK配置

          1.configUSE_IDLE_HOOK

          是否定義IDLE空閑任務(wù)HOOK函數(shù)

          配置為0:不定義

          配置為1:定義

          configUSE_IDLE_HOOK是系統(tǒng)設(shè)計(jì)之初就有的,必須在“FreeRTOSConfig.h”中宏定義。不像有些宏定義可以不在“FreeRTOSConfig.h”中定義,因?yàn)樗鼈冊凇癋reeRTOS.h”有判斷是否定義了,如果沒有定義,會(huì)有一個(gè)默認(rèn)的定義。

          比如:“configUSE_MUTEXES”可以不在“FreeRTOSConfig.h”中定義,而在“FreeRTOS.h”中可以看到如下一段代碼:

          #ifndef configUSE_MUTEXES
          #define configUSE_MUTEXES 0
          #endif

          也就是說,如果沒有定義,它會(huì)默認(rèn)給你定義。

          回來說configUSE_IDLE_HOOK,在task.c文件中,有如下一段代碼:

          #if (configUSE_IDLE_HOOK == 1)
          {  
          extern void vApplicationIdleHook(void);  
          vApplicationIdleHook();
          }
          #endif

          意思是說:如果你配置configUSE_IDLE_HOOK為1,那么你就必須要實(shí)現(xiàn)“vApplicationIdleHook()”這個(gè)函數(shù),否則編譯會(huì)出錯(cuò)。初學(xué)者默認(rèn)不定義該函數(shù)。

          2.configUSE_TICK_HOOK

          是否定義TICK滴答HOOK函數(shù)

          配置為0:不定義

          配置為1:定義

          在task.c文件中的xTaskIncrementTick函數(shù)下可以看見如下代碼:

          #if (configUSE_TICK_HOOK == 1)
          {  
              if(uxPendedTicks == (UBaseType_t) 0U)  
              {    vApplicationTickHook();  
              }  
          else  
          {    
              mtCOVERAGE_TEST_MARKER();  
              }
          }
          #endif

          提示:xTaskIncrementTick函數(shù)是在PendSV_Handler中斷函數(shù)中被調(diào)用的。因此,vApplicationTickHook()函數(shù)執(zhí)行的時(shí)間必須很短才行。

          3.configCHECK_FOR_STACK_OVERFLOW

          是否定義棧溢出HOOK函數(shù)

          配置為0:不定義

          配置為1:定義

          這個(gè)配置比較關(guān)鍵和重要,特別對于復(fù)雜的系統(tǒng)設(shè)計(jì),代碼量比較大那種工程,使用該功能,可以幫你分析是否有內(nèi)存越界的情況。

          4.configUSE_MALLOC_FAILED_HOOK

          是否定義內(nèi)存分配失敗HOOK函數(shù)

          配置為0:不定義

          配置為1:定義

          我們創(chuàng)建任務(wù)、信號量、隊(duì)列等都需要耗費(fèi)系統(tǒng)堆棧,如果我們對系統(tǒng)總共分配堆棧不夠多,在創(chuàng)建多個(gè)任務(wù)或隊(duì)列時(shí)容易分配失敗,這個(gè)時(shí)候就起到一個(gè)提示作用。

          5.configUSE_DAEMON_TASK_STARTUP_HOOK

          是否定義守護(hù)進(jìn)程HOOK函數(shù)

          配置為0:不定義

          配置為1:定義

          通過分析軟件源代碼可以發(fā)現(xiàn),這個(gè)HOOK函數(shù)是在TIMER任務(wù)下面實(shí)現(xiàn)的,所以需要配置configUSE_TIMERS為1。

          TIMERS配置

          TIMER即定時(shí)器,在RTOS中的TIMER屬于軟件定時(shí)。FreeRTOS的定時(shí)器精度不高,會(huì)隨著定時(shí)的增加而改變,特別是TIMER任務(wù)優(yōu)先級較低,高優(yōu)先級占用資源的情況下。

          若要使用高精度的定時(shí),還是最后使用硬件的定時(shí)器(現(xiàn)在處理器一般都有多個(gè)硬件TIMER)。

          1.configUSE_TIMERS是否使用軟件定時(shí)器

          配置為0:不使用

          配置為1:使用

          其他許多相關(guān)的功能都需要結(jié)合該配置才能使用,使用時(shí)需要注意是否關(guān)聯(lián)。

          2.configTIMER_TASK_PRIORITY

          軟件定時(shí)器任務(wù)優(yōu)先級:軟件定時(shí)器其實(shí)也是需要?jiǎng)?chuàng)建一個(gè)任務(wù),創(chuàng)建方式和我們常規(guī)的一樣,只是它是有系統(tǒng)內(nèi)核完成,不用我們自己寫創(chuàng)建任務(wù)代碼。

          這里的這個(gè)優(yōu)先級就是定時(shí)器任務(wù)的優(yōu)先級。

          3.configTIMER_QUEUE_LENGTH

          軟件定時(shí)器命令隊(duì)列長度:關(guān)于TIMER的命令隊(duì)列牽涉的知識相對復(fù)雜點(diǎn),后期進(jìn)一步講述,可看下圖:

          640.png

          4.configTIMER_TASK_STACK_DEPTH

          分配給軟件定時(shí)器的堆棧空間

          CO_ROUTINES配置

          CO_ROUTINES這個(gè)不好翻譯,網(wǎng)上都叫協(xié)同程序,或者合作程序,理解為協(xié)同一起使用的程序,后期結(jié)合應(yīng)用講述。

          1.configUSE_CO_ROUTINES

          是否使用CO_ROUTINES

          配置為0:不使用

          配置為1:使用

          2.configMAX_CO_ROUTINE_PRIORITIES

          CO_ROUTINE優(yōu)先級

          MEMORY配置

          內(nèi)存分配相關(guān)的配置,這里的配置與heap_x.c有關(guān),后面會(huì)再次進(jìn)行講述。

          1.configSUPPORT_STATIC_ALLOCATION

          是否支持靜態(tài)分配

          配置為0:不支持

          配置為1:支持

          2.configSUPPORT_DYNAMIC_ALLOCATION

          是否支持動(dòng)態(tài)分配

          配置為0:不支持

          配置為1:支持

          3.configTOTAL_HEAP_SIZE

          分配給系統(tǒng)的堆棧:創(chuàng)建任務(wù),堆棧,靜態(tài)、動(dòng)態(tài)都分配的內(nèi)存都來自這里。

          4.configAPPLICATION_ALLOCATED_HEAP

          APP使用哪里分配的堆

          配置為0:使用系統(tǒng)分配的堆

          配置為1:使用外部分配的堆

          默認(rèn)使用系統(tǒng)分配的堆,見下面定義:
          #if(configAPPLICATION_ALLOCATED_HEAP == 1 )
            extern uint8_t ucHeap[configTOTAL_HEAP_SIZE];
          #else
            static uint8_t ucHeap[configTOTAL_HEAP_SIZE];
          #endif

          RUN_TIME_STATS配置

          運(yùn)行時(shí)信息統(tǒng)計(jì)配置

          1.configGENERATE_RUN_TIME_STATS

          是否生成統(tǒng)計(jì)信息

          配置為0:否

          配置為1:是

          2.configUSE_TRACE_FACILITY

          是否協(xié)助執(zhí)行可視化和跟蹤

          配置為0:否

          配置為1:是

          這里會(huì)添加額外的結(jié)構(gòu)體來實(shí)現(xiàn)。

          3.configUSE_STATS_FORMATTING_FUNCTIONS

          是否統(tǒng)計(jì)相關(guān)的功能

          配置為0:否

          配置為1:是

          設(shè)置宏configUSE_TRACE_FACILITY和configUSE_STATS_FORMATTING_FUNCTIONS為1會(huì)編譯vTaskList()和vTaskGetRunTimeStats()函數(shù)。如果將這兩個(gè)宏任意一個(gè)設(shè)置為0,上述兩個(gè)函數(shù)不會(huì)被編譯。

          其他配置

          這里簡單綜合講述一下各項(xiàng)配置

          1.configASSERT

          斷言配置

          2.Interrupt相關(guān)

          configKERNEL_INTERRUPT_PRIORITY:內(nèi)核中斷優(yōu)先級

          configMAX_SYSCALL_INTERRUPT_PRIORITY:系統(tǒng)調(diào)用最大的優(yōu)先級

          configMAX_API_CALL_INTERRUPT_PRIORITY:API調(diào)用的最大優(yōu)先級

          這一節(jié)與(Cortex)內(nèi)核硬件中斷有關(guān)。

          3.INCLUDE配置

          #define INCLUDE_vTaskPrioritySet
          #define INCLUDE_uxTaskPriorityGet
          #define INCLUDE_vTaskDelete

          這里給大家分享了常見的一些配置內(nèi)容,要深入理解并掌握,還是需要自己多動(dòng)手修改代碼驗(yàn)證才行。



          關(guān)鍵詞: RTOS 配置文件

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();