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

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

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

3天內不再提示

構建RTOS Kernel指南 (下)

恩智浦MCU加油站 ? 來源:未知 ? 2023-08-03 08:50 ? 次閱讀
單單具有任務切換功能自然不能稱之為RTOS Kernel,一個任務往往具有多個重要的屬性,優先級就是其中之一。一個任務的優先級決定了它的“尊貴”程度,越尊貴的任務越有優先占用CPU運行的權力。

1優先級查找

位圖是指一組連續的標志位,是一種常見的優先級框架的實現方式每個比特位通常用來對應一個優先級,越低位的優先級越高,其狀態標識該優先級是否有就緒狀態的任務。下圖32位為例,存在優先級為1、7、9、16……24、25、31的就緒態任務。每個優先級存在對應的任務鏈表,同一個優先級中采用“先就緒先執行”的原則。wKgaomToOvSAGFZOAABhpRbvchw921.png 圖1 位圖

那么,CPU的任務從“尋找優先級最高的任務”變成了“尋找位圖中最低位的1”。如果按照上圖中依次按位查找,速度是較慢的,系統的實時性可能會有一定程度的影響,下面介紹一種較為巧妙的方法——分組查表法。wKgaomToOvSAH72PAABeb4zoeNg734.png? ? ? ? ? ? ? ? ? ? ?? ? ??圖2 分組查表法

const rt_uint8_t __lowest_bit_bitmap[] =
{
    /* 00 */ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 10 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 20 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 30 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 40 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 50 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 60 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 70 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 80 */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 90 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* A0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* B0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* C0 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* D0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* E0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* F0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};


