bitmap位图数据结构在RTOS优先级中的应用

bitMap就是用每一位来存放某种状态,用32位的数据位来存放,某种状态。

初始化操作,将所有位清零;
置1某位,给定某位,将某个位置一;
清零某位,清零某位,将某个位清零;
查找第一个置位的位置,从第0为开始,判断哪一个位置一;
查找算法,使用了两种算法:
1、从第0位开始,逐个查找;
2、分组查找法;
在这里插入图片描述
32位的数据分为4个组,分别对4个组进行查找,分组后的数据如下
在这里插入图片描述
列出数据表格如下所示:
static const uint8_t quickFindTable[] =
{
/* 00 / 0xff, 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
};
获得第一个为1位的位置函数如下所示:
在这里插入图片描述
用到的API函数,
tBitmapSet(&bitmap,i);//将第i位的bitmap数据置1
tBitmapGetFirstSet(&bitmap);//获得bitmap数据结构的第一个置一位的位置
位图结构在任务优先级的应用
传统的方式,我们需要维护一个任务就绪列表,当列表中某个位为1时表示此任务就绪,而当任务多的时候,就需要查找每一个位,判断是否有任务就绪。降低了效率。如下所示:
在这里插入图片描述
此时可以使用位图数据结构,创建一个位图就绪列表,让就绪位图中的每一位和就绪表对应,对应关系如下所示:
在这里插入图片描述
如果某一位为1表示有任务需要执行,为0表示没有任务需要执行。因此我们只需要执行从第0位开始到最高位,第一个置一的位,找到最高的优先级。可以使用getFristSet函数实现想要的操作。
在实际操作中,只需要在任务切换函数中,先判断哪个任务的优先级最高,

猜你喜欢

转载自blog.csdn.net/qq224feng/article/details/83275716