<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 多層位圖查表法

          多層位圖查表法

          作者: 時間:2016-12-01 來源:網(wǎng)絡 收藏
          嵌入式操作系統(tǒng)中,特別是實時操作系統(tǒng)中經(jīng)常采用位圖法解決任務的就緒以及查找最高優(yōu)先級的快速方法,即通過對所有的可能性采用查表的形式即可實現(xiàn)對于uC/OS-II這種64( 2^8)個優(yōu)先級任務的小系統(tǒng),可以通過求取x,y,得到對應的最高優(yōu)先級值,而且在查表的過程中,只有256種可能性,通過簡單的查表就能快速的實現(xiàn),但是當任務的優(yōu)先級數(shù)大于64個時,那又該如何讓實現(xiàn)呢?因為此時的查表不在那么容易,比存在16個bit時,2^16=65536,也就是存在65536種可能性,這個數(shù)據(jù)表格太大因此不是我們考慮的形式,那么如何確定呢,此時采用分層的形式就能比較快速的實現(xiàn),在64個任務時首先可以采用一個就緒表每一個bit代表一個任務優(yōu)先級,另外準備一個標志變量,每一個bit表示具體的某一個組,每一組八個數(shù)據(jù),通過這種x,y的形式能夠快速的實現(xiàn)查找。當任務對于64個時,我們可以嘗試多增加一維z的形式表示不同的任務,也就是實現(xiàn)分層,一共分成了三層,這樣就能通過這種多層的形式,通過同一個查詢表(256種可能性)的使用而快速的確定x,y,z,進而得到最高的優(yōu)先級號。這種三層的形式最多能夠支持512個優(yōu)先級號的操作系統(tǒng)。當多于這種情況時,就需要再次增加層數(shù)。

          具體的實現(xiàn)如下:

          本文引用地址:http://www.ex-cimer.com/article/201612/324515.htm

          z的每一個bit對應著1個y。也就是一共對應8個y。

          y的每一個bit對應著一個x,也就是一共對應著8*8個x。

          每一個x剛好也就對應著8個任務優(yōu)先級號。這樣就能夠通過x,y,z設置優(yōu)先級。

          因此可以采用下面的形式定義一個結(jié)構(gòu)體:

          #ifndef __HIGH_BITMAP_H_H__
          #define __HIGH_BITMAP_H_H__

          #define LENGTH_HIGHLAYER 8
          #define LENGTH_BYTE 8
          typedef unsigned char Byte;


          typedef struct
          {
          Byte high_Layer;
          Byte mid_Layer[LENGTH_HIGHLAYER];
          Byte low_Layer[LENGTH_HIGHLAYER*LENGTH_BYTE];
          }BitMaps;

          #ifdef __cplusplus
          extern "C"
          {
          #endif

          void inital_bitmap(BitMaps *bitmap);
          void set_bitmap(BitMaps *bitmap,int prio);
          int calculate_high_prio(BitMaps *bitmap);

          #ifdef __cplusplus
          }
          #endif

          #endif

          基本的操作函數(shù)如下:

          #include"high_bitmap.h"
          #include

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


          void inital_bitmap(BitMaps *bitmap)
          {
          int i = 0;
          if(NULL == bitmap)
          {
          return ;
          }

          bitmap->high_Layer = 0x00;
          for(; i < sizeof(bitmap->mid_Layer); ++ i)
          {
          bitmap->mid_Layer[i] = 0x00;
          }

          for (i = 0; i < sizeof(bitmap->low_Layer); ++ i)
          {
          bitmap->low_Layer[i] = 0x00;
          }
          }

          void set_bitmap(BitMaps *bitmap,int prio)
          {
          int x,y,z;
          if(NULL == bitmap || prio >= 512)
          {
          return ;
          }

          z = (prio >> 6)& 0x7;
          bitmap->high_Layer |= 1<
          y = (prio >> 3) & 0x7;
          bitmap->mid_Layer[z] |= 1<

          x = prio & 0x7;
          bitmap->low_Layer[z*8+y] |= 1< }

          int calculate_high_prio(BitMaps *bitmap)
          {
          int x,y,z;

          if(NULL == bitmap)
          {
          return -1;
          }

          z = OSUnMapTbl[bitmap->high_Layer];
          y = OSUnMapTbl[bitmap->mid_Layer[z]];
          x = OSUnMapTbl[bitmap->low_Layer[(z << 3)+y]];

          z = (z << 6) + (y << 3) + x;

          return z;
          }

          這種分層的實現(xiàn)方式能夠方便的解決位圖中多種可能性問題,通過分層可以使得各個變量x,y,z都能過使用查詢表(256種可能),解決了超大可能性的問題。當然這種方式也不是唯一的,但是確實是一種可行的方案,共享查詢表的。

          文章查詢的思路uC/OS-II中查詢的形式相同,也就是當對應的任務需要就緒時,可以通過設置對應的x,y,z對應的bit為1即可。



          關(guān)鍵詞: 多層位圖查表法操作系

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();