女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

RT-Thread操作系統的調度設計原理

RTThread物聯網操作系統 ? 來源:RT-Thread ? 作者:RT-Thread ? 2020-09-02 14:14 ? 次閱讀

要想使用好RTOS,做出更加穩定可靠的產品,必須非常清楚底層的調度原理。由于RTOS的實時性與可控性,所以只有了解了其核心部分的設計思想,才能用起來得心應手,游刃有余。本文從RT-Thread的調度器設計的運行方式上解釋一下調度器的行為,從而更加深刻的理解RT-Thread操作系統的調度時機。

1.調度是什么?

調度一般就是合理的安排、協調資源,統一指揮去完成一件事,而在操作系統中,線程調度就是有多個就緒優先級的任務,找到最高優先級任務,交給CPU去運行。

RT-Thread調度器就是起到判決線程當前的優先級,然后選擇當前系統中最高優先級的就緒態的線程交給CPU去管理。

調度又可以細分為兩種。可打斷調度:關鍵防止優先級倒置;不可打斷調度:先來先服務,不可中斷。RT-Thread 屬于實時操作系統,所以其調度器實現的是可打斷的調度,當有更高優先級的線程或者更重要的任務就行,則可以打斷當前任務的執行狀態,去執行優先級更高的任務。那么此時,調度的時機就非常的關鍵了。

2.調度怎么實現?

RT-Thread在創建任務的時候,會指定任務的優先級,一般來說,每個任務都有自己特定的唯一的優先級。所以內核線程對象中有不同的優先級的任務列表。

如果最大指定為32個優先級,那么可以用32位數據類型表示,每一個bit表示一個優先級就緒的狀態。使用位圖的優點就是速度快,而且內存占用小。

一般來說,調度去找到最高優先級的任務時,就需要去做判斷。如何去找到最高優先級的任務。一般來說,有兩種辦法:

軟件計算

硬件計算

這兩種的差別僅僅在于計算效率的問題,本質目的并無差別。

而用軟件計算方法尋找最高優先級有兩種實現的策略:

1.遍歷就緒的隊列,找到最小的優先級就緒的隊列,尋找的時間不確定,時間復雜度O(n)。

2.采用空間換時間的辦法,事先做好一個bitmap

例如系統中最大有8個優先級,那么bitmap如下:

 1constrt_uint8_t__lowest_bit_bitmap[]=
 2{
 3/*00*/0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 4/*10*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 5/*20*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 6/*30*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 7/*40*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 8/*50*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
 9/*60*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
10/*70*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
11/*80*/7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
12/*90*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
13/*A0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
14/*B0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
15/*C0*/6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
16/*D0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
17/*E0*/5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
18/*F0*/4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
19};
一般每一位代表一個就緒的狀態,所以__rt_ffs程序的設計如下
 1int__rt_ffs(intvalue)
 2{
 3if(value==0)return0;
 4
 5if(value&0xff)
 6return__lowest_bit_bitmap[value&0xff]+1;
 7
 8if(value&0xff00)
 9return__lowest_bit_bitmap[(value&0xff00)>>8]+9;
10
11if(value&0xff0000)
12return__lowest_bit_bitmap[(value&0xff0000)>>16]+17;
13
14return__lowest_bit_bitmap[(value&0xff000000)>>24]+25;
15}

如果當前系統的線程狀態為0b0110 0000,那么轉換成十六進制就是0x60,根據表中的狀態此時的最高優先級是5+1=6。所以可以得出系統的優先級,此時計算的復雜度為O(1)。

雖然RT-Thread 是支持同等優先級的,但是在具體的業務邏輯的設計中,在使用RTOS常用的設計方法中,一般都是要求程序的運行邏輯是可預測的,就是在程序執行的過程中,可以預測到程序下一步的動作。所以rtos中同等優先級,按照時間片輪訓的這種方式設計業務邏輯的情況并不多。使用相同優先級會增加系統的業務邏輯的復雜性。

3.什么時候系統做調度?

RT-Thread 是搶占式的系統調用,所以系統什么時候去做的調度非常的關鍵。系統調度行為具體又分為主動調度和被動調度兩種。

3.1 任務主動block

當A線程在正常運行時,主動放棄CPU的使用權,比如去執行rt_thread_delay或者等待一個IPC消息時,當前線程會主動放棄CPU資源,此時去系統中尋找已經就緒的最高優先級的線程進行調度。

這種方式應用的場景比較豐富,比如當前線程沒有獲取到資源時,需讓出CPU的使用權,或者事情做完了,主動讓出CPU的使用權,這就是系統做調度的時機。

A線程的優先級要高于B線程的優先級,所以在A放棄CPU使用權后,已經就緒的最高優先級線程B就開始執行了。

3.2 被更高優先級的任務喚醒

這種方式就是當比當前運行線程的優先級高的線程處于就緒態時,高優先級的就緒態線程會被喚醒,低優先級線程將暫停運行,此時會調度到比當前線程更高的優先級線程中去。

