色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

RT-Thread啟動進入就緒態最高優先級線程的全過程與棧幀分析(上)

冬至子 ? 來源:lchnu ? 作者:lchnu ? 2023-11-08 12:47 ? 次閱讀

本文簡單討論RT-Thread在啟動后,逐步進入到處于就緒態最高優先級main線程的全過程。部分內容涉及到匯編指令,但通俗易懂。通過簡化工程,配合Debug過程,逐步觀察寄存器的變化、繪制棧幀結構、繪制線程控制塊和rt_interrupt_from_thread、rt_interrupt_to_thread等典型變量取值(指向,雖然是rt_uint32_t類型,但實際在匯編中是作為指針使用),能有效幫助理解RTOS的線程棧的恢復與啟動過程。

通過本文對線程啟動過程的了解,對于兩個線程/多個線程之間的互相切換能奠定堅實的基礎,化繁為簡,結合論壇關于上下文切換的代碼注釋,能幫助快速抓住主線。

使用的軟硬件環境如下:

IDE工具 - RT-Thread Studio 2.2.6
硬件 - STM32L431RCT6,Cortex M4內核
軟件 - RT-Thread 4.0.5版本
配置 - 僅使能main線程和tidle0線程

一、工程設置

Step 1. 新建名稱為EVBMX_RTThread405_Switch的4.0.5版本工程

1.jpg

Step 2. 不使能軟件定時器,使能線程狀態更改的調試

關閉軟件定時器線程,避免干擾。

1.jpg

Step 3. 關閉msh shell,禁用Finsh

關閉tshell線程,避免干擾。僅僅保留main線程和tidle0線程。

1.jpg

Step 4. 修改main函數

修改main函數后,線程進入一次,休眠且切換1次,再次切回且return,然后徹底退出,只留下tidle0線程。

#include
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include
int main(void)
{
rt_thread_mdelay(1000);
return RT_EOK;
}

Step 5. 下載程序,觀察輸出結果

讀完全文后,對下方輸出結果的每一行語句所代表的含義和發生時刻,能有更深刻體會。

1.jpg

二、調試運行

Step 6. 在component.c中257行按F9設置斷點;F5全速運行到此處后,再按F9關閉此處斷點。

1.jpg

Step 7. 依次進入rt_thread_create, _thread_init, 停留在thread.c的164行。

將變量thread添加到表達式窗口,可以查看各個成員的值,其中,thread->stack_addr = 0x20001138, thread->stack_size = 0x800,分別表示棧底位置和棧空間大小。

164行的函數rt_hw_stack_init對于理解線程切換是一個相當重要的函數,其形參分別為:

線程入口函數:main_thread_entry

線程參數RT_NULL:

線程棧棧頂地址:thread->stack_addr + thread->stack_size - 4 = 0x20001138 + 0x800 - 4 = 0x20001934

1.jpg

Step 8. 單步進入到rt_hw_stack_init函數內部,開展分析

149行,由于傳遞進來的stack_addr = 0x20001934,執行完畢后,stk為0x20001938。從0x20001138(含)到0x20001934(含),合計是0x800 = 2048字節。STM32使用的滿遞減棧,所以此處的stk是0x20001938。

150行,此處設置8字節對齊。由于0x20001938 = (536877368)Decimal,該數據除8等于67109671,能被8整除,該語句執行棧對齊操作后,stk依然為0x20001938。

1.jpg

Step 9. 繼續了解rt_hw_stack_init函數。

151行,更新stk的值,減去struct stack_frame結構體的大小。執行完畢后,stk = 0x200018F4。
153行,stack_frame指針指向0x200018F4。
156至159行,通過for循環將0x200018F4至0x20001938的所有內存變成0xdeadbeaf魔法字。
161行至168行,將stack_frame成員的exception_stack_frame中的r0~psr共8個寄存器分別設置為:線程參數,4個0,線程返回地址,線程入口地址,0x01000000。
175行,返回stk的值,此時變成0x200018F4。這個值在初始化線程時,將返回給thread->sp,即線程棧的臨時棧頂指針。
依次將線程的形參、r1-r3, r12, 線程返回地址、線程入口地址,線程的xPSR寫入異常棧幀結構中。
在初入門時,這里是難點。C語言中使用結構體定義的棧結構,如何和實際寄存器的順序進行一一對應?,后文會通過逐步Debug揭示這個問題答案。

1.jpg

至此,main線程創建完畢后,線程結構體和線程棧空間如下所示。

1.jpg

Step 10. 繼續單步到rt_system_scheduler_start函數處,并單獨跟蹤進入到該函數內部。

期間,RT-Thread會調用rt_thread_idle_init函數,在該函數中使用靜態創建方式初始化tidle0線程。可以按照上述過程記錄tidle0線程的棧空間。

1.jpg

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

    關注

    31

    文章

    5357

    瀏覽量

    120693
  • STM32
    +關注

    關注

    2270

    文章

    10910

    瀏覽量

    356615
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137154
  • Shell
    +關注

    關注

    1

    文章

    366

    瀏覽量

    23414
  • RT-Thread
    +關注

    關注

    31

    文章

    1296

    瀏覽量

    40242
