完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
先raw os 支持任意优先级的设置,可以通过raw_config.h 来设置的,比如:
#define CONFIG_RAW_PRIO_MAX 63 Raw os 一个优先级对应一个就绪双向链表 具体可以看这个结构体 typedef struct RAW_RUN_QUEUE { RAW_S32 highest_priority; LIST task_ready_list[CONFIG_RAW_PRIO_MAX]; RAW_U32 task_bit_map[NUM_WORDS]; } RAW_RUN_QUEUE; 由于raw os 是支持同等优先级的所以一个就绪链表上可能存在多个相同优先级的task。 task_bit_map 是一个无符号32位数组,一个无符号数是32位,每一位代表一个优先级。 这样的话后面的问题就简单了,找到最高优先级的话主要是找到task_bit_map 第一个bit 为1 的地方。然后主要是对应这个bit位的就绪链表的操作,把就绪的任务加到链表头或者尾部。 理论是上面这些,主要是实现了。传统的os 比如ucos 这种维护了一个头为单指针的双向链表,这样导致链表插入到尾部的速度很慢,得不偿失,所以raw os 采用了头为双指针的双向链表,插入速度更快。 找到第一个bit 为 1 的算法目前采用了C语言最快的算法,保证了最短时间内找到最高优先级的任务。 内核调度的对应代码在raw_pend.c里,可以细细品味代码的实现,有了以上的理论。 评分 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-13 05:20 , Processed in 0.639689 second(s), Total 40, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号