基于位图的优先级算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
要求写就绪表,获取最高优先级怎样让任务进入退出就绪.

6对应二进制为:000110

高3位:000=0通过OSMapTbl映射后:OSMapTbl[prio>>3]=OSMapTbl[0]=00000001

低3位:110=6通过OSMapTbl映射后: OSRdyTbl[prio>>3]=OSRdyTbl[0]=010*******

10对应二进制为:001010

高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010

低3位: 010=2通过OSMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00000100

11对应二进制为:001011

高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010

低三位:011=3通过OsMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00001000

17对应二进制为:010001

高三位:010=2经过OsMapTbl映射后 OsMapTbl[prio>>3]=OsMapTbl[2]=00000100

低三位:001=1经过OsMapTbl映射后 OsRdyTbl[prio>>3]=OsRdyTbl[2]=00000010

***通过就绪任务算法:

OSRdyGrp|=OSMapTbl[prio>>3] //获取就绪表中的行

OsRdyTbl[prio>>3]|=OSMapTbl[prio&0x07]//获取就绪表中的列

最后OSRdyGrp的值就是将所有OsMapTbl[prio>>3]进行位或运算

OSRdyGrp=00000001|00000010|00000010|00000100

=00000111=0x07

OSRdyTbl[0]=01000000

OSRdyTbl[1]=00000100|00001000=00001100 相同的行列要进行或运算

OSRdyTbl[2]=00000010

然后查询优先级判定表OSUnMapTbl[]

OSRdyGrp=0x07

Y=OSUnMapTbl[0x07]=0说明最高优先级在第0组

OSRdyTbl[0]=01000000=0x40

X=OSUnMapTbl[0x40]=6

最高优先级为:prio=y*8+x=6

基于位图的优先级算法
https://johnjoyjzw.github.io/2020/02/05/基于位图的优先级算法/
Author
John Joy
Posted on
February 5, 2020
Licensed under