嵌入式操作系统内核原理和开发(实时调度)
作者:网络转载 发布时间:[ 2012/10/8 9:58:38 ] 推荐标签:
加入调度队列的情况考虑的比较少,我们只需要判断当前的高优先级和加入任务优先级之间的关系即可。如果新加入的任务优先级高,那么优先级发生了改变;反之什么也不需要做。反之删除任务则比较复杂一些,我们需要判断移除的任务是不是高优先级,不是还好处理,如果清除出去的任务正好是高优先级,我们需要从bitmap中寻找下一个高优先级了,这个函数是bit_search_first_one。函数第一个参数是bitmap数组,第二个参数是当前高优先级,第三个参数是剩下的优先级总数,返回值为次优先级距离当前高优先级的偏移值。
/*For 32 bit cpu*/ RAW_S32 bit_search_first_one(RAW_U32 *base, RAW_S32 offset, RAW_S32 width) { register RAW_U32 *cp, v; register RAW_S32 position; cp = base; cp += offset >> 5; if (offset & 31) { #if (CONFIG_RAW_LITTLE_ENDIAN > 0) v = *cp & ~(((RAW_U32)1 << (offset & 31)) - 1); #else v = *cp & (((RAW_U32)1 << (32 - (offset & 31))) - 1); #endif } else { v = *cp; } position = 0; while (position < width) { if (v) { /* includes 1 --> search bit of 1 */ if (!position) position -= (offset & 31); #if (CONFIG_RAW_LITTLE_ENDIAN > 0) if (!(v & 0xffff)) { v >>= 16; position += 16; } if (!(v & 0xff)) { v >>= 8; position += 8; } if (!(v & 0xf)) { v >>= 4; position += 4; } if (!(v & 0x3)) { v >>= 2; position += 2; } if (!(v & 0x1)) { ++position; } #else if (!(v & 0xffff0000)) { v <<= 16; position += 16; } if (!(v & 0xff000000)) { v <<= 8; position += 8; } if (!(v & 0xf0000000)) { v <<= 4; position += 4; } if (!(v & 0xc0000000)) { v <<= 2; position += 2; } if (!(v & 0x80000000)) { ++position; } #endif if (position < width) { return position; } else { return -1; } } else { /* all bits are 0 --> 1 Word skip */ if (position) { position += 32; } else { position = 32 - (offset & 31); } v = *++cp; } } return -1; } |
这个函数其实有两个,其中一个是32位cpu,另一个是为8位cpu准备的。当然,我们这里看到的是前一种情形,这里作者还考虑了大小端的情况,小端是x86之类的cpu,大端是powerpc之类的cpu,主要是指字节序不同而已。按照作者的说法,这是目前快的查找方法,能比ucos查找表的方法快多少,我不太清楚,估计只能按照系统设备性能的平均值来估算了,别的还真不好说。要是本身用户侧的代码写的比较差,那么争取的这点调度性能其实意义也不大。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南