按照理解A線程是正在運行的線程,此時更高任務優先級的線程C就緒處于就緒狀態了。比如創建了一個比A優先級更高的C進程,并startup C線程,此時會執行rt_schedule()將線程切換到優先級更高的C線程。此時A線程運行狀態以及處理器寄存器狀態壓棧,更高優先級的C線程的狀態以及處理器寄存器狀態出棧,并且開始運行C線程。

3.3 yield放棄cpu使用

首先理解一下什么是yield,解釋成讓出,放棄比較合理。該出讓只針對于同等優先級的線程。

這種情況只適用于A線程的優先級等于B線程的優先級的情況。因為RTT支持同等優先級的方式創建線程,相同的優先級的切換是靠時間片輪詢來進行的。所以,當A線程正常運行的時候,如果執行了yield函數,那么只相當于將A線程的時間片消耗完,此時同等優先級的D線程開始運行。 由于在RTOS中,需要的是完成任務的確定性與可靠性,同等優先級的情況比較有限,所以這一塊應用的不多。

3.4 中斷中執行調度

以上的三種屬于主動進行調度的過程,其系統的執行流程都是可以預測的,但是中斷去執行調度卻是比較特殊。是被動調度。

這種方式是在中斷中執行調度的,當A線程正常運行時,此時來了一個中斷,由于中斷的優先級是高于線程的。所以,中斷處理事情,如果在中斷中執行了調度函數,那么在中斷退出后,將直接切換到當前系統中更高優先級的線程去運行。如果如果當前系統的最高優先級還是A,那么中斷退出后,執行的最高優先級線程依然是A。若存在線程E線程優先級高于A并且處于就緒狀態,此時,中斷退出后,切換到E線程去執行。

4.調度做了哪些事情?

系統進行調度的時候做了哪些事情?

第一步:查找當前系統中當前以及就緒的最高優先級的線程,若有高于當前運行系統運行的線程棧則執行線程切換

第二步:關閉中斷,將系統當前運行狀態以及處理器的寄存器壓入棧空間

第三步:找到需要運行的線程的PC指針,并找到棧起始處彈出棧空間中的寄存器狀態

第四部:打開中斷,執行異常ret,讓系統恢復執行

此時,就切換到已經就緒的更高優先級的線程去運行了。

5.總結

RT-Thread 線程的調度器是整個系統的靈魂,整個操作系統在運行過程中何時切換線程、什么情況下去處理任務,以及做更高效的業務邏輯的應用都離不開系統調度。掌握了調度器運行的規律,并且合理的使用線程調度時機,可以設計出更加穩定可靠的產品。通過閱讀代碼,就能預測程序下一步的執行動作。真正的做到手中有糧,心中不慌。

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

    關注

    68

    文章

    11034

    瀏覽量

    216000
  • 操作系統
    +關注

    關注

    37

    文章

    7089

    瀏覽量

    124950
  • 實時操作系統

    關注

    1

    文章

    202

    瀏覽量

    31212
  • RT-Thread
    +關注

    關注

    32

    文章

    1370

    瀏覽量

    41510
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5457

