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

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

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

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

揭秘RTOS任務(wù)入口函數(shù)執(zhí)行完之后去哪里了

strongerHuang ? 來(lái)源:Mculover666 ? 作者:mculover666 ? 2021-11-05 14:20 ? 次閱讀

1. 說(shuō)明

在工作過(guò)程中,我發(fā)現(xiàn)在實(shí)際使用RTOS完成項(xiàng)目時(shí),理解這些知識(shí)僅能達(dá)到會(huì)用RTOS的水平,要想用好RTOS,還需要了解一些比較細(xì)節(jié)的機(jī)制,否則容易掉坑進(jìn)去,花大量時(shí)間定位問(wèn)題。

本文結(jié)合TencentOS-Tiny實(shí)時(shí)操作系統(tǒng)給大家講述一下相關(guān)內(nèi)容。

2. 任務(wù)的通常寫(xiě)法

遵循“不使用就讓出”的原則,任務(wù)通常有兩種寫(xiě)法。

「阻塞等待」某個(gè)事件處理,等待到之后處理:

voidtask1_entry(void*arg)
{
//init...

while(1){
//1.waitsomekernelobject...
//eg.tos_sem_pend,tos_mutex_pend,tos_event_pend.

//2.waitsuccess,handle!
}
}

這種寫(xiě)法中,在沒(méi)有事件發(fā)生的時(shí)候,任務(wù)會(huì)因?yàn)榈却硞€(gè)內(nèi)核對(duì)象而被掛起,讓出CPU不參與調(diào)度。

② 定時(shí)執(zhí)行

voidtask1_entry(void*arg)
{
//init...

while(1){
//1.dosomething...

//2.sleep!
//eg.tos_task_delay,tos_sleep_ms.
}
}

這種寫(xiě)法中,任務(wù)在干完活之后,會(huì)主動(dòng)進(jìn)入睡眠狀態(tài),讓出CPU不參與調(diào)度。

3. 一次性任務(wù)

上面兩種寫(xiě)法的共性是都有主循環(huán),不需要考慮任務(wù)入口函數(shù)退出的情況,但在一些場(chǎng)景中任務(wù)只需要執(zhí)行一次即可:

voidtask1_entry(void*arg)
{
//init...

//dosomething...

//exit?
}

「這個(gè)時(shí)候就要思考一個(gè)問(wèn)題:任務(wù)入口函數(shù)執(zhí)行完畢之后去了哪里?」

4. 尋找答案

首先,「任務(wù)入口函數(shù)本質(zhì)上是一個(gè)函數(shù)」,跳轉(zhuǎn)函數(shù)的指令是BL,CPU在執(zhí)行該指令跳轉(zhuǎn)到某個(gè)函數(shù)執(zhí)行時(shí),會(huì)將當(dāng)前PC地址作為函數(shù)返回地址、加載到LR寄存器中、保證函數(shù)執(zhí)行完可以返回到這兒繼續(xù)執(zhí)行,再將函數(shù)地址加載到PC寄存器、程序接著執(zhí)行就到了函數(shù)中。

6cdb8e6e-3dfd-11ec-82a9-dac502259ad0.png

那么,任務(wù)入口函數(shù)沒(méi)有被別的函數(shù)主動(dòng)調(diào)用,是如何被拉起來(lái)執(zhí)行的呢?

任務(wù)切換分為兩步:保存上文、切換下文。切換下文就是指將保存在任務(wù)棧中的CPU寄存器組的值、加載到CPU中。

「所以,當(dāng)任務(wù)棧中初始保存的CPU寄存器組的值中、PC寄存器值為該任務(wù)的任務(wù)入口函數(shù)地址時(shí),切換下文加載之后,由于PC指向任務(wù)入口函數(shù),所以CPU接著運(yùn)行就到了任務(wù)入口函數(shù)中,也就是該任務(wù)在運(yùn)行。」

同樣的道理,「任務(wù)棧中初始保存的CPU寄存器組的值中、LR寄存器的值決定了、任務(wù)入口函數(shù)退出時(shí)候返回到哪里。」

由于不同CPU架構(gòu)的CPU寄存器組不同,所以初始化任務(wù)棧的代碼與架構(gòu)強(qiáng)相關(guān),在arch目錄下都有不同架構(gòu)對(duì)應(yīng)的實(shí)現(xiàn)。

這里我們以ARM Cortex-M4為例(Arm-v7m)看看代碼如何實(shí)現(xiàn):

6d302d48-3dfd-11ec-82a9-dac502259ad0.png

從代碼里可以看到,TencentOS-Tiny默認(rèn)退出函數(shù)為exit參數(shù)指定的值,接下來(lái)我們看看退出函數(shù)~

5. 任務(wù)退出函數(shù)

在創(chuàng)建任務(wù)的API tos_task_create 中,初始化任務(wù)棧的過(guò)程中會(huì)指定退出函數(shù)為 task_exit

task->sp=cpu_task_stk_init((void*)entry,arg,(void*)task_exit,stk_base,stk_size);

