0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【freeRTOS開(kāi)發(fā)筆記】關(guān)注創(chuàng)建任務(wù)時(shí)傳入優(yōu)先級(jí)數(shù)值問(wèn)題

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-07-11 09:13 ? 次閱讀

1 前言

最近博主在做一些適配freeRTOS的項(xiàng)目,簡(jiǎn)單來(lái)說(shuō)就是從別的RTOS平臺(tái)遷移到freeRTOS平臺(tái)。 由于之前的代碼都是可用的,憑經(jīng)驗(yàn)我們認(rèn)為只需要將OSAL的接口重新封裝一下,理論上上層的邏輯應(yīng)該問(wèn)題不大;但是我們沒(méi)想到的卻是在OSAL層適配的時(shí)候,遇到了一些之前沒(méi)有考慮到的問(wèn)題。

2 遇到的問(wèn)題

這個(gè)問(wèn)題主要的體現(xiàn)就是在創(chuàng)建任務(wù)的接口調(diào)用上,freeRTOS的接口原型為:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName,     /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;

我們關(guān)注下第5個(gè)參數(shù)uxPriority,這個(gè)參數(shù)就是指定任務(wù)的優(yōu)先級(jí)。 我們都知道freeRTOS是基于任務(wù)優(yōu)先級(jí)來(lái)進(jìn)行調(diào)度的,創(chuàng)建任務(wù)時(shí)指定的任務(wù)優(yōu)先級(jí)直接影響任務(wù)響應(yīng)的實(shí)時(shí)性。 早前我們是使用AliOS,功能組件代碼也都是使用AliOS的創(chuàng)建任務(wù)的API

/**
 * Create a task.
 *
 * @param[in]  task        handle.
 * @param[in]  name        task name.
 * @param[in]  fn          task function.
 * @param[in]  arg         argument of the function..
 * @param[in]  stack_buf   stack-buf: if stack_buf==NULL, provided by kernel.
 * @param[in]  stack_size  stack-size in bytes.
 * @param[in]  prio        priority value, the max is RHINO_CONFIG_USER_PRI_MAX(default 60).
 *
 * @return  0: success, otherwise: fail.
 */
int aos_task_new_ext(aos_task_t *task, const char *name, void (*fn)(void *),
                     void *arg, int stack_size, int prio);

這樣在做OS層接口的轉(zhuǎn)換的時(shí)候,優(yōu)先級(jí)這個(gè)數(shù)值就出問(wèn)題了。 比如AliOS的接口傳入prio=60;然后60傳入freeRTOS就會(huì)出問(wèn)題了,導(dǎo)致的結(jié)果就是新創(chuàng)建的任務(wù)可以被調(diào)度起來(lái),但是創(chuàng)建任務(wù)的接口沒(méi)法返回了。 這里的根本原因就是freeRTOS的優(yōu)先級(jí)定義,數(shù)值越小,優(yōu)先級(jí)越低;反之,優(yōu)先級(jí)越高

3 如何解決

解決的方法,倒是比較簡(jiǎn)單,但是會(huì)比較繁瑣。 我們需要對(duì)所有創(chuàng)建的任務(wù),傳入的優(yōu)先級(jí)數(shù)值重新進(jìn)行評(píng)估,明確每個(gè)任務(wù)是高優(yōu)先級(jí)還是低優(yōu)先級(jí)。 比如上面的prio=60(低優(yōu)先級(jí))改為prio=0或1就可以解決問(wèn)題了。

4 經(jīng)驗(yàn)總結(jié)

針對(duì)freeRTOS這種反常的優(yōu)先級(jí)數(shù)值定義,我總結(jié)了其他常見(jiàn)RTOS的定義,做下對(duì)比,加深理解和記憶:

RTOS名稱 優(yōu)先級(jí)數(shù)值范圍 優(yōu)先級(jí)數(shù)值的定義
freeRTOS 0 - (configMAX_PRIORITIES-1) 數(shù)值越小,優(yōu)先級(jí)越低
AliOS 0 - 61 數(shù)值越小,優(yōu)先級(jí)越高
uCOS 0 - OSLOWESTPRIO 數(shù)值越小,優(yōu)先級(jí)越高
RT-Thread 0 - 255 數(shù)值越小,優(yōu)先級(jí)越高
threadx 0 - (TXMAXPRIORITIES-1) 數(shù)值越小,優(yōu)先級(jí)越高
huawei lite os 0 - 31 數(shù)值越小,優(yōu)先級(jí)越高
Oneos 0 - (OSTASKPRIORITY_MAX-1) 數(shù)值越小,優(yōu)先級(jí)越高
tencent tiny os 0 - (TOSCFGTASKPRIOMAX-1) 數(shù)值越小,優(yōu)先級(jí)越低

