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

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

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

3天內不再提示

ucOSII操作系統就緒表分析

CHANBAEK ? 來源:博客園-LSWen ? 作者:博客園-LSWen ? 2023-02-15 14:56 ? 次閱讀

ucOSII的緒表中使用一個很妙的查找方式,下面對其查找過程進行詳細分析(目的就是加快查找速度)

對于ucOSII而言,其最大的任務數是64個,因此為了標記其任務的狀態,ucOSII使用了八個變量表示每個任務的狀態,每個變量每個位對應任務的狀態:

如果我們直接去查找就緒任務的最高優先級任務,那我們需要遍歷這八個變量,去判斷最高位是1,很顯然在最壞情況下需要遍歷64次,那有沒有更好的方法呢,仔細觀察發現一個規律,當任務優先級是8的時候,其就緒標志位在OSRdyTbl[1]中的第0位,8對應的二進制是00001000,這樣00001正好是1,000正好是0, 我們在看看其他是不是這樣,例如7的二進制00000111,00000對應的是0,也就是OSRdy[0],111對應7,也就是第7位,繼續驗證發現確實所有的優先級都滿足這個規律,因此我們可以利用這一點來加快查找速度。 這樣我們就有如下結構:

實際上有OSRdyl的下標表示中只有3,4,5三位有效,因為這里只有8組,不過這個無所謂,都是一樣的。 為了表示這些組中有沒有就緒任務,ucOSII中定義了一個OSRdyGrp這個變量,該變量是一個8位的無符號整型,這樣每一位表示每個組有無就緒任務:

這樣OSRdyGrp的初始值為0,當有一個任務創建時,那就將該任務所在的組(即OSRdyTbl)對應的OSRdyGrp相應的位設置為1,當有任務刪除時,那就將該任務所在的組對應的OSRdyGrp相應的位設置為0,如下:

創建任務(登記):

OSRdyTbl[prio>>3] |= (prio&0x07);

OSRdyGrp |= (prio>>3);

刪除任務(注銷):

OSRdyTbl[prio>>3] &= ~(prio&0x07);

OSRdyGrp &= ~(prio>>3);

在ucOSII中為了加快速度,定義了一個數組const UINT8 OSMapTbl[8](說明:這里可以看到OSRdyGrp對其一個變量位操作會通過很多指令完成,但是如果對一個固定的常量進行位操作就減少很多指令)

這樣上面的操作就變為了如下操作:

創建任務(登記):

OSRdyTbl[prio>>3] |= OSMapTbl [prio&0x07];

OSRdyGrp |= OSMapTbl [(prio>>3)];

刪除任務(注銷):

OSRdyTbl[prio>>3] &= ~OSMapTbl [prio&0x07];

OSRdyGrp &= ~OSMapTbl [(prio>>3)];

這樣就完成了任務創建和刪除時對就緒表的操作,在ucOSII中還需要涉及到最高優先級查找,因為當當前運行任務進入阻塞態時,下一個運行任務就應該時最高優先級任務,因此我們必須找到最高優先級的任務,顯然,我們需要找到數組中OSRdyTbl的為1的最高位在哪。 最然這個過程很簡單,但是我們需要加快查找速度,在ucOSII中定義了一個查找表,這個表可以直接索引到對應的為1的最高位(也就是就緒表中最高優先級),其實這個過程和上面對OSRdyGrp的操作是一個反過程,首先我們要確定哪個組(OSRdyTbl[8])中有就緒任務,那這個如何做呢? 假設此時OSRdyGrp=5(00000101),可以看到最高優先級的組在2組(最高位為2位),現在我們還需要確定組中的哪個位,那又如何確定呢? 上面說過了,需要定義一個查找表,這樣我們就從這個方面下手。

首先我們需要完成OSRdyGrp=5映射到2類似這種映射(其實就是找出OSRdyGrp的最高位),其次就是找出OSRdyTb[]中的最高位,有趣的事情出現了,這兩個過程其實是同一個過程,都是找一個變量的最高位,因此我們只需要設計一張表就可以完成此工作哦,這個就是ucOSII中查找就緒任務的妙處所在。 好了,下面我們來設計這張表:

