115_ucos iii获取最高优先级的实现理解
这个理解我是顺着正点原子的一个视频教程来的,看完了之后我自己翻了一下代码发现有一点细节地方视频中其实是讲错了的。首先看一下这个代码:
上面是原始的代码。
首先,88行以及91行我觉得两个应该是可以合二为一的,不知道理解是否准确?
接下来,理解一下如何获取最高的优先级。需要注意的是,这个OS中最高优先级是使用位来实现的,假设采用的是大端的排列格式,这样理解下去会好一点。我拿到的这一份代码我分析了一下,默认的情况下是设置了64个优先级,使用了2个32bit来存储相应的信息状态。
如何获取最高优先级呢?采用的方法关键在于97行代码,找到第一个置1的bit,之后数一下前面的0的个数。而判断的第一步是判断一个32bit的信息是否是0,如果是的话,也就是uint32的0,32个位应该全都是0。遇到这种情况,应该继续向下寻找。94行为什么加了一个32(宏的大小)呢?其实就是因为上一个uint32的区域中相应的32个优先级全都没有生效的。
关于前导0的计算,教程中说道是采用了CPU的硬件计算,这其实是我觉得我需要说一下的地方。虽然函数命名的时候带有一个CPU的关键词,但是这个确实不是硬件计算的一个例子,而是一个简单的查表而已。
代码:
上面是前导0个数的求解,求解的方式其实是按照8个bit分而治之的方式(如果WORD的大小是8的话那就应该只有一次,不需要分了)。计算的方法更是简单粗暴,把所有的情况作了一张表之后查表。表格如下:
这种方式其实是很高效的,但是跟硬件计算支持似乎是沾不到边的,但是如果说查表也算是硬件的一个方式的话,那我也不好辩驳,但是这其实就是一个很通用的软件算法而已。
文档来源:51CTO技术博客https://blog.51cto.com/greyzhang/3014614
页:
[1]