91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

3天內不再提示

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

strongerHuang ? 來源:Mculover666 ? 作者:mculover666 ? 2021-11-05 14:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 說明

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

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

2. 任務的通常寫法

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

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

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

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

//2.waitsuccess,handle!
}
}

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

② 定時執(zhí)行

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

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

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

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

3. 一次性任務

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

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

//dosomething...

//exit?
}

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

4. 尋找答案

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

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

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

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

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

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

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

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

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

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

5. 任務退出函數

在創(chuàng)建任務的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表示銷毀自身,如果是靜態(tài)任務則按以下步驟銷毀(動態(tài)任務銷毀值得用一篇文章去講述):

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

6. 總結

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

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

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

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

    關注

    31

    文章

    5609

    瀏覽量

    130037
  • API
    API
    +關注

    關注

    2

    文章

    2384

    瀏覽量

    66818
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67568
  • RTOS
    +關注

    關注

    25

    文章

    866

    瀏覽量

    123059

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【瑞薩FPB-RA6E2試用】【瑞薩FPB-RA6E2】RTOS(Real-Time Operating System,實時操作系統(tǒng))《線程》個人理解及項目實現

    System,實時操作系統(tǒng))線程含義 在 RTOS(Real-Time Operating System,實時操作系統(tǒng)) 中,線程(Thread) 是任務調度和并發(fā)執(zhí)行的基本單位。不同 RT
    發(fā)表于 01-14 11:50

    如何在Zephyr RTOS中實現延時和計時函數

    在實時操作系統(tǒng)(RTOS)中,時間管理是核心功能之一。無論是任務調度、超時控制,還是周期性事件,延時和計時機制都扮演著至關重要的角色。Zephyr RTOS作為一個輕量級、模塊化的開源系統(tǒng),提供
    的頭像 發(fā)表于 12-26 10:32 ?5539次閱讀
    如何在Zephyr <b class='flag-5'>RTOS</b>中實現延時和計時<b class='flag-5'>函數</b>

    RTOS在嵌入式開發(fā)中的作用

    中,不依賴其它任務或調度器。 高峰負載管理 RTOS提供為管理系統(tǒng)高峰活動提供一個有效的方法。更高的優(yōu)先級分配給執(zhí)行峰值負載活動的
    發(fā)表于 12-26 07:53

    使用RTOS時需要注意的幾點內容分享

    是為一個外設指定一個核。所以,在等待事件發(fā)生期間,使該核空閑起來是有意義的。 其結果是,優(yōu)先式、中斷驅動的RTOS架構占據業(yè)已部署的大部分平臺。雖然借助硬件手段(多個寄存器組合、硬件調度、任務切換
    發(fā)表于 12-23 06:34

    選擇RTOS的要點

    補充Linux,因為它們可提供硬實時級別的QoS。 要指出的很重要一點是:這類補充常常是在原始OS上集成一個RTOS編程環(huán)境。與傳統(tǒng)臺式或服務器OS相比,RTOS通常要小很多。RTOS
    發(fā)表于 12-12 08:00

    RTOS Crash 問題全維度分析與解決指南

    →TaskB”),識別死鎖(長時間無切換)、優(yōu)先級反轉; 中斷時長檢測 :在ISR入口/出口記錄時間戳(如SysTick值),排查ISR執(zhí)行超時(超過RTOS調度周期); 壓力測試 :模擬極限場景(如
    發(fā)表于 12-08 03:56

    FreeRTOS 空閑任務

    幾乎所有的小型 RTOS 中都會有一個空閑任務,空閑任務屬于系統(tǒng)任務,是必須要執(zhí)行的,用戶程序不能將其關閉。不光小型系統(tǒng)中有空閑
    發(fā)表于 12-04 07:35

    RTOS 必學概念:任務、信號量、隊列一次搞懂

    如果你剛接觸RTOS(實時操作系統(tǒng)),很可能會有這樣的困惑:“RTOS和裸機程序到底有什么區(qū)別?”“任務是線程嗎?為什么要分任務?”“信號量和互斥鎖有什么區(qū)別,不都是同步手段嗎?”“隊
    的頭像 發(fā)表于 11-17 10:53 ?500次閱讀
    <b class='flag-5'>RTOS</b> 必學概念:<b class='flag-5'>任務</b>、信號量、隊列一次搞懂

    Task任務:LuatOS實現“任務級并發(fā)”的核心引擎

    Task任務通過其強大的并發(fā)處理能力,使LuatOS能夠在單線程環(huán)境中模擬多線程執(zhí)行,通過協程的掛起與恢復機制,實現任務級的并行操作,顯著提升系統(tǒng)效能。 sys核心庫是LuatOS運行框架庫,也是
    的頭像 發(fā)表于 08-28 13:49 ?534次閱讀
    Task<b class='flag-5'>任務</b>:LuatOS實現“<b class='flag-5'>任務</b>級并發(fā)”的核心引擎

    揭秘LuatOS Task:多任務管理的“智能中樞”

    ,也是LuatOS應用程序運行的核心大腦——所有LuatOS應用項目都會使用到sys核心庫。 ? ?sys核心庫提供四大類功能: Task任務 Message消息 Timer定時器 Run調度器 本文將
    的頭像 發(fā)表于 08-28 13:48 ?668次閱讀
    <b class='flag-5'>揭秘</b>LuatOS Task:多<b class='flag-5'>任務</b>管理的“智能中樞”

    詳解hal_entry入口函數

    當使用RTOS時,程序從main函數開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數main
    的頭像 發(fā)表于 07-25 15:34 ?2022次閱讀

    【RA4L1-SENSOR】05 按鍵實現RTOS任務切換

    與計數功能的切換,為之后的多任務切換做個鋪墊。 2. 軟件部分 將上次的實驗工程復制一份,重命名為05_Button_Switch_Task 2.1 綁定按鍵IO &&
    發(fā)表于 06-16 22:38

    揭秘LuatOS:實時操作系統(tǒng)RTOS核心庫的關鍵技術剖析!

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

    詳解RTOS中的Hook函數

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

    stm32cubemax為什么下載之后無法運行?

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