原文標題:?RT-Thread的線程調度與管理分析

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【直播預告】《實時操作系統應用技術—基于RT-Thread與ARM的編程實踐》教學脈絡及資源簡介

    直播預告直播主題:《實時操作系統應用技術—基于RT-Thread與ARM的編程實踐》教學脈絡及資源簡介開放時間:2025年5月29日(周四)20:00主講老師:王宜懷課程類型:視頻直播觀看平臺
    的頭像 發表于 05-26 17:50 ?158次閱讀
    【直播預告】《實時<b class='flag-5'>操作系統</b>應用技術—基于<b class='flag-5'>RT-Thread</b>與ARM的編程實踐》教學脈絡及資源簡介

    RT-Thread審核團招募: 深度參與開源RTOS社區治理與演進

    的開源實時操作系統,正持續優化社區協作流程,現面向全球開發者招募審核團(ReviewTeam)成員,共同維護代碼質量,推動RT-Thread生態繁榮發展!什么是RT
    的頭像 發表于 05-21 18:02 ?459次閱讀
    <b class='flag-5'>RT-Thread</b>審核團招募: 深度參與開源RTOS社區治理與演進

    RT-Thread嵌入式操作系統專業培訓班-深圳站重磅開啟!

    RT-Thread官方將在深圳舉辦為期三天的嵌入式操作系統專業培訓班!本次培訓將深入講解RT-Thread嵌入式實時操作系統的核心技術與實戰應用,助力開發者快速掌握RTOS開發精髓。無
    的頭像 發表于 04-11 18:18 ?192次閱讀
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系統</b>專業培訓班-深圳站重磅開啟!

    RT-Thread嵌入式操作系統專業培訓班來上海啦!

    RT-Thread官方將在上海(RT-Thread大本營)發起為期三天的嵌入式操作系統專業培訓班!本次培訓將會深入講解RT-Thread嵌入式實時
    的頭像 發表于 02-27 17:27 ?319次閱讀
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系統</b>專業培訓班來上海啦!

    RT-Thread嵌入式操作系統專業培訓班登陸鄭州!

    RT-Thread官方將在河南-鄭州發起為期三天的嵌入式操作系統專業培訓班!本次培訓將深入講解RT-Thread嵌入式實時操作系統的核心概念、實戰技巧和應用場景。無論您是剛接觸嵌入式開
    的頭像 發表于 02-12 18:28 ?303次閱讀
    <b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系統</b>專業培訓班登陸鄭州!

    RT-Thread操作系統應用開發寒假師資培訓

    隨著物聯網和智能系統的快速發展,嵌入式成為當前最熱門最有發展前途的IT應用領域之一。為進一步提升全國大學生在嵌入式芯片及系統設計領域的創新能力,特別是針對物聯網應用開發中RT-Thread操作
    的頭像 發表于 12-06 01:06 ?395次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系統</b>應用開發寒假師資培訓

    RT-Thread聯合河北大學發起嵌入式操作系統專業班-保定站

    RT-Thread官方將在11月23至24日河北省保定市(河北大學)發起為期兩天的嵌入式操作系統專業培訓班暨RT-Thread師資培訓!本次培訓將會深入講解RT-Thread嵌入式實時
    的頭像 發表于 11-16 01:09 ?458次閱讀
    <b class='flag-5'>RT-Thread</b>聯合河北大學發起嵌入式<b class='flag-5'>操作系統</b>專業班-保定站

    【本周六-深圳】RT-Thread嵌入式操作系統專業培訓班正式開班

    RT-Thread官方在本周六將發起為期三天的嵌入式操作系統專業培訓班!本次培訓將會深入講解RT-Thread嵌入式實時操作系統的核心概念、實戰技巧和應用場景!無論企業團隊/工程師是剛
    的頭像 發表于 11-08 01:07 ?508次閱讀
    【本周六-深圳】<b class='flag-5'>RT-Thread</b>嵌入式<b class='flag-5'>操作系統</b>專業培訓班正式開班

    新書發布——《RT-Thread嵌入式實時操作系統內核、驅動和應用開發技術》

    我們非常高興地宣布,由鄭苗秀、沈鴻飛和廖建尚編著的《RT-Thread嵌入式實時操作系統內核、驅動和應用開發技術》一書正式發布。本書的編寫團隊由多位在嵌入式和實時操作系統領域有著豐富經驗的專家組
    的頭像 發表于 09-03 08:06 ?1161次閱讀
    新書發布——《<b class='flag-5'>RT-Thread</b>嵌入式實時<b class='flag-5'>操作系統</b>內核、驅動和應用開發技術》

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?1164次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設備驅動開發指南

    RT-Thread內部機制大揭秘,帶你深入操作系統內核

    一、RT-Thread概述RT-Thread是一款具有顯著優勢的開源嵌入式實時操作系統。它不僅具備輕量級、實時性強的特點,還擁有廣泛的開源社區支持和豐富的應用場景。在輕量級方面,RT-Thre
    的頭像 發表于 08-01 08:11 ?4870次閱讀
    <b class='flag-5'>RT-Thread</b>內部機制大揭秘,帶你深入<b class='flag-5'>操作系統</b>內核

    睿賽德科技CEO熊譜翔 ——基于RT-Thread操作系統的安全車控系統實踐

    操作系統非常看重生態,RT-ThreadSafetyAuto操作系統也是這樣,通過兼容開源RT-Thread操作系統的API來復用已有的生
    的頭像 發表于 07-13 08:35 ?2081次閱讀
    睿賽德科技CEO熊譜翔 ——基于<b class='flag-5'>RT-Thread</b><b class='flag-5'>操作系統</b>的安全車控<b class='flag-5'>系統</b>實踐

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統開源項目在GitHub上的star數量突破一萬!截止發文,RT-Thread作為實時操作系統在業界Star數量排名第一!倉庫地址:https://gith
    的頭像 發表于 07-04 08:35 ?702次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    基于 RT-Thread專業版的EtherCAT主站方案

    特點。在RT-Thread實時操作系統上運行EtherCAT主站協議,大大提高了實時性,極大降低了循環同步抖動時間,可滿足各種對實時性要求苛刻的應用場景。以下是在瑞
    的頭像 發表于 06-19 08:35 ?1690次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案

    開發者分享 | 基于先楫RT-Thread BSP,使用CLion開發應用

    ,搭載RT-Thread實時操作系統,使用RT-ThreadStudio進行開發。RT-Thread是一個偉大的操作系統,但是,
    的頭像 發表于 06-07 08:17 ?3608次閱讀
    開發者分享 | 基于先楫<b class='flag-5'>RT-Thread</b> BSP,使用CLion開發應用