哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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),專門(mén)用于嵌入式系統(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    3847

    瀏覽量

    85456
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    868

    瀏覽量

    123207
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    499

    瀏覽量

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

    關(guān)注

    0

    文章

    510

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    RK3576平臺(tái)Android HAL層故障排查:從lshal命令看透問(wèn)題本質(zhì)

    ? ? ? 在 Android 嵌入式開(kāi)發(fā)HAL (硬件抽象層)是連接系統(tǒng)框架與硬件驅(qū)動(dòng)的核心橋梁,一旦 HAL 層出問(wèn)題,音頻、藍(lán)牙、傳感器等硬件功能都會(huì)直接 “ 罷工 ” 。而
    的頭像 發(fā)表于 02-06 07:12 ?587次閱讀
    RK3576平臺(tái)Android <b class='flag-5'>HAL</b>層故障排查:從lshal命令看透問(wèn)題本質(zhì)

    【正點(diǎn)原子STM32N647開(kāi)發(fā)板試用】+ 圖片+中文顯示

    ;, RED); HAL_Delay(1500); rgblcd_clear(WHITE); 字庫(kù)和圖片都要放在TF卡,字庫(kù)放在TF卡根目錄下.\\\\SYSTEM\\\\FONT,圖片放在TF卡
    發(fā)表于 01-31 18:24

    TDK Joystick Evaluation Platform:HAL 3900的全方位解析

    TDK Joystick Evaluation Platform:HAL 3900的全方位解析 在電子設(shè)備的設(shè)計(jì)與開(kāi)發(fā),傳感器的應(yīng)用至關(guān)重要,尤其是在操縱桿等設(shè)備,精確的位置和角度檢測(cè)能夠極大
    的頭像 發(fā)表于 12-26 11:35 ?610次閱讀

    【道生物聯(lián)TKB-623評(píng)估板試用】——3.TKB-623評(píng)估板連接STM32發(fā)送數(shù)據(jù)

    ;); HAL_Delay(3000); printf(\"復(fù)位芯片 \\\\r\\\\n\"); while(TK8620_SendCmd(\"AT\\\\r\\\\n\"
    發(fā)表于 11-17 14:44

    立即在GitHub上搶先體驗(yàn)面向STM32U5的最新STM32Cube HAL更新

    其滿足您的需求。 如何獲取預(yù)覽版本 面向STM32U5系列的STM32Cube HAL2預(yù)覽版已在GitHub代碼庫(kù)STM32CubeU5-V2-Preview開(kāi)放。 更新后的HAL2有哪些新功能?
    的頭像 發(fā)表于 10-20 17:12 ?1232次閱讀

    【CPKCOR-RA8D1】+ 2.串口輸出測(cè)試

    ;); HAL_Delay(200); } #if BSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif } 6.編譯代碼 7.燒錄代碼 8.打開(kāi)串口助手 可以看到串口打印正常 測(cè)試完畢?。。。。。?
    發(fā)表于 09-24 19:39

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

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

    制作STM32H743VIT6的BSP包燒錄后板子沒(méi)反應(yīng),進(jìn)行debug時(shí)會(huì)卡死的原因?怎么解決?

    , PIN_HIGH); HAL_Delay(50); rt_pin_write(18, PIN_LOW); rt_pin_write(45, PIN_LOW); HAL_Delay(50); } return RT_EOK; }
    發(fā)表于 09-15 06:43

    【RA4M2-SENSOR】開(kāi)箱 + 開(kāi)發(fā)環(huán)境配置 + 點(diǎn)燈

    ,BSP_IO_LEVEL_LOW); HAL_Delay(500); g_ioport.p_api->pinWrite(&g_ioport_ctrl
    發(fā)表于 09-01 17:47

    【RA4M2-SENSOR】—— 16.完結(jié)篇《使用AT指令通過(guò)MQTT遠(yuǎn)程控制RA4M2-SENSOR》

    \\\\n\",U2_RxBuff);//debug--- user_uart0_clear(); return 0; } } HAL_Delay(10); } return 1
    發(fā)表于 09-01 14:31

    【RA4M2-SENSOR】—— 15. 使用AT指令連接到MQTT云服務(wù)器上傳數(shù)據(jù)

    \\\\n\",U2_RxBuff);//debug--- user_uart0_clear(); return 0; } } HAL_Delay(10); } return 1
    發(fā)表于 09-01 13:56

    【RA4E2開(kāi)發(fā)板評(píng)測(cè)】4.RA4E2 移植coremark跑分性能測(cè)試

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

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開(kāi)始進(jìn)行線程調(diào)度;當(dāng)沒(méi)有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒(méi)有選用RTOS的,因此,用戶程序從
    的頭像 發(fā)表于 07-25 15:34 ?2211次閱讀

    詳解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 ?1129次閱讀
    詳解<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次下載
    江都市| 桐庐县| 临泽县| 循化| 迁西县| 长子县| 大化| 镇雄县| 措勤县| 咸宁市| 定远县| 保定市| 马关县| 鲁山县| 晋城| 香格里拉县| 汤原县| 敦煌市| 长沙市| 赤峰市| 巴青县| 三明市| 博湖县| 英山县| 岫岩| 长岛县| 墨竹工卡县| 滨州市| 卓尼县| 海安县| 永寿县| 西乌珠穆沁旗| 达尔| 依安县| 崇左市| 房产| 新余市| 黎平县| 西藏| 安图县| 永安市|