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

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

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

3天內不再提示

揭秘RTOS任務入口函數執行完之后去哪里了

strongerHuang ? 來源:Mculover666 ? 作者:mculover666 ? 2021-11-05 14:20 ? 次閱讀

1. 說明

在工作過程中,我發現在實際使用RTOS完成項目時,理解這些知識僅能達到會用RTOS的水平,要想用好RTOS,還需要了解一些比較細節的機制,否則容易掉坑進去,花大量時間定位問題。

本文結合TencentOS-Tiny實時操作系統給大家講述一下相關內容。

2. 任務的通常寫法

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

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

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

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

//2.waitsuccess,handle!
}
}

這種寫法中,在沒有事件發生的時候,任務會因為等待某個內核對象而被掛起,讓出CPU不參與調度。

② 定時執行

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

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

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

這種寫法中,任務在干完活之后,會主動進入睡眠狀態,讓出CPU不參與調度。

3. 一次性任務

上面兩種寫法的共性是都有主循環,不需要考慮任務入口函數退出的情況,但在一些場景中任務只需要執行一次即可:

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

//dosomething...

//exit?
}

「這個時候就要思考一個問題:任務入口函數執行完畢之后去了哪里?」

4. 尋找答案

首先,「任務入口函數本質上是一個函數」,跳轉函數的指令是BL,CPU在執行該指令跳轉到某個函數執行時,會將當前PC地址作為函數返回地址、加載到LR寄存器中、保證函數執行完可以返回到這兒繼續執行,再將函數地址加載到PC寄存器、程序接著執行就到了函數中。

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

那么,任務入口函數沒有被別的函數主動調用,是如何被拉起來執行的呢?

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

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

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

由于不同CPU架構的CPU寄存器組不同,所以初始化任務棧的代碼與架構強相關,在arch目錄下都有不同架構對應的實現。

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

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

從代碼里可以看到,TencentOS-Tiny默認退出函數為exit參數指定的值,接下來我們看看退出函數~

5. 任務退出函數

在創建任務的API tos_task_create 中,初始化任務棧的過程中會指定退出函數為 task_exit

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

task_exit 函數主要完成銷毀自身的工作,具體實現如下:

__STATIC__voidtask_exit(void)
{
tos_task_destroy(K_NULL);
}

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

  • 將任務從就緒列表移除
  • 將任務從等待列表移除
  • 將任務從統計列表移除
  • 任務狀態置為K_TASK_STATE_DELETED

6. 總結

本文講述了任務的兩種常規寫法,以及任務函數執行完畢之后去了哪里?

當任務函數執行完畢退出時,會執行到哪里由任務棧初始化時LR寄存器的值決定,RTOS內核都會提供一個默認退出函數,TencentOS-Tiny提供的任務退出函數中,會自動銷毀任務自身。

所以在編寫一次性任務時,就不需要主動調用銷毀API銷毀自身啦~

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

    關注

    31

    文章

    5377

    瀏覽量

    121370
  • API
    API
    +關注

    關注

    2

    文章

    1522

    瀏覽量

    62501
  • 函數
    +關注

    關注

    3

    文章

    4350

    瀏覽量

    63047
  • RTOS
    +關注

    關注

    22

    文章

    821

    瀏覽量

    119944

