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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ucOSII操作系統(tǒng)就緒表分析

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

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

對(duì)于ucOSII而言,其最大的任務(wù)數(shù)是64個(gè),因此為了標(biāo)記其任務(wù)的狀態(tài),ucOSII使用了八個(gè)變量表示每個(gè)任務(wù)的狀態(tài),每個(gè)變量每個(gè)位對(duì)應(yīng)任務(wù)的狀態(tài):

如果我們直接去查找就緒任務(wù)的最高優(yōu)先級(jí)任務(wù),那我們需要遍歷這八個(gè)變量,去判斷最高位是1,很顯然在最壞情況下需要遍歷64次,那有沒有更好的方法呢,仔細(xì)觀察發(fā)現(xiàn)一個(gè)規(guī)律,當(dāng)任務(wù)優(yōu)先級(jí)是8的時(shí)候,其就緒標(biāo)志位在OSRdyTbl[1]中的第0位,8對(duì)應(yīng)的二進(jìn)制是00001000,這樣00001正好是1,000正好是0, 我們?cè)诳纯雌渌遣皇沁@樣,例如7的二進(jìn)制00000111,00000對(duì)應(yīng)的是0,也就是OSRdy[0],111對(duì)應(yīng)7,也就是第7位,繼續(xù)驗(yàn)證發(fā)現(xiàn)確實(shí)所有的優(yōu)先級(jí)都滿足這個(gè)規(guī)律,因此我們可以利用這一點(diǎn)來加快查找速度。 這樣我們就有如下結(jié)構(gòu):

實(shí)際上有OSRdyl的下標(biāo)表示中只有3,4,5三位有效,因?yàn)檫@里只有8組,不過這個(gè)無所謂,都是一樣的。 為了表示這些組中有沒有就緒任務(wù),ucOSII中定義了一個(gè)OSRdyGrp這個(gè)變量,該變量是一個(gè)8位的無符號(hào)整型,這樣每一位表示每個(gè)組有無就緒任務(wù):

這樣OSRdyGrp的初始值為0,當(dāng)有一個(gè)任務(wù)創(chuàng)建時(shí),那就將該任務(wù)所在的組(即OSRdyTbl)對(duì)應(yīng)的OSRdyGrp相應(yīng)的位設(shè)置為1,當(dāng)有任務(wù)刪除時(shí),那就將該任務(wù)所在的組對(duì)應(yīng)的OSRdyGrp相應(yīng)的位設(shè)置為0,如下:

創(chuàng)建任務(wù)(登記):

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

OSRdyGrp |= (prio>>3);

刪除任務(wù)(注銷):

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

OSRdyGrp &= ~(prio>>3);

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

這樣上面的操作就變?yōu)榱巳缦虏僮鳎?/p>

創(chuàng)建任務(wù)(登記):

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

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

刪除任務(wù)(注銷):

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

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

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

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

再次強(qiáng)調(diào)查找表的目的是找到一個(gè)變量最高位,比如5的最高位是2,3的最高位是1,1的最高位是0.....

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

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

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

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

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                             */
};

確定最高優(yōu)先級(jí)的過程就是這樣:

grp = OSUnMapTbl [OSRdyGrp];

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

