版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ronnie_Hu/article/details/78648347
上一篇文章中讲到了OSUnMapTbl数组,源代码中的定义如下:
/*
*********************************************************************************************************
* PRIORITY RESOLUTION TABLE
*
* Note: Index into table is bit pattern to resolve highest priority
* Indexed value corresponds to highest priority bit position (i.e. 0..7)
*********************************************************************************************************
*/
INT8U const OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
1)位于OSRdyGrp最低位为1的那一组;
2)对应OSRdyTbl[y]最低位为1的那一个任务。
也就是说我们要找到8位无符号整形数据xxxx xxxx(二进制)中最低位为1的那一个元素。
对于xxxx xxx1,应取0
对于xxxx xx10,应取1
对于xxxx x100,应取2
对于xxxx 1000,应取3
对于xxx1 0000,应取4
对于xx10 0000,应取5
对于x100 0000,应取6
对于1000 0000,应取7
可以利用Matlab来验证,Matlab程序和执行结果分别如下所示,结果与OSUnMapTbl数组一致。
close all;
clear all;
% 初始化
OSUnMapTbl = zeros(1,256);
% 赋值,需注意:Matlab数组的下标是从1开始,而C语言里是从0开始!
for i=1:256
if (mod(i+1,2) == 0)
OSUnMapTbl(i+1) = 0;
end
if (mod(i+2,4) == 0)
OSUnMapTbl(i+1) = 1;
end
if (mod(i+4,8) == 0)
OSUnMapTbl(i+1) = 2;
end
if (mod(i+8,16) == 0)
OSUnMapTbl(i+1) = 3;
end
if (mod(i+16,32) == 0)
OSUnMapTbl(i+1) = 4;
end
if (mod(i+32,64) == 0)
OSUnMapTbl(i+1) = 5;
end
if (mod(i+64,128) == 0)
OSUnMapTbl(i+1) = 6;
end
if (mod(i+128,256) == 0)
OSUnMapTbl(i+1) = 7;
end
end
% 打印到屏幕
for i=1:256
fprintf('%d ', OSUnMapTbl(i));
if(mod(i,16) == 0)
fprintf(' %% line %d', i/16 - 1);
fprintf('\n');
end
end