原文標題:RTOS 任務入口函數執行完之后去哪里了?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用任務通知提高RTOS應用的效率

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

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

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

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

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

    RTOS中鉤子函數的用途及用法

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

    freertos和rtos區別是什么

    (Real-Time Operating System,實時操作系統)是一種特殊的操作系統,它能夠為實時任務提供確定性的響應時間。RTOS 通常用于嵌入式系統,如工業自動化、汽車電子、醫療設備等領域
    的頭像 發表于 09-02 14:18 ?1627次閱讀

    SPI數據速率影響定時器中斷,問題出在哪里

    就會發送到 RTOS 隊列。 此時會執行一個任務,在該任務中會執行一個記錄到終端的日志函數。 現
    發表于 07-23 07:07

    請問從哪里獲得ESP8266 RTOS SDK的SPI驅動程序?

    我計劃將ESP8266用作SPI從設備,它可以根據功能從某些SPI主設備進行操作。我已經檢查 NON OS SDK 中有 SPI 驅動程序ESP8266但 RTOS SDK ESP8266沒有任何源。 那么,有沒有人知道我可以從哪里
    發表于 07-12 07:28

    請問CMSIS-RTOS RTX的任務調度鎖在哪里

    請問一下,CMSIS-RTOS RTX的任務調度鎖在哪里?謝謝!
    發表于 05-13 08:28

    關于FreeRTOS的任務劃分及comsis_os函數使用的疑問求解

    子菜單分為n個)、機器行程選擇、行程執行等來分為若干任務。 又因為這些任務不會同時被執行,所以我想上面這些”界面“有關任務只讓一個存在于調度
    發表于 05-07 07:49

    RTOS+LwIP Socket不工作的原因?

    本人用RTOS創建了五個任務, 如下: /* RTOS任務創建調度機制 */ osThreadDef(TCPSOCKETSERVER, TCP_Socket_Server
    發表于 04-30 07:20

    STM8S003中主函數執行while(1)自動跳出循環是怎么回事?

    ();/*LCD顯示*/ } } 在上面這段主函數的代碼中,如果不加看門狗IWDG_FEED,程序執行while(1)后就會自動跳出,為什么會非要加看門狗才不會跳出while(1)?不應該是不加IWDG_F
    發表于 04-18 07:52

    顯示接收消息一定要等所有消息全部發送才顯示如何解決?

    ; /****************************任務句柄**********************/ /* *任務句柄是一個指針,用于指向一個任務,當任務創建
    發表于 04-16 06:13

    鴻蒙TypeScript入門學習第8天:【TypeScript 函數

    函數是一組一起執行一個任務的語句。 您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常是根
    的頭像 發表于 04-03 14:54 ?469次閱讀
    鴻蒙TypeScript入門學習第8天:【TypeScript <b class='flag-5'>函數</b>】

    基于RTOS的應用進程中的典型線程

    RTOS中的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?714次閱讀
    基于<b class='flag-5'>RTOS</b>的應用進程中的典型線程

    請問RTOS USBSetuPcb回調函數是在中斷還是單獨線程中處理的?

    UART 通信)和異步 USB Setup 請求回調處理程序函數之間的 Uart 訪問之間存在競爭條件。 -> 在執行主循環UART功能的同時,正在執行USB消息處理UART功能。 要
    發表于 02-23 06:10
    主站蜘蛛池模板: 免费在线看片网站 | 午夜影院三级 | 在线播放91灌醉迷j高跟美女 | 国产人人澡 | 8x8x极品国产在线 | 天天射天天操天天色 | 国内精品99 | 高清性欧美xxx | 好男人社区www在线观看 | 欧美在线激情 | 视频免费在线 | 男啪女色黄无遮挡免费观看 | 福利姬 magnet | 免费观看国产网址你懂的 | 午夜色在线| 伊人网在线视频 | 四虎影院视频在线观看 | 免费久久精品国产片香蕉 | 日韩三级在线观看视频 | 怡红院日本一道日本久久 | 又黄又湿又爽吸乳视频 | 夜夜夜久久久 | 中文字幕有码在线视频 | aaaaaaa毛片 | 天天做天天爱天天做天天吃中 | 欧美性xxxxxbbbbbb精品 | 美女扒开尿囗给男生桶爽 | 亚色中文字幕 | 国产拍拍视频 | 久久狠狠第一麻豆婷婷天天 | 边做饭边被躁欧美三级小说 | 久久久久88色偷偷 | 亚洲黄色三级网站 | 69pao强力打造免费高速 | 亚欧一区| 久久精品视频网站 | 视频网站免费 | 张柏芝三级无删减在线观看 | 91亚洲国产成人久久精品网站 | 天堂在线www在线资源 | 日韩三|