女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

FreeRTOS中osDelay和HAL_Delay的區別

撞上電子 ? 2023-10-29 08:00 ? 次閱讀

問題場景

FreeRTOS中創建了線程A、線程B,其中線程A優先級大于線程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);
}
}

燒錄程序后查看串口數據發現只打印了A而不打印B,說明只執行了A線程沒有執行B線程。

問題原因

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

在開始運行線程之前,線程A、B處于就緒態,由于線程A優先級比線程B高,FreeRTOS任務控制器優先選擇線程A運行,此時線程A進入運行態。隨后線程A打印A,然后被HAL_Delay函數"阻塞",注意此時的"阻塞"并不意味著程序進入了阻塞態,由于HAL_Delay阻塞的是整個處理器,因此FreeRTOS無法進行其他線程的調度,也就是說,HAL_Delay同時阻塞了線程B。當HAL_Delay函數運行結束后,線程A重回就緒態,由于線程A優先級比線程B高,FreeRTOS任務控制器優先選擇線程A運行,循環往復,線程B不被執行。

解決辦法

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

也就是說,當調用osDelay時,線程A進入阻塞態,此時任務控制器選擇進入就緒態的線程B執行,循環往復,線程A、B同時被執行。我們可以將任務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的函數原型:

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

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

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

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

    關注

    117

    文章

    3820

    瀏覽量

    82384
  • RTOS
    +關注

    關注

    24

    文章

    840

    瀏覽量

    120743
  • FreeRTOS
    +關注

    關注

    12

    文章

    488

    瀏覽量

    63725
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    20070
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

    關于freertos任務usb文件系統寫入數據的問題

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

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

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

    HAL庫在STM32開發的重要性

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

    HAL庫在嵌入式系統的應用

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

    ADS1259轉換結果一直比輸入真實值小5.525倍左右,是什么原因導致的呀?

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

    ADS1299內部產生信號測試,SPI接收到的數據不對,為什么?

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

    在rtthread啟動函數調用HAL_Dealy()導致卡死的原因?

    看到文章推薦將系統的左右初始化都放入rt_hw_board_init()內,于是將所有初始化都搬進去,結果由于內部調用了Hal_Delay(),導致卡死,HAL庫的時鐘源被設置成TIM6,但是
    發表于 09-27 06:42

    STM32CUBEMX生成freeRTOS代碼的時候出現警告

    to use HAL timebase source other than the Systick. HAL函數如果是阻塞型呼叫,內部會用到HAL_Delay(),FreeRTOS
    發表于 09-04 14:13

    freertos和rtos區別是什么

    FreeRTOS 和 RTOS(實時操作系統)是兩個不同的概念,但它們之間有緊密的聯系。FreeRTOS 是一個特定的開源實時操作系統,而 RTOS 是實時操作系統的一般概念。 概念定義 RTOS
    的頭像 發表于 09-02 14:18 ?2623次閱讀

    freertos和裸機有什么區別

    FreeRTOS 和裸機編程是兩種不同的嵌入式系統開發方法,它們在設計理念、資源使用、功能實現等方面有著顯著的差異。 1. 基本概念 1.1 FreeRTOS FreeRTOS 是一個小型的、可裁剪
    的頭像 發表于 09-02 14:13 ?2759次閱讀

    cubeide中使用Hal_Delay()時,每次調試總會跳轉到異常狀態,如何解決?

    cubeide 中使用Hal_Delay()時,每次調試總會跳轉到異常狀態。 Break at address \"0xaf5cf47e\" with no debug
    發表于 07-23 07:52

    請問os_delay_us和vTaskDelay的區別是什么呢?

    請問os_delay_us和vTaskDelay的區別是什么呢?
    發表于 07-10 07:32

    使用MCSDK的位置控制來操控直線電機,電機無法啟動的原因?

    ) { MC_ProgramPositionCommandMotor1(3.14/2,0.9);HAL_Delay(2000);MC_ProgramPositionCommandMotor1(-3.14/2,0.9);HAL_Delay(2000
    發表于 06-03 06:49