<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

多層位圖查表法

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

具體的實(shí)現如下:

本文引用地址:http://dyxdggzs.com/article/201612/324515.htm

z的每一個(gè)bit對應著(zhù)1個(gè)y。也就是一共對應8個(gè)y。

y的每一個(gè)bit對應著(zhù)一個(gè)x,也就是一共對應著(zhù)8*8個(gè)x。

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

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

#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

基本的操作函數如下:

#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;
}

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

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



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>