看到這里,大家一定感慨,就只有freeRTOS獨(dú)一檔的存在,只有它是數(shù)值越小,優(yōu)先級(jí)越低! 這里提醒下大家,如果你從其他RTOS平臺(tái)遷移到freeRTOS平臺(tái),尤其注意下優(yōu)先級(jí)數(shù)值的問(wèn)題,否則可能會(huì)導(dǎo)致莫名其妙的問(wèn)題。

5 更多分享

歡迎關(guān)注我的github倉(cāng)庫(kù)01workstation,日常分享一些開(kāi)發(fā)筆記和項(xiàng)目實(shí)戰(zhàn),歡迎指正問(wèn)題。

同時(shí)也非常歡迎關(guān)注我的專欄:有問(wèn)題的話,可以跟我討論,知無(wú)不答,謝謝大家。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8363

    瀏覽量

    150539
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    808

    瀏覽量

    119296
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61858
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    freeRTOS開(kāi)發(fā)筆記】記一次坑爹的freeTOS升級(jí)

    freeRTOS開(kāi)發(fā)筆記】記一次坑爹的freeTOS-v9.0.0升級(jí)到freeRTOS-v10.4.4
    的頭像 發(fā)表于 07-11 09:15 ?4428次閱讀
    【<b class='flag-5'>freeRTOS</b><b class='flag-5'>開(kāi)發(fā)筆記</b>】記一次坑爹的freeTOS升級(jí)

    FreeRTOS中的任務(wù)管理

    任務(wù)FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨(dú)立運(yùn)行。FreeRTOS 中的任務(wù)是基于優(yōu)先級(jí)的搶占式調(diào)度,
    的頭像 發(fā)表于 11-27 17:03 ?884次閱讀

    轉(zhuǎn):第13章 FreeRTOS任務(wù)優(yōu)先級(jí)修改及其分配方案

    configMAX_PRIORITIES– 1。比如我們配置此宏定義為5,那么用戶可以使用的優(yōu)先級(jí)號(hào)是0,1,2,3,4,不包含5,對(duì)于這一點(diǎn),初學(xué)者要特別的注意。u 用戶配置任務(wù)優(yōu)先級(jí)數(shù)值越小,那么此
    發(fā)表于 08-29 11:07

    freeRTOS任務(wù)優(yōu)先級(jí)設(shè)置問(wèn)題如何解決

    、狀態(tài)的刷新。3、串口通信任務(wù)------接收上位機(jī)的指令,并執(zhí)行相應(yīng)動(dòng)作,返回相關(guān)數(shù)據(jù)。4、數(shù)據(jù)采樣任務(wù)------對(duì)信號(hào)脈沖計(jì)數(shù)。比如一個(gè)完整的操作過(guò)程就是:按鍵控制進(jìn)入檢測(cè)界面——>按鍵控制啟動(dòng)檢測(cè)——>上位機(jī)通過(guò)串口讀取當(dāng)前檢測(cè)數(shù)據(jù)。請(qǐng)問(wèn)該如何設(shè)置
    發(fā)表于 06-10 04:36

    FreeRTOS任務(wù)調(diào)度優(yōu)先級(jí),會(huì)直接在就緒列表中調(diào)用低優(yōu)先級(jí)任務(wù)么?

    由于剛開(kāi)始使用FreeRTOS,所以有很多問(wèn)題,也正在學(xué)習(xí)。請(qǐng)問(wèn)各位,假如優(yōu)先級(jí)高的任務(wù)時(shí)間片用完后,會(huì)直接在就緒列表中調(diào)用低優(yōu)先級(jí)任務(wù)么?假設(shè):Task_A
    發(fā)表于 06-14 09:01

    stm32cube創(chuàng)建任務(wù)優(yōu)先級(jí)與xTaskCreate的區(qū)別是什么

    請(qǐng)教一下,freertos中,為什么stm32cube創(chuàng)建的工程里,任務(wù)優(yōu)先級(jí)只有下面這幾種:而使用xTaskCreate創(chuàng)建
    發(fā)表于 06-15 09:00

    FREERTOS任務(wù)優(yōu)先級(jí)的設(shè)置

    FREERTOS中,各個(gè)任務(wù)優(yōu)先級(jí)怎么設(shè)置比較好呢?或者是說(shuō)有什么標(biāo)準(zhǔn)?疑惑中。。。。。。
    發(fā)表于 07-19 08:03

    FreeRTOS中斷優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)架構(gòu)的相關(guān)資料推薦

    ,于是便有了這篇筆記,本篇文章以Cortex-M3(STM32F103)為例子。目錄FreeRTOS中斷優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)1.Cortex-
    發(fā)表于 02-08 06:36

    對(duì)FreeRTOS任務(wù)的使用

    FreeRTOS最基本的任務(wù)操作就是任務(wù)創(chuàng)建與刪除,其API如下表:1.1動(dòng)態(tài)任務(wù)創(chuàng)建xTask
    發(fā)表于 02-18 07:14

    freertos怎么在任務(wù)中修改任務(wù)優(yōu)先級(jí)

    freertos怎么在任務(wù)中修改任務(wù)優(yōu)先級(jí)
    發(fā)表于 10-11 07:56

    2.FreeRTOS中斷優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)

    ,于是便有了這篇筆記,本篇文章以Cortex-M3(STM32F103)為例子。目錄FreeRTOS中斷優(yōu)先級(jí)任務(wù)優(yōu)先級(jí)1.Cortex-
    發(fā)表于 12-04 20:21 ?9次下載
    2.<b class='flag-5'>FreeRTOS</b>中斷<b class='flag-5'>優(yōu)先級(jí)</b>和<b class='flag-5'>任務(wù)</b><b class='flag-5'>優(yōu)先級(jí)</b>

    #FreeRTOS學(xué)習(xí)筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛

    FreeRTOS最基本的任務(wù)操作就是任務(wù)創(chuàng)建與刪除,其API如下表:1.1動(dòng)態(tài)任務(wù)創(chuàng)建xTask
    發(fā)表于 12-23 19:56 ?2次下載
    #<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)<b class='flag-5'>筆記</b>(二):<b class='flag-5'>任務(wù)</b><b class='flag-5'>創(chuàng)建</b>/刪除,掛起/解掛

    FreeRTOS任務(wù)優(yōu)先級(jí)示例

    任務(wù)優(yōu)先級(jí):0~24之間。數(shù)字越大,任務(wù)優(yōu)先等級(jí)越高。高優(yōu)先級(jí)任務(wù)
    的頭像 發(fā)表于 09-15 11:13 ?2684次閱讀

    FreeRTOS任務(wù)狀態(tài)與任務(wù)優(yōu)先級(jí)

    處理器的話那么不管在任何時(shí)刻永遠(yuǎn)都只有一個(gè)任務(wù)處于運(yùn)行態(tài)。 ● 就緒態(tài) 處于就緒態(tài)的任務(wù)是那些已經(jīng)準(zhǔn)備就緒(這些任務(wù)沒(méi)有被阻塞或者掛起),可以運(yùn)行的任務(wù),但是處于就緒態(tài)的
    的頭像 發(fā)表于 09-28 11:10 ?1024次閱讀
    <b class='flag-5'>FreeRTOS</b>中<b class='flag-5'>任務(wù)</b>狀態(tài)與<b class='flag-5'>任務(wù)</b><b class='flag-5'>優(yōu)先級(jí)</b>

    freertos中斷優(yōu)先級(jí)在哪設(shè)置

    FreeRTOS是一個(gè)流行的實(shí)時(shí)操作系統(tǒng),它廣泛應(yīng)用于嵌入式系統(tǒng)開(kāi)發(fā)。在FreeRTOS中,中斷優(yōu)先級(jí)是一個(gè)重要的概念,因?yàn)樗鼪Q定了中斷處理的順序和響應(yīng)時(shí)間。 1. 理解中斷
    的頭像 發(fā)表于 09-02 14:17 ?395次閱讀