task_exit 函數(shù)主要完成銷毀自身的工作,具體實(shí)現(xiàn)如下:

__STATIC__voidtask_exit(void)
{
tos_task_destroy(K_NULL);
}

該銷毀函數(shù)傳入的參數(shù)為NULL表示銷毀自身,如果是靜態(tài)任務(wù)則按以下步驟銷毀(動(dòng)態(tài)任務(wù)銷毀值得用一篇文章去講述):

  • 將任務(wù)從就緒列表移除
  • 將任務(wù)從等待列表移除
  • 將任務(wù)從統(tǒng)計(jì)列表移除
  • 任務(wù)狀態(tài)置為K_TASK_STATE_DELETED

6. 總結(jié)

本文講述了任務(wù)的兩種常規(guī)寫(xiě)法,以及任務(wù)函數(shù)執(zhí)行完畢之后去了哪里?

當(dāng)任務(wù)函數(shù)執(zhí)行完畢退出時(shí),會(huì)執(zhí)行到哪里由任務(wù)棧初始化時(shí)LR寄存器的值決定,RTOS內(nèi)核都會(huì)提供一個(gè)默認(rèn)退出函數(shù),TencentOS-Tiny提供的任務(wù)退出函數(shù)中,會(huì)自動(dòng)銷毀任務(wù)自身。

所以在編寫(xiě)一次性任務(wù)時(shí),就不需要主動(dòng)調(diào)用銷毀API銷毀自身啦~

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

    31

    文章

    5423

    瀏覽量

    123431
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1563

    瀏覽量

    63560
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4371

    瀏覽量

    64241
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    842

    瀏覽量

    120791

