在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

FreeRTOS中osDelay和HAL_Delay的區(qū)別

撞上電子 ? 2023-10-29 08:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

問(wèn)題場(chǎng)景

FreeRTOS中創(chuàng)建了線程A、線程B,其中線程A優(yōu)先級(jí)大于線程B。線程A、B任務(wù)代碼如下:

void A(void *argument)
{
while (1)
{
printf("A\r\n");
HAL_Delay(1000);
}
}

void B(void *argument)
{
while (1)
{
printf("B\r\n");
HAL_Delay(1000);
}
}

燒錄程序后查看串口數(shù)據(jù)發(fā)現(xiàn)只打印了A而不打印B,說(shuō)明只執(zhí)行了A線程沒(méi)有執(zhí)行B線程。

問(wèn)題原因

HAL_Delay是由ST提供的STM32 Cube HAL庫(kù)中的一個(gè)函數(shù),通常用于在STM32微控制器上實(shí)現(xiàn)簡(jiǎn)單的延時(shí)。HAL_Delay函數(shù)使用系統(tǒng)時(shí)鐘來(lái)進(jìn)行延時(shí),并且在延時(shí)期間會(huì)阻塞整個(gè)處理器,也就是說(shuō),它會(huì)使處理器暫時(shí)停止執(zhí)行其他任務(wù)和代碼。

在開(kāi)始運(yùn)行線程之前,線程A、B處于就緒態(tài),由于線程A優(yōu)先級(jí)比線程B高,F(xiàn)reeRTOS任務(wù)控制器優(yōu)先選擇線程A運(yùn)行,此時(shí)線程A進(jìn)入運(yùn)行態(tài)。隨后線程A打印A,然后被HAL_Delay函數(shù)"阻塞",注意此時(shí)的"阻塞"并不意味著程序進(jìn)入了阻塞態(tài),由于HAL_Delay阻塞的是整個(gè)處理器,因此FreeRTOS無(wú)法進(jìn)行其他線程的調(diào)度,也就是說(shuō),HAL_Delay同時(shí)阻塞了線程B。當(dāng)HAL_Delay函數(shù)運(yùn)行結(jié)束后,線程A重回就緒態(tài),由于線程A優(yōu)先級(jí)比線程B高,F(xiàn)reeRTOS任務(wù)控制器優(yōu)先選擇線程A運(yùn)行,循環(huán)往復(fù),線程B不被執(zhí)行。

解決辦法

osDelay是FreeRTOS(Real-Time Operating System)中的一個(gè)函數(shù),用于實(shí)現(xiàn)任務(wù)的延時(shí)。FreeRTOS是一個(gè)開(kāi)源的實(shí)時(shí)操作系統(tǒng),專門用于嵌入式系統(tǒng)。osDelay函數(shù)允許任務(wù)掛起一段時(shí)間,然后由操作系統(tǒng)調(diào)度器在指定的時(shí)間后重新運(yùn)行該任務(wù)。在等待期間,任務(wù)會(huì)被放入掛起狀態(tài),讓其他任務(wù)有機(jī)會(huì)運(yùn)行。

也就是說(shuō),當(dāng)調(diào)用osDelay時(shí),線程A進(jìn)入阻塞態(tài),此時(shí)任務(wù)控制器選擇進(jìn)入就緒態(tài)的線程B執(zhí)行,循環(huán)往復(fù),線程A、B同時(shí)被執(zhí)行。我們可以將任務(wù)A和B進(jìn)行如下改動(dòng),即可看到既打印A又打印B。

void A(void *argument)
{
while (1)
{
printf("A\r\n");
osDelay(1000);
}
}

void B(void *argument)
{
while (1)
{
printf("B\r\n");
osDelay(1000);
}
}

使用osDelay可能帶來(lái)的問(wèn)題

觀察一下HAL_Delay和osDelay的函數(shù)原型:

/**
* @brief This function provides minimum delay (in milliseconds) based
*/
__weak void HAL_Delay(uint32_t Delay);

/*
Wait for Timeout (Time Delay).
*/
osStatus_t osDelay (uint32_t ticks);

可以看到HAL_Delay函數(shù)的目的是提供毫秒級(jí)別的延時(shí),意味著當(dāng)你輸入HAL_Delay(500),硬件會(huì)盡量延時(shí)精確到500ms的時(shí)間。

與之不同的是,osDelay函數(shù)的輸入是ticks。ticks是一個(gè)計(jì)時(shí)單位,表示任務(wù)將被掛起的時(shí)間長(zhǎng)度。每個(gè)tick的時(shí)間取決于FreeRTOS配置的時(shí)鐘節(jié)拍(tick)周期。例如,如果tick周期為1毫秒,那么傳遞參數(shù)ticks為10就會(huì)使任務(wù)掛起10毫秒。由此可見(jiàn),osDelay函數(shù)延時(shí)的時(shí)間和一個(gè)ticks記時(shí)時(shí)間長(zhǎng)度有很大關(guān)系。