至此,整個(gè)ucOSII的就緒表的分析結(jié)束了,思想很重要,不要僅僅拘泥據(jù)源碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6827

    瀏覽量

    123335
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28373
  • UCOSIII
    +關(guān)注

    關(guān)注

    2

    文章

    26

    瀏覽量

    6078
  • 就緒表
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1459
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    UCOSII操作系統(tǒng)怎樣與周立功GUI的程序結(jié)合的

    操作系統(tǒng)的界面用的是周立功的GUI,有GUI的程序,但是弄不清GUI的程序該怎樣與UCOSII的程序結(jié)合,放在UCOSII的哪里還是單獨(dú)讓UCOSII建立任務(wù)調(diào)用他?
    發(fā)表于 10-20 22:43

    操作系統(tǒng)例程 51ucosii

    操作系統(tǒng)例程51ucosii
    發(fā)表于 11-10 16:56

    移植的ucosii操作系統(tǒng)有時(shí)候會(huì)卡死

    我移植的ucosii操作系統(tǒng),怎么有時(shí)候會(huì)卡死? 加了系統(tǒng)的程序2015.3.7.0000調(diào)整按鍵完成會(huì)卡死.rar (4.94 MB )
    發(fā)表于 04-08 08:01

    熟悉的uCosII實(shí)時(shí)操作系統(tǒng)

    連云平臺(tái)都是他們自主開發(fā)的,且MQTT協(xié)議的sdk包有用java、nodejs等等實(shí)現(xiàn)的,連國(guó)產(chǎn)的RT-Thread,想要用里面的MQTT組件,都必須用RT-Thread系統(tǒng)才能實(shí)現(xiàn),顯得很亂,學(xué)習(xí)成本特別高。 本項(xiàng)目基于大家目前現(xiàn)有的開發(fā)板,利用熟悉的uCosII實(shí)時(shí)
    發(fā)表于 08-03 07:42

    UCOSII嵌入式操作系統(tǒng)的任務(wù)調(diào)度策略是什么

    其實(shí)整個(gè)UCOSII嵌入式操作系統(tǒng)的任務(wù)調(diào)度策略便是如此,現(xiàn)在來進(jìn)行一個(gè)總結(jié):①初始化完畢以后,系統(tǒng)啟動(dòng),某個(gè)任務(wù)在執(zhí)行中時(shí),每隔一定周期發(fā)生滴答時(shí)鐘中斷,系統(tǒng)會(huì)在中斷中遍歷整個(gè)任務(wù)鏈
    發(fā)表于 12-27 06:13

    嵌入式操作系統(tǒng)UCOSII移植筆記

    嵌入式操作系統(tǒng)UCOSII移植筆記記錄學(xué)習(xí)、不斷進(jìn)步、第一次嘗試邊學(xué)習(xí)邊記錄的方式進(jìn)行學(xué)習(xí),總體感覺不錯(cuò)、也算是分享一下自己的學(xué)習(xí)心得吧!看的是正點(diǎn)原子的教程,用的是精英版開發(fā)板,芯片
    發(fā)表于 12-27 06:35

    UCOSII操作系統(tǒng)的簡(jiǎn)介

    前言這是我將UCOSII操作系統(tǒng)移植在STM32單片機(jī)上后進(jìn)行UCOSII操作系統(tǒng)學(xué)習(xí)的一些筆記與理解,此文最后會(huì)附上我自己在UCOSII
    發(fā)表于 01-12 06:00

    基于ucosii實(shí)時(shí)操作系統(tǒng)的RS485通信

    一、實(shí)現(xiàn)效果基于ucosii實(shí)時(shí)操作系統(tǒng)的RS485通信,采用USART + DMA進(jìn)行收發(fā),二、開發(fā)環(huán)境開發(fā)工具:KEIL V5開發(fā)板: STM32f107RC采用方式:USART + DMA
    發(fā)表于 02-18 07:35

    UCOSII操作系統(tǒng)(英文版)

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

    嵌入式實(shí)時(shí)操作系統(tǒng)ucosii分析

    近年來,在單片機(jī)系統(tǒng)中嵌入操作系統(tǒng)已經(jīng)成為人們?cè)絹碓疥P(guān)心的一個(gè)話題。本文通過對(duì)一種源碼公開的嵌入式實(shí)時(shí)操作系統(tǒng)ucos ii的分析,以51系列單片機(jī)為例,闡述了在單片機(jī)中
    發(fā)表于 11-17 11:48 ?107次下載

    嵌入式實(shí)時(shí)操作系統(tǒng)uCOSII原理及應(yīng)用_任哲_編著

    電子發(fā)燒友網(wǎng)站提供《嵌入式實(shí)時(shí)操作系統(tǒng)uCOSII原理及應(yīng)用_任哲_編著.txt》資料免費(fèi)下載
    發(fā)表于 07-30 15:03 ?0次下載

    嵌入式實(shí)時(shí)操作系統(tǒng)ucosII 在奮斗板上的應(yīng)用

    嵌入式實(shí)時(shí)操作系統(tǒng)ucosII 在奮斗板上的應(yīng)用
    發(fā)表于 10-26 08:57 ?13次下載
    嵌入式實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>ucosII</b> 在奮斗板上的應(yīng)用

    UCOSII操作系統(tǒng)的一些使用程序詳細(xì)資料說明

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

    ucosII嵌入式實(shí)時(shí)操作系統(tǒng)實(shí)驗(yàn)

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

    【RTOS】RTOS實(shí)時(shí)操作系統(tǒng)隨筆(結(jié)合UCOSII相關(guān)移植)

    文章向大家介紹操作系統(tǒng)的基本功能,以及UCOSII的移植方法。RTOS:Real time Operation SystemKeil RTX 是免版稅的確定性實(shí)時(shí)操作系統(tǒng),適用于 ARM 和 Cortex-M 設(shè)備。RTOS可以
    發(fā)表于 12-23 19:56 ?4次下載
    【RTOS】RTOS實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>隨筆(結(jié)合<b class='flag-5'>UCOSII</b>相關(guān)移植)