亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

問題場景

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

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,說明只執(zhí)行了A線程沒有執(zhí)行B線程。

問題原因

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

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

解決辦法

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

也就是說,當調(diào)用osDelay時,線程A進入阻塞態(tài),此時任務控制器選擇進入就緒態(tài)的線程B執(zhí)行,循環(huán)往復,線程A、B同時被執(zhí)行。我們可以將任務A和B進行如下改動,即可看到既打印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可能帶來的問題

觀察一下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ù)的目的是提供毫秒級別的延時,意味著當你輸入HAL_Delay(500),硬件會盡量延時精確到500ms的時間。

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

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

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

    關(guān)注

    117

    文章

    3834

    瀏覽量

    84641
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    860

    瀏覽量

    122446
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    496

    瀏覽量

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

    關(guān)注

    0

    文章

    508

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    在rtthread的main函數(shù)里用HAL_Delay函數(shù)不起作用是哪里的問題?

    在rtthread的main函數(shù)里用HAL_Delay函數(shù)無效,我設(shè)置延時500ms打印一次,但是實際上,一秒打印了幾百次,很顯然是HAL_Delay出現(xiàn)了問題。用RT_thread_mdelay
    發(fā)表于 09-15 07:53

    【RA4E2開發(fā)板評測】4.RA4E2 移植coremark跑分性能測試

    ) { SerialDecode(); /* switch(key_count) { case 1: led2_off(); led1_on();HAL_Delay(200); led1_off
    發(fā)表于 08-25 13:10

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

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

    HAL15xy_SOT23

    HAL1501SU-A,HAL1502SU-A,HAL1503SU-A,HAL1504SU-A,HAL1505SU-A,
    發(fā)表于 05-14 15:03 ?0次下載

    cubemx生成HAL庫+FreeRTOS,當編寫程序時卻代碼無法自動提示怎么解決?

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

    cubemx生成的freertos代碼在keil ac6下不能編譯,怎么解決?

    ../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM3portmacro.h(167): error: unknown
    發(fā)表于 03-12 08:19

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

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

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

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

    【正點原子STM32H7R3開發(fā)套件試用體驗】流水燈

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

    HAL庫和標準庫的區(qū)別 HAL庫與CMSIS的關(guān)系

    在嵌入式系統(tǒng)開發(fā),HAL(硬件抽象層)庫和標準庫是兩種常用的軟件庫,它們在功能和使用場景上有所不同。 1. 標準庫 標準庫,通常指的是C語言標準庫,也稱為libc,是一組預定義的函數(shù),提供了
    的頭像 發(fā)表于 12-02 14:02 ?4151次閱讀

    HAL庫在STM32開發(fā)的重要性

    HAL庫(Hardware Abstraction Layer Library,硬件抽象層庫)在STM32開發(fā)扮演著至關(guān)重要的角色。以下是HAL庫在STM32開發(fā)的重要性分析: 一
    的頭像 發(fā)表于 12-02 13:35 ?1734次閱讀

    如何快速入門HAL庫編程 HAL庫與裸機編程的比較

    如何快速入門HAL庫編程 要快速入門HAL庫編程,可以遵循以下步驟: 了解基礎(chǔ)知識 : 掌握C語言編程基礎(chǔ),包括變量、數(shù)據(jù)類型、函數(shù)、指針等。 了解嵌入式系統(tǒng)的基本概念,如微控制器、中斷、外設(shè)等
    的頭像 發(fā)表于 12-02 11:39 ?1601次閱讀

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

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

    ADS1259轉(zhuǎn)換結(jié)果一直比輸入真實值小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)生信號測試,SPI接收到的數(shù)據(jù)不對,為什么?

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