收藏 人收藏

    評論

    相關推薦

    RT-Thread啟動進入就緒最高優先級線程全過程分析(下)

    Step 11. 繼續單步到rt_hw_context_switch_to函數處。
    的頭像 發表于 11-08 12:53 ?1458次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>啟動</b><b class='flag-5'>進入</b><b class='flag-5'>就緒</b><b class='flag-5'>態</b><b class='flag-5'>最高</b><b class='flag-5'>優先級</b><b class='flag-5'>線程</b>的<b class='flag-5'>全過程</b>與<b class='flag-5'>棧</b><b class='flag-5'>幀</b><b class='flag-5'>分析</b>(下)

    靈動微課堂 (第135講) | 基于MM32 MCU的OS移植與應用——RT-Thread 線程管理

    的屬性,如線程控制塊、線程、入口函數等。圖 1 對象容器與線程對象線程的調度RT-Thread
    發表于 09-03 17:40

    什么是RT-Thread線程管理看完你就懂了

    ,每個線程都有重要的屬性,如線程控制塊、線程、入口函數等。RT-Thread線程調度器是搶
    發表于 03-29 06:16

    【每日一練】RT-Thread Nano-線程創建1(第五節學習視頻)

    )A、256.0 B、32.32 C、512.0D、256.2562、rt_thread_create()函數有哪幾個參數?請說明(問答)3、啟動線程后,線程
    發表于 05-21 10:04

    RT-Thread基于優先級的全搶占式調度算法的實現

    thread2,當它們都進入就緒狀態等待調度時,效果如下:此時問題來了,當任務們都進入就緒狀態,掛載在這個
    發表于 04-20 14:17

    基于STM32L475VET5的RT-Thread線程管理學習

    調度。此狀態在 RT-Thread 中的宏定義為 RT_THREAD_INIT。(2)就緒狀態:在就緒狀態下,線程按照
    發表于 04-22 15:00

    RT-Thread代碼啟動線程切換過程的實現

    就緒列表里面, 表示線程已經就緒,系統隨時可以調度。2.1.1. 實現就緒列表就緒列表實際就是
    發表于 04-25 11:38

    RT-Thread嵌入式操作系統線程優先級該怎樣去實現呢

    就緒列表RT-Thread 要支持多優先級,需要靠就緒列表的支持,從代碼看,就緒列表由兩個在
    發表于 05-09 14:32

    rt-thread優先級線程可以調度執行嗎?

    請教下,在rt-thread中,如果低優先級線程中用while(1){}直接死循環,是不是高優先級線程也無法調度執行了?如果高
    發表于 05-13 10:51

    RT-Thread線程優先級鏈表與位圖算法的介紹

    隊列為當前系統最高優先級,則調用rt_list_insert_before(&(rt_thread_priority_table[thread
    發表于 05-13 15:38

    RT-Thread系統線程調度器的設計實現

    就將演變為在優先級數組中尋找具有最高優先級線程的非空鏈表。RT-Thread內核中采用了基于位圖的優先級
    發表于 08-23 15:24

    RT-Thread實時操作系統中的五種狀態之間是如何變換的

    線程由于申請一個資源(例如使用rt_sem_take),而可能進入掛起。又例如因為一個外部中斷發生了,系統轉入中斷服務例程,在中斷服務例程中釋放了相應的資源,導致把等待在這個資源
    發表于 08-24 16:15

    RT-Thread線程管理手冊指南

    _resume (rt_thread_t thread)使線程恢復運行詳細描述線程管理接口RT-Thread操作系統是基于
    發表于 08-26 16:22

    RT-Thread實時系統的線程設計應該注意什么要點

    key線程來處理按鍵。線程的狀態躍遷這里說的狀態躍遷指的是線程運行中狀態的變化,從就緒過渡到掛起
    發表于 09-14 15:45

    如何去處理RT-Thread線程優先級的問題呢

    RT-Thread優先級問題,官方文檔互斥量一節,線程2的優先級線程1高,但在線程2runni
    發表于 12-05 11:51
    主站蜘蛛池模板: 2021自产拍在线观看视频| 国产AV无码一二三区视频| 狠狠撸亚洲视频| 在线播放午夜理论片| 蜜桃成人在线| 囯产免费久久久久久国产免费| 午夜福利理论片在线播放| 精品亚洲大全| MMM日本兽交| 小莹的性荡生活| 伦理片天堂eeuss影院2o12| 菠萝视频高清版在线观看| 向日葵视频app下载18岁以下勿看| 果冻传媒在线观看资源七夕| 2023极品少妇XXXO露脸| 色翁荡熄月月| 狼群影院视频在线观看WWW| 成视频高清| 一本久道视频无线视频| 日本免费一区二区三区四区五六区 | 国产成人精品在视频| 亚洲无吗视频| 日本xxx片免费高清在线| 禁漫H天堂免费A漫| 成人午夜剧场| 永久免费看bbb| 偷窥美女3| 欧美精品华人在线| 精品亚洲国产成AV人片传媒| 共妻肉多荤文高h一女n男| 这里只有精品网| 性派对xxxhd| 秋霞网在线伦理影片| 久久精品视在线观看2| 国产精品XXXXX免费A片| 99精品影院| 与嫂子同居的日子在线观看| 午夜国产高清精品一区免费| 全彩黄漫火影忍者纲手无遮挡| 久久亚洲国产精品亚洲| 国精产品一区一区三区有限在线|