那么如何確定ticks具體代表多長(zhǎng)時(shí)間呢?首先我們應(yīng)該找到用于配置的頭文件,通常這個(gè)頭文件名字叫做FreeRTOSConfig.h。其中,configTICK_RATE_HZ配置選項(xiàng)的值表示每秒鐘系統(tǒng)時(shí)鐘節(jié)拍(tick)的數(shù)量。configTICK_RATE_HZ的值一般默認(rèn)被設(shè)置為1000,表示系統(tǒng)時(shí)鐘每秒產(chǎn)生1000個(gè)tick,即每個(gè)tick的時(shí)間間隔為1毫秒,此時(shí)osDelay對(duì)單個(gè)任務(wù)延時(shí)的時(shí)間長(zhǎng)度和HAL_Delay近似。

聲明:本文內(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)注

    117

    文章

    3826

    瀏覽量

    82834
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    848

    瀏覽量

    121062
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    492

    瀏覽量

    64190
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20181
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    詳解FreeRTOS與SAFERTOS的區(qū)別

    開(kāi)源免費(fèi)的FreeRTOS由Richard Barry在WHIS工作時(shí)創(chuàng)建,WHIS基于FreeRTOS的功能模型,通過(guò)完整的HAZOP分析,確定了功能模型和API的所有的弱點(diǎn),減輕所有薄弱環(huán)節(jié),并采用IEC 61508 SI
    的頭像 發(fā)表于 06-04 16:58 ?303次閱讀
    詳解<b class='flag-5'>FreeRTOS</b>與SAFERTOS的<b class='flag-5'>區(qū)別</b>

    cubemx生成HAL庫(kù)+FreeRTOS,當(dāng)編寫程序時(shí)卻代碼無(wú)法自動(dòng)提示怎么解決?

    各位佬,請(qǐng)問(wèn)一下,我用的是cubemx生成HAL庫(kù)+FreeRTOS,編譯時(shí)并沒(méi)有錯(cuò)誤,但當(dāng)我編寫程序時(shí)卻代碼無(wú)法自動(dòng)提示(我設(shè)置好了),并且連uint8_t這種變量也不會(huì)變成藍(lán)色,當(dāng)我查看工程文件
    發(fā)表于 03-12 08:21

    STM32C031C6在按鍵中斷處理程序中使用HAL_Delay()延時(shí)函數(shù),程序則無(wú)法運(yùn)行怎么解決?

    測(cè)試STM32C031C6開(kāi)發(fā)板的長(zhǎng)短按鍵,在按鍵中斷處理程序中使用HAL_Delay()延時(shí)函數(shù),程序則無(wú)法運(yùn)行,類似進(jìn)入了死循環(huán),于是則添加了延時(shí)函數(shù)如下: /[i
    發(fā)表于 03-07 06:50

    關(guān)于freertos任務(wù)usb文件系統(tǒng)寫入數(shù)據(jù)的問(wèn)題

    請(qǐng)問(wèn)一下,我用freertos系統(tǒng)的定時(shí)器,sendtime++滿500的時(shí)候執(zhí)行usb文件系統(tǒng)寫入數(shù)據(jù)的函數(shù)Flash_Write();這個(gè)函數(shù)需要300多ms跑完,按理來(lái)說(shuō)他就算300多ms
    發(fā)表于 02-20 20:55

    【正點(diǎn)原子STM32H7R3開(kāi)發(fā)套件試用體驗(yàn)】流水燈

    , GPIO_Pin_0); HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0); HAL_Delay(200); HAL_GPIO_TogglePin(GPIOD
    發(fā)表于 12-28 18:51

    HAL庫(kù)在嵌入式系統(tǒng)的應(yīng)用

    HAL庫(kù)(Hardware Abstraction Layer Library,硬件抽象層庫(kù))在嵌入式系統(tǒng)扮演著至關(guān)重要的角色。以下是HAL庫(kù)在嵌入式系統(tǒng)的應(yīng)用的分析: 一、
    的頭像 發(fā)表于 12-02 11:32 ?2009次閱讀

    ADS1259轉(zhuǎn)換結(jié)果一直比輸入真實(shí)值小5.525倍左右,是什么原因?qū)е碌难剑?/a>

    ADS1259_INIT(void) { HAL_Delay(20); ADS1259_RESET_H; ADS1259_START_H; ADS1259_CS_L; HAL_Delay(20
    發(fā)表于 11-20 08:25

    ADS1299內(nèi)部產(chǎn)生信號(hào)測(cè)試,SPI接收到的數(shù)據(jù)不對(duì),為什么?

    ;amp;amp;tmp,1,1000);//===fff===í£?1á?D??á?£ê? HAL_Delay(1000);LED1_TOGGLE();HAL
    發(fā)表于 11-13 06:23

    在rtthread啟動(dòng)函數(shù)調(diào)用HAL_Dealy()導(dǎo)致卡死的原因?

    看到文章推薦將系統(tǒng)的左右初始化都放入rt_hw_board_init()內(nèi),于是將所有初始化都搬進(jìn)去,結(jié)果由于內(nèi)部調(diào)用了Hal_Delay(),導(dǎo)致卡死,HAL庫(kù)的時(shí)鐘源被設(shè)置成TIM6,但是
    發(fā)表于 09-27 06:42

    使用STM32CubeMX對(duì)紅外波形進(jìn)行GPIO輸出,并LED顯示

    _GPIO_WritePin(LED_R_GPIO_Port,LED_R_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET); HAL_Delay(1000
    發(fā)表于 09-04 14:19

    STM32CUBEMX生成freeRTOS代碼的時(shí)候出現(xiàn)警告

    to use HAL timebase source other than the Systick. HAL函數(shù)如果是阻塞型呼叫,內(nèi)部會(huì)用到HAL_Delay(),FreeRTOS應(yīng)
    發(fā)表于 09-04 14:13

    freertos和rtos區(qū)別是什么

    FreeRTOS 和 RTOS(實(shí)時(shí)操作系統(tǒng))是兩個(gè)不同的概念,但它們之間有緊密的聯(lián)系。FreeRTOS 是一個(gè)特定的開(kāi)源實(shí)時(shí)操作系統(tǒng),而 RTOS 是實(shí)時(shí)操作系統(tǒng)的一般概念。 概念定義 RTOS
    的頭像 發(fā)表于 09-02 14:18 ?2936次閱讀

    freertos和裸機(jī)有什么區(qū)別

    FreeRTOS 和裸機(jī)編程是兩種不同的嵌入式系統(tǒng)開(kāi)發(fā)方法,它們?cè)谠O(shè)計(jì)理念、資源使用、功能實(shí)現(xiàn)等方面有著顯著的差異。 1. 基本概念 1.1 FreeRTOS FreeRTOS 是一個(gè)小型的、可裁剪
    的頭像 發(fā)表于 09-02 14:13 ?2945次閱讀

    cubeide中使用Hal_Delay()時(shí),每次調(diào)試總會(huì)跳轉(zhuǎn)到異常狀態(tài),如何解決?

    cubeide 中使用Hal_Delay()時(shí),每次調(diào)試總會(huì)跳轉(zhuǎn)到異常狀態(tài)。 Break at address \"0xaf5cf47e\" with no debug
    發(fā)表于 07-23 07:52

    請(qǐng)問(wèn)os_delay_us和vTaskDelay的區(qū)別是什么呢?

    請(qǐng)問(wèn)os_delay_us和vTaskDelay的區(qū)別是什么呢?
    發(fā)表于 07-10 07:32
    主站蜘蛛池模板: 国产女乱淫真高清免费视频 | 色淫阁色九九 | 色多多在线观看高清免费 | 欧美精品一区二区三区视频 | 全免费一级午夜毛片 | 久久久久久人精品免费费看 | 狠狠操狠狠插 | 中文字幕色网站 | 让她爽的喷水叫爽乱 | 黄色三级视频在线观看 | 亚洲第一狼人社区 | 一级特黄色片 | 91久久福利国产成人精品 | 国产精品夜色7777青苹果 | 四虎永久地址4hu紧急入口 | 夜天干天干啦天干天天爽 | 全黄性色大片 | 五月天婷婷色综合 | 天天爱天天做天天爽夜夜揉 | 四虎影视在线影院4hutv | 免费观看视频在线观看 | 黄色网址你懂得 | 色视频免费看 | 人人干人人上 | 欧美色影视 | 久久精品国产99精品国产2021 | 午夜男人天堂 | 色老头影视 | 天天在线综合网 | 欧美色综合高清视频在线 | 久久久精品波多野结衣 | 加勒比啪啪 | 免费网站你懂得 | 国产精品推荐天天看天天爽 | 亚洲欧美在线一区 | 四虎影院在线视频 | 夭天干天天做天天免费看 | 四虎影院最新网址 | 欧美一级高清黄图片 | 超大乳抖乳露双乳视频 | 狠狠五月天 |