int __rt_ffs(int value)
{
    if (value == 0) return 0;


    if (value & 0xff)
        return __lowest_bit_bitmap[value & 0xff] + 1;


    if (value & 0xff00)
        return __lowest_bit_bitmap[(value & 0xff00) >> 8] + 9;


    if (value & 0xff0000)
        return __lowest_bit_bitmap[(value & 0xff0000) >> 16] + 17;


    return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25;

這種方法將32位共分成4組,每組8位,那么每組的8位二進制數0x00~0xFF對應數組bitmap的序號0-255,數組中的值的含義為其對應8位二進制數最低位“1”的序號。那么通過這樣巧妙的分組查表方式,通過至多四次查找,便可得到位圖的最低位“1”的位置。除此之外,還有更為巧妙的利用匯編指令CLZ和RBIT組合實現這個目的,其中CLZ可以統計出現“1”的最高位位置,RBIT是數據進行按位反轉的指令。這樣就可以先通過RBIT進行位反轉,再通過CLZ獲取反轉后最高位“1”的位置,即原數據中最低位“1”的位置。

2臨界區保護和線程同步

在RTOS中,時常會出現多個線程訪問公用資源的情況,即都需要訪問公用的程序片段,如若沒有對應的處理機制,可能會對系統造成意想不到的混亂。常用的方法有調度器上鎖和禁止中斷,這兩者相互依賴,例如在調度器上鎖時需要禁止中斷。除此之外,還可以采用互斥機制來進行臨界區保護,如信號量和互斥量,這兩者也用于線程的同步機制。

wKgaomToOvSAeGPZAAFTZeq5SKc148.png 圖3 信號量類比

信號量可以類比停車位,當有空車位的時候,才能開進停車場,對于線程而言,假如某臨界資源對應的信號量為0,是不能對其進行操作的。信號量應該有兩個重要的屬性:信號量值和等待隊列,信號量的值表示對應可操作臨界資源實例數,假如線程申請信號量是其值為0,那么該線程將被掛起在此信號量的等待隊列。

wKgaomToOvWAeOfHAAIRH1bLrTQ225.png

圖4 互斥量類比

互斥量的作用類似于二值信號量,它是一種特殊的信號量,只具有“上鎖”和“解鎖”兩種狀態,對應的臨界資源具有極強的排他性。就像景區的豪華單間衛生間,每個人在使用的時候都不能被打擾。雖然功能類似,但是二值信號量和互斥量還是有區別的,后續會進行相應的介紹。 wKgaomToOvWAbdNTAACq08hq3PU866.png? ? ? ? ? ? ? ? ? ? 圖5 事件集工作原理 除了信號量互斥量,還有一種有趣的同步機制-事件集,它通常可以用一個32位二進制數表示,每一位代表了一個事件,也可以說成一種觸發條件,而事件集的作用便是可以用“邏輯或”和“邏輯與”自由組合出想要觸發的條件,就好像“明天天氣好”和“我心情愉悅”都發生,“我出去郊游”才會觸發,又像“發表一篇論文”或“發明一項專利”任一發生,都觸發“達成碩士畢業標準”。

3優先級反轉問題

當隱入互斥量的機制后,讀者可以思考一下,這會不會和優先級機制產生沖突?

一個是根據優先級制定的“國家法律”,一個是根據臨界資源制定的“地方法律”,當遵守“地方法律“的時候會不會違背“國家法律”?這就是優先級反轉問題。

wKgaomToOvWAZM4HAABeowHnLCY646.png? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? 圖6? 優先級反轉

如上圖,假設我們有三個線程,它們的優先級Thread1 > Thread2 > Thread3,t0之前Thread3獲取某資源的互斥量,互斥量值變locked狀態,t0時刻Thread2線程就緒,由于優先級Thread2 > Thread3,Thread3讓出CPU執行權給Thread2,但沒有解開互斥量。到t1時刻,Thread1就緒,Thread2讓出CPU,Thread1執行過程申請Thread3所占有的互斥量,由于互斥量為locked狀態,在t2時刻Thread1被掛起等待,剩余兩個就緒態的線程Thread2優先級高于Thread1,因此繼續執行。

至此,我們發現,都處于就緒態的線程,低優先級的Thread2反而能比高優先級的Thread1優先執行,其原因是更低優先級的Thread3占有信號量并被搶占,造成了優先級反轉。所以為了讓“地方法律”更加適配“國家法律”,常用的做法是優先級繼承即可以讓Thread3短暫地提升到Thread1的優先級,得以搶占CPU快速執行完將互斥量解鎖,從而讓Thread1及時獲取到互斥量得以執行。除此之外,還存在一些另外的處理方式,如優先級天花板等,有興趣的讀者可以自行查閱相關資料

二值信號量和互斥信號量非常類似,但還是有一些細微的差別。互斥信號量擁有優先級繼承機制,而二值信號量沒有。互斥量必須是同一個任務申請,同一個任務釋放,其他任務釋放無效,且同一個任務可以遞歸申請。然而對于二值信號量,一個任務申請成功后,可以由另一個任務釋放,因此二值信號另更適合用于同步(任務與任務或任務與中斷的同步),互斥信號量適合用于簡單的互斥訪問。

4線程間通信

線程間通信主要是通過消息隊列和郵箱實現,消息隊列一般采用先進先出的原則(FIFO),而郵箱可以理解成隊列長度為1的特殊消息隊列,但是消息隊列中為待傳輸的數據按值拷貝的副本,所以支持各種類型的數據的傳遞,而郵箱中傳輸的通常為指向待交換數據的指針。

5總結

至此,一個RTOS的內核功能基本就實現了,下面對一個RTOS Kernel應具備的功能進行分條總結:

實時性:實時系統對任務的響應時間要求較高。具備嚴格的按優先級調度任務的機制,并且一般要支持搶占式調度

多任務調度:RTOS需要能夠同時管理多個任務,并合理分配CPU時間片給每個任務。設計任務調度算法以確保相同優先級的任務能公平使用CPU,避免優先級反轉問題,并提供優先級繼承、優先級天花板等機制。

同步和通信:多任務系統中,任務之間需要進行同步和通信。設計合適的同步機制,如信號量、互斥鎖、消息隊列等,并確保在多個任務之間實現可靠的數據傳輸和共享。

但是,這些僅僅是內核的基本功能,一個成熟的RTOS還應該具有更多的擴展功能予以支撐。例如內存管理功能、外設驅動的支持、硬件依賴性和可移植性、調試和測試功能等等。羅馬非一日而建,希望大家都能腳踏實地,樂于鉆研,樂于進步,共勉!

END

更多恩智浦AI-IoT市場和產品信息,邀您同時關注“NXP客棧”微信公眾號

wKgaomToOvWAacP0AABCdkRE230894.jpg ? ? ?

NXP客棧


恩智浦致力于打造安全的連接和基礎設施解決方案,為智慧生活保駕護航。

長按二維碼,關注我們

恩智浦MCU加油站


這是由恩智浦官方運營的公眾號,著重為您推薦恩智浦MCU的產品信息、開發技巧、教程文檔、培訓課程等內容。

wKgaomToOvWAT-uOAAATNlPH08Y563.jpg ?

長按二維碼,關注我們


原文標題:構建RTOS Kernel指南 (下)

文章出處:【微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

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

    關注

    146

    文章

    17393

    瀏覽量

    353141
  • 恩智浦
    +關注

    關注

    14

    文章

    5894

    瀏覽量

    108552

原文標題:構建RTOS Kernel指南 (下)

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    2K0300 OpenHarmony源碼構建指南

    2K0300 OpenHarmony源碼構建參考如下 2K0300先鋒派OpenHarmony源碼構建指南 2K0300 源碼編譯wiki
    發表于 02-05 09:36

    VCOP Kernel-C到C7000遷移工具用戶指南

    電子發燒友網站提供《VCOP Kernel-C到C7000遷移工具用戶指南.pdf》資料免費下載
    發表于 11-20 13:45 ?0次下載
    VCOP <b class='flag-5'>Kernel</b>-C到C7000遷移工具用戶<b class='flag-5'>指南</b>

    深入解析Zephyr RTOS的技術細節

    Zephyr是一個針對資源受限設備優化的小型、可縮放、多體系架構實時操作系統(RTOS)。Zephyr由Linux基金會維護[1],是一個以構建業界最佳的RTOS為目標的開源合作項目。近年來
    的頭像 發表于 10-22 16:47 ?862次閱讀
    深入解析Zephyr <b class='flag-5'>RTOS</b>的技術細節

    freertos和rtos區別是什么

    FreeRTOS 和 RTOS(實時操作系統)是兩個不同的概念,但它們之間有緊密的聯系。FreeRTOS 是一個特定的開源實時操作系統,而 RTOS 是實時操作系統的一般概念。 概念定義 RTOS
    的頭像 發表于 09-02 14:18 ?1684次閱讀

    RTOS與Linux有什么區別

    RTOS(Real-Time Operating System,實時操作系統)與Linux是兩種在不同應用場景下發揮重要作用的操作系統,它們在設計理念、功能特性、應用場景以及性能表現等方面存在顯著差異。以下是對RTOS與Linux區別的詳細分析。
    的頭像 發表于 08-20 16:05 ?4522次閱讀

    RTOS的特性和類型

    實時操作系統(RTOS)是一種可運行實時計算應用程序的軟件平臺,用于處理具有明確時間約束的事件和數據。與通用操作系統(GPOS)不同,RTOS必須在有限的硬件資源上調度應用程序之間的處理和數據共享
    的頭像 發表于 08-20 11:29 ?774次閱讀

    RTOS開發最佳實踐

    基于RTOS編寫應用程序時,有一些要注意事項。在本節中,您將學習RTOS開發最佳實踐,例如POSIX合規性、安全性和功能安全認證。
    的頭像 發表于 08-20 11:24 ?553次閱讀

    什么是實時操作系統(3)-在 RTOS 中可以期待什么?

    RTOS使用各種機制來管理任務、事件和內存,以確保嵌入式系統滿足時間約束。在本節中,您將了解構建嵌入式應用程序時需要考慮的RTOS功能,例如確定性、空間和時間分離、調度、內存管理和進程間通信。
    的頭像 發表于 07-23 12:00 ?1124次閱讀
    什么是實時操作系統(3)-在 <b class='flag-5'>RTOS</b> 中可以期待什么?

    RTOS-SDK如何關閉系統的提示信息?

    您好,我使用的1.3版本的RTOS-SDK,在STA狀態,連接狀態改變串口0會有提示信息產生,怎么樣才能將其關閉呢?
    發表于 07-22 07:04

    是否可以擴展esp_iot_rtos_sdk以具有api功能來進行云更新?

    是否可以擴展esp_iot_rtos_sdk以具有 api 功能來進行云更新?SDK 編程指南(盡管我認為它不適用于 rtos sdk)表明存在
    發表于 07-15 08:19

    ESP8266_RTOS_SDK LWIP構建失敗怎么解決?

    然后我克隆了 ESP8266_RTOS_SDK 的 release/v3.3 分支。這導致我的項目生成失敗,并出現以下情況: 抄送構建/lwip/lwip/src/api/if_api.o 在
    發表于 07-09 08:01

    ESP8266_RTOS_SDK-v3.4的構建錯誤如何解決?

    我嘗試將 SDK3.4 導入 Aithinker windows IDE 程序,然后構建它。不幸的是,我收到以下錯誤: LD /d/8266/ESP8266_RTOS
    發表于 07-08 07:59

    如何為ESP8266構建自定義盾牌?

    我正在尋找某種如何為ESP8266構建自定義盾牌的指南。 到目前為止,我已經使用 NODEMCU 構建了功能原型,但我現在想簡化事情并使其更小。 1. 是否有一些書面的、開放的硬件指南
    發表于 07-08 07:17

    請問cyw20719或cyw20721是否支持RTOS

    請確認 cyw20719 或 cyw20721 是否支持 RTOS? 我們希望使用 RTOS 控制外設 SPI、I2C、PWM、ADC 等。 如果有,您有移植指南嗎?
    發表于 05-20 06:39

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

    RTOS中的關鍵因素是最小的中斷延遲和最小的線程切換延遲。RTOS的價值在于它的響應速度或可預測性,而不是它在給定時間段內可以執行的工作量。
    發表于 03-05 09:32 ?726次閱讀
    基于<b class='flag-5'>RTOS</b>的應用進程中的典型線程
    主站蜘蛛池模板: 美女福利在线观看 | 亚州国产精品精华液 | 午夜免费啪视频观看网站 | 中文字幕视频一区二区 | 亚洲一区二区三区免费视频 | 国产精品第一页在线观看 | 成人性生活免费视频 | 黑人边吃奶边扎下面激情视频 | 免费看一毛一级毛片视频 | 国产日韩精品欧美一区色 | 人与性www| 一级特黄aaa大片在 一级特黄aaa大片在线观看视频 | 亚洲一区二区三区四区五区六区 | www.瑟瑟| 一区二区在线免费观看 | 五月天丁香激情 | 四虎影在线永久免费观看 | 亚洲高清网站 | 亚洲国产成人最新精品资源 | 国产产一区二区三区久久毛片国语 | 亚洲天堂不卡 | 久久永久视频 | 国产91小视频在线观看 | 爱爱网站免费 | 天堂资源在线官网资源 | 午夜片在线| 又黄又粗暴的120秒免费gif视频 | 色黄污在线看黄污免费看黄污 | 亚洲伊人久久大香线蕉啊 | 操的好爽视频 | 美女黄18以下禁止观看 | 久草干| 国产伦一区二区三区免费 | 欧美色影视 | 国产小视频在线高清播放 | 美女扒尿口给男人桶到爽 | 成人久久网站 | 天天做天天爱天天综合网2021 | 男人的天堂视频在线 | 精品福利在线视频 | 国产女主播在线播放一区二区 |