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

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

    文章

    3787

    瀏覽量

    81038
  • RTOS
    +關注

    關注

    22

    文章

    813

    瀏覽量

    119631
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62172
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19682
收藏 人收藏

    評論

    相關推薦

    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

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

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

    FreeRTOS串口重定向使用HAL庫函數中斷出現異常的原因?

    由于需要使用到FreeRTOS 考慮到ISR優先級會比任務優先級高,并且查看HAL_UART_Transmit函數實現需要使用到systick 。 所以在重定義時使用了函數
    發表于 05-22 08:18

    基于STM32Cubemx創建FreeRTOS,創建UART任務遇到的兩個問題求解

    ) != HAL_OK) { Error_Handler(); } } 主程序UART任務如下: void Uart_test_Thread() { for(;;) { //osDelay
    發表于 05-10 07:33

    stm32cubemx的HAL_Delay()函數,當HAL_GetTick()的計數正好要溢出時,是不是延時就不準了?

    ; } __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0; tickstart = HAL
    發表于 05-09 06:20

    HAL庫開啟定時器中斷時會卡死程序的原因?

    當開啟定時器中斷時候,開啟定時器時會卡死程序,調試,全速運行卡死在-HAL_TIM_Base_Start_IT函數,單步調試發現卡死在程序應用的HAL_delay函數內,但是另外寫一個定時器中斷和使用延時的程序不會卡死,求助各位大佬,這可能是什么原因!!
    發表于 04-16 07:12

    STM32CubeIDE+FreeRtos+LWIP初始化不通過怎么解決?

    MX_LAIP_Init就過不去。調試代碼,發現HAL_Delay();函數出現錯誤。上網查了下,也有人碰到過,重構解決。然后還是過不去,調試發現創建任務時又出現了問題,卡在添加新鏈表上,不知道原因。大家這么用的時候,有沒有碰到過類似的問題,或者初始化的應該注意什么。
    發表于 04-15 07:42

    STM32L476+ST253993增加freertos,但是代碼下進去系統運行時就卡住,為什么?

    。rtos使用systick,HAL_delay使用TIM7 freertos的兩個任務,一個是LED閃爍,一個是RFID測試程序 第一次執行時,任務2的第一個測試代碼完成后,到osdelay里就出不來了
    發表于 04-15 07:27

    STM32F7 IAP跳轉后HAL_Delay沒有執行的原因?

    ;!!!!!!!!!inintt okrn\"); MX_TIM14_Init(); HAL_Delay(5); printf(\"!!!!!!!!!dddrn\"); while(1
    發表于 04-09 06:53

    stm32FREERTOS的延時函數osDelayUntil()死機的原因?

    我在使用STM32F4跑freertos的時候發現一旦使用osDelayUntil()函數,就會死機,但是用osDelay()函數就不會,按理說不是都可以用的嗎?有知道原因的嗎,謝謝!
    發表于 03-22 07:56

    STM32F767ZGT6改IAP后HAL_Delay卡死,定時器不進中斷,直到freeRTOS初始化才開始中斷,為什么?

    以后程序卡在HAL_Delay里,在定時器中斷中加串口打印發現應該是定時器一直沒有開啟導致計數,應該MX_FREERTOS_Init()以及osKernelStart執行完以后才開啟的定時器, 我把
    發表于 03-21 06:13

    STM32燒寫程序后出現Break at address\"0x1ff0a752\",程序卡死怎么解決?

    ); HAL_Delay(100); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOF
    發表于 03-12 06:36

    基于STM32CubeIDE軟件實現的STM32外部中斷實例

    因為PE2配置為GPIO_EXTI2斷,它出現在了列表。同時出現的還有SysTick,它是HAL_Delay的時基來源,如下圖note處所說的,每隔一個固定時間產生一次中斷。
    發表于 01-12 16:15 ?1631次閱讀
    基于STM32CubeIDE軟件實現的STM32外部中斷實例
    主站蜘蛛池模板: 亚洲三区视频| 婷婷五月五| 成 人 免费 网站| 国产精品情人露脸在线观看| 4虎影视国产在线观看精品| 天天操综合网| 影音先锋在线亚洲精品推荐| 无码一区二区三区视频| 男人日女人的网站| 5555kkkk香蕉在线观看| 亚洲一区免费在线| 亚洲成人在线免费| 欧美三级在线观看视频| 国产二区三区| 天天爽夜夜爽视频| bt天堂在线观看| 我被黑人巨大开嫩苞在线观看| 国产老肥熟xxxx| 永久网站色视频在线观看免费| jlzz日本| 特级全毛片| 色在线免费观看| 国内一级毛片| 成人a大片高清在线观看| 5g影院午夜伴侣| 日韩精品一级毛片| www.激情.com| 国产精品福利视频手机免费观看| 6080国产午夜精品| 免费v片网站| 日本一区二区高清免费不卡| 国产乱淫a∨片免费视频| 清纯漂亮小美女准备啪啪| 精品久草| 性欧美极品另类| 三级黄网站| 在线色综合| 操女人网址| 可以免费观看的黄色网址| 手机福利在线观看| 日本一区二区不卡视频|