再次強調查找表的目的是找到一個變量最高位,比如5的最高位是2,3的最高位是1,1的最高位是0.....

最直接的辦法是枚舉,你沒有看錯,就是這么簡單粗暴,總共有2的8次方就是256種情況,天啊,這我弄不了,這輩子都弄不了,其實不用你一個一個去枚舉,數學家說:不就是找出一個最高位么,簡單,log2X就這么easy!,好了,我們就可到了查找表:

UnMapTbl[256]={0,log21,日志22,日志23,日志24,日志25,日志26,日志27......};

通過excel計算得到UnMapTbl[256]={ 0,0,1,2,2,2,3,3,3......};

馬上有人開始說了,這不對吧,這個和源碼中的不一樣,確實,別急,且聽我說, 這里由于ucOSII中的優先級是反的,也就是數值越大,其優先級越低,因此,我們不是找到最高位,而是找到最低位,這樣查找表就變成了源碼中的那樣了,也就是

INT8U  const  OSUnMapTbl[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};

確定最高優先級的過程就是這樣:

grp = OSUnMapTbl [OSRdyGrp];

prio = (grp <<3) + OSUnMapTbl [OSRdyTbl [grp] ;

至此,整個ucOSII的就緒表的分析結束了,思想很重要,不要僅僅拘泥據源碼。

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

    關注

    37

    文章

    7097

    瀏覽量

    124974
  • 變量
    +關注

    關注

    0

    文章

    614

    瀏覽量

    28831
  • UCOSIII
    +關注

    關注

    2

    文章

    26

    瀏覽量

    6498
  • 就緒表
    +關注

    關注

    0

    文章

    2

    瀏覽量

    1535
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    UCOSII操作系統怎樣與周立功GUI的程序結合的

    操作系統的界面用的是周立功的GUI,有GUI的程序,但是弄不清GUI的程序該怎樣與UCOSII的程序結合,放在UCOSII的哪里還是單獨讓UCOSII建立任務調用他?
    發表于 10-20 22:43

    操作系統例程 51ucosii

    操作系統例程51ucosii
    發表于 11-10 16:56

    移植的ucosii操作系統有時候會卡死

    我移植的ucosii操作系統,怎么有時候會卡死? 加了系統的程序2015.3.7.0000調整按鍵完成會卡死.rar (4.94 MB )
    發表于 04-08 08:01

    熟悉的uCosII實時操作系統

    連云平臺都是他們自主開發的,且MQTT協議的sdk包有用java、nodejs等等實現的,連國產的RT-Thread,想要用里面的MQTT組件,都必須用RT-Thread系統才能實現,顯得很亂,學習成本特別高。 本項目基于大家目前現有的開發板,利用熟悉的uCosII實時
    發表于 08-03 07:42

    UCOSII嵌入式操作系統的任務調度策略是什么

    其實整個UCOSII嵌入式操作系統的任務調度策略便是如此,現在來進行一個總結:①初始化完畢以后,系統啟動,某個任務在執行中時,每隔一定周期發生滴答時鐘中斷,系統會在中斷中遍歷整個任務鏈
    發表于 12-27 06:13

    嵌入式操作系統UCOSII移植筆記

    嵌入式操作系統UCOSII移植筆記記錄學習、不斷進步、第一次嘗試邊學習邊記錄的方式進行學習,總體感覺不錯、也算是分享一下自己的學習心得吧!看的是正點原子的教程,用的是精英版開發板,芯片
    發表于 12-27 06:35

    UCOSII操作系統的簡介

    前言這是我將UCOSII操作系統移植在STM32單片機上后進行UCOSII操作系統學習的一些筆記與理解,此文最后會附上我自己在UCOSII
    發表于 01-12 06:00

    基于ucosii實時操作系統的RS485通信

    一、實現效果基于ucosii實時操作系統的RS485通信,采用USART + DMA進行收發,二、開發環境開發工具:KEIL V5開發板: STM32f107RC采用方式:USART + DMA
    發表于 02-18 07:35

    UCOSII操作系統(英文版)

    UCOSII操作系統(英文版)
    發表于 03-25 14:29 ?0次下載

    嵌入式實時操作系統ucosii分析

    近年來,在單片機系統中嵌入操作系統已經成為人們越來越關心的一個話題。本文通過對一種源碼公開的嵌入式實時操作系統ucos ii的分析,以51系列單片機為例,闡述了在單片機中
    發表于 11-17 11:48 ?107次下載

    嵌入式實時操作系統uCOSII原理及應用_任哲_編著

    電子發燒友網站提供《嵌入式實時操作系統uCOSII原理及應用_任哲_編著.txt》資料免費下載
    發表于 07-30 15:03 ?0次下載

    嵌入式實時操作系統ucosII 在奮斗板上的應用

    嵌入式實時操作系統ucosII 在奮斗板上的應用
    發表于 10-26 08:57 ?13次下載
    嵌入式實時<b class='flag-5'>操作系統</b><b class='flag-5'>ucosII</b> 在奮斗板上的應用

    UCOSII操作系統的一些使用程序詳細資料說明

    的時候。..。. 對于當時自己還沒學的時候,一直很納悶什么是操作系統哈,,是什么原因讓人們去編寫操作系統程序,,到底是為了解決什么問題,而寫的操作系統其實最貼近人的例子就是自己的電腦啦,,,和自己的沒有
    發表于 05-22 18:01 ?4次下載
    <b class='flag-5'>UCOSII</b><b class='flag-5'>操作系統</b>的一些使用程序詳細資料說明

    ucosII嵌入式實時操作系統實驗

    ucosII嵌入式實時操作系統實驗(嵌入式開發有中年危機嗎)-該文檔為ucosII嵌入式實時操作系統實驗總結文檔,是一份很不錯的參考資料,具有較高參考價值,感興趣的可以下載看看…………
    發表于 07-30 17:05 ?12次下載
    <b class='flag-5'>ucosII</b>嵌入式實時<b class='flag-5'>操作系統</b>實驗

    【RTOS】RTOS實時操作系統隨筆(結合UCOSII相關移植)

    文章向大家介紹操作系統的基本功能,以及UCOSII的移植方法。RTOS:Real time Operation SystemKeil RTX 是免版稅的確定性實時操作系統,適用于 ARM 和 Cortex-M 設備。RTOS可以
    發表于 12-23 19:56 ?4次下載
    【RTOS】RTOS實時<b class='flag-5'>操作系統</b>隨筆(結合<b class='flag-5'>UCOSII</b>相關移植)
    主站蜘蛛池模板: 国产美女叼嘿视频免费看 | 欧美一级别 | 亚洲精品福利视频 | 一级特黄女毛毛片 | 一区二区三区高清在线观看 | 天天曰夜夜操 | 欧美成人精品福利网站 | 日日摸夜夜爽 | 小雪被老外黑人撑破了视频 | 狠狠色丁香婷婷综合久久来 | 日韩欧美黄色 | 中文字幕乱码人成乱码在线视频 | 天天做天天做天天综合网 | 国产乱子伦| 四虎影视在线观看 | 中文天堂最新版在线精品 | 亚洲成a人在线播放www | 伊人久久大香线蕉综合高清 | 亚洲色图27p| 久久五月网 | 91大神在线观看精品一区 | 美女露出尿口让男人桶爽网站 | 看草逼 | 最新看片网址 | 亚洲v在线 | 女人张开腿让男人桶免费最新 | 久久综合欧美成人 | 国产精品免费观看网站 | 中文天堂最新版资源新版天堂资源 | 日本特黄色大片 | 中文字幕亚洲综合久久2 | 欧美日本俄罗斯一级毛片 | 免费黄色三级网站 | 国产理论| 一区二区三区四区无限乱码在线观看 | 五月天精品在线 | 国产理论片在线观看 | 老师我好爽再深一点好大 | 欧美成人精品福利网站 | 国产伦一区二区三区免费 | 中文字幕成人乱码在线电影 |