原文標(biāo)題:RTOS 任務(wù)入口函數(shù)執(zhí)行完之后去哪里了?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    揭秘LuatOS:實(shí)時(shí)操作系統(tǒng)RTOS核心庫(kù)的關(guān)鍵技術(shù)剖析!

    電機(jī)控制、傳感器采集等實(shí)時(shí)數(shù)據(jù)處理場(chǎng)景。 在LuatOS開(kāi)發(fā)中, 用于實(shí)時(shí)操作系統(tǒng)(RTOS)相關(guān)功能的核心庫(kù) ——提供定時(shí)器管理、系統(tǒng)控制、內(nèi)存監(jiān)控、路徑配置等底層操作接口,為物聯(lián)網(wǎng)設(shè)備提供可靠的實(shí)時(shí)系統(tǒng)基礎(chǔ)支撐。 ? 本文以A
    的頭像 發(fā)表于 05-21 16:02 ?142次閱讀
    <b class='flag-5'>揭秘</b>LuatOS:實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>RTOS</b>核心庫(kù)的關(guān)鍵技術(shù)剖析!

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)RTOS中的一個(gè)關(guān)鍵特性,通過(guò)該函數(shù),用戶可以增強(qiáng)對(duì)任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?288次閱讀

    stm32cubemax為什么下載之后無(wú)法運(yùn)行?

    我本來(lái)想上傳代碼的,完全完全無(wú)法理解為什么下載之后無(wú)法運(yùn)行
    發(fā)表于 03-12 06:06

    RTOS中的本地存儲(chǔ)指針使用

    本地存儲(chǔ)指針是RTOS中的一個(gè)重要特性,增強(qiáng)了任務(wù)管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲(chǔ)是指存儲(chǔ)在本地的特定任務(wù)或?qū)ο蟮臄?shù)據(jù)。通常與任務(wù)
    的頭像 發(fā)表于 02-28 16:33 ?849次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲(chǔ)指針使用

    使用任務(wù)通知提高RTOS應(yīng)用的效率

    在實(shí)時(shí)嵌入式系統(tǒng)中,性能和資源效率是決定設(shè)計(jì)成敗的關(guān)鍵因素。傳統(tǒng)的實(shí)時(shí)操作系統(tǒng)(RTOS)提供了如隊(duì)列、信號(hào)量和事件組機(jī)制,實(shí)現(xiàn)任務(wù)之間的同步和通信。FreeRTOS/SAFERTOS還提供一種方法可以使這些過(guò)程更快、更輕量化,即任務(wù)
    的頭像 發(fā)表于 12-27 14:54 ?624次閱讀

    如何獲取入口函數(shù)不是__iar_program_start的Program entry的stack使用情況

    問(wèn)題 IAR中默認(rèn)的入口函數(shù)是__iar_program_start,使能stack usage analysis之后: 生成的map文件中STACK USAGE章節(jié)里面會(huì)包含Program
    的頭像 發(fā)表于 11-25 16:23 ?918次閱讀
    如何獲取<b class='flag-5'>入口</b><b class='flag-5'>函數(shù)</b>不是__iar_program_start的Program entry的stack使用情況

    MaXim96717 VPG功能啟用之后去哪里查看圖像

    MaXim96717 VPG功能啟用之后去哪里查看圖像
    發(fā)表于 11-01 10:42

    RTOS中鉤子函數(shù)的用途及用法

    在很多操作系統(tǒng)中,都存在這樣一類API函數(shù)接口:HOOK函數(shù)(也叫鉤子函數(shù))。
    的頭像 發(fā)表于 10-23 16:25 ?703次閱讀
    <b class='flag-5'>RTOS</b>中鉤子<b class='flag-5'>函數(shù)</b>的用途及用法

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

    (Real-Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種特殊的操作系統(tǒng),它能夠?yàn)閷?shí)時(shí)任務(wù)提供確定性的響應(yīng)時(shí)間。RTOS 通常用于嵌入式系統(tǒng),如工業(yè)自動(dòng)化、汽車電子、醫(yī)療設(shè)備等領(lǐng)域
    的頭像 發(fā)表于 09-02 14:18 ?2687次閱讀

    簡(jiǎn)單認(rèn)識(shí)RTOS實(shí)時(shí)操作系統(tǒng)

    RTOS(Real Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種專門(mén)設(shè)計(jì)用于在嚴(yán)格時(shí)間限制內(nèi)處理任務(wù)的操作系統(tǒng)。它以其高實(shí)時(shí)性、多任務(wù)處理能力和資源管理能力在工業(yè)自動(dòng)化、醫(yī)療設(shè)備、航空航天、汽車電子等眾多領(lǐng)域
    的頭像 發(fā)表于 08-20 11:20 ?4870次閱讀

    SPI數(shù)據(jù)速率影響定時(shí)器中斷,問(wèn)題出在哪里

    就會(huì)發(fā)送到 RTOS 隊(duì)列。 此時(shí)會(huì)執(zhí)行一個(gè)任務(wù),在該任務(wù)中會(huì)執(zhí)行一個(gè)記錄到終端的日志函數(shù)。 現(xiàn)
    發(fā)表于 07-23 07:07

    RTOS版本用示例提供的UART驅(qū)動(dòng),編譯失敗提示找不到函數(shù)uart_div_modify(),是怎么回事?

    RTOS版本用示例提供的UART驅(qū)動(dòng),編譯失敗提示找不到函數(shù)uart_div_modify(),是怎么回事? 搜索整個(gè)工程也沒(méi)有找到這個(gè)函數(shù)的定義或者聲明!
    發(fā)表于 07-22 08:17

    請(qǐng)問(wèn)從哪里獲得ESP8266 RTOS SDK的SPI驅(qū)動(dòng)程序?

    我計(jì)劃將ESP8266用作SPI從設(shè)備,它可以根據(jù)功能從某些SPI主設(shè)備進(jìn)行操作。我已經(jīng)檢查 NON OS SDK 中有 SPI 驅(qū)動(dòng)程序ESP8266但 RTOS SDK ESP8266沒(méi)有任何源。 那么,有沒(méi)有人知道我可以從哪里
    發(fā)表于 07-12 07:28

    pmT任務(wù)棧溢出錯(cuò)誤怎么解決?

    IDLE R01525 tiT B102483 Tmr SvcB21846 rtT S12487 ppT S131781 pmT S11082 上述為我用vTaskList函數(shù)打印rtos任務(wù)
    發(fā)表于 07-11 08:05

    esp8266_rtos_sdk串口初始化異常是什么原因呢?

    硬件環(huán)境:nodeMCU 我從github下載最新的RTOS SDK,并且僅僅在初始化 user_init() 函數(shù)里添加了一個(gè)函數(shù) uart_init_new() 然后編譯。生成b
    發(fā)表于 07-11 06:04
    主站蜘蛛池模板: 人人澡 人人澡 人人看 | 亚洲视频三区 | 免费看大尺度视频在线观看 | 欧美激情五月 | 国产美女主播在线观看 | 国产精品久久久久网站 | 久久国产精品岛国搬运工 | 日韩欧美一卡二区 | 久青草免费视频手机在线观看 | 成人午夜大片免费7777 | 一级片观看 | 欧美一区二区三区不卡免费观看 | 欧美色惰aⅴ | 国产激情三级 | 天天操网| 狠狠干一区 | 国产人成精品香港三级古代 | 欧美猛交lxxxxxxxxx | 亚洲国产美女精品久久 | 欧美xxxx色视频在线观看 | 成人永久免费视频网站在线观看 | 91po狼人社在线观看 | 免费看男女下面日出水视频 | 3344在线 | 国产一区二区三区在线观看影院 | 网站免费黄 | 狠狠夜夜| 亚洲va中文字幕无码 | 污夜影院 | 色综合天天综一个色天天综合网 | 男人操女人在线观看 | 丁香花五月天婷婷 | 日日天天干| 最新日本免费一区二区三区中文 | 激情婷婷网| 俄罗斯一级特黄黄大片 | 狠狠狠色丁香婷婷综合激情 | 午夜噜噜噜私人影院在线播放 | 中文字幕第13亚洲另类 | 国产精品夜夜春夜夜 | 四虎sihu新版影院亚洲精品 |