分类: 嵌入式
2011-12-14 10:37:15
rt_thread 任务调度算法解析
1, 优先级队列( 针对 32 个优先级 的队列 )
使用 rt_thread_ready_priority_group ( rt_uint32_t ), 32 位的无符号整数, 用32 位 表示 32 种 不同的优先级 的 线程的是否存在如图:
将这 32 位分为 4 组, 每组 8 位, 取值范围 0-255, 这也就是为什么 在 void rt_schedule() 出现
获取需要调度的线程组:
rt_thread_ready_priority_group&0xff rt_thread_ready_priority_group & 0xff00
rt_thread_ready_priority_group & 0xff0000
这三个判读的目的,目的是判断 所分的4个组中 那个组中有 需要调度的线程。
将线程排队入 优先级队列 :
rt_err_t rt_thread_startup (rt_thread_t thread)
{
thread->number_mask = 1L << thread->current_priority;
这里确定 该线程所在 优先级队列的 位置 。
}
2, 位图取值 获取线程的编号
rt_uint8_t rt_lowest_bitmap[256]
得到需要调度的线程组 以后 ,需要 知道 最高优先级的 序号, rt_lowest_bitmap 在这里就起到一个 映射表的作用了 ,实际也就是 一个很简单的 哈希表, 每一组 取值范围是 0-255, 取值越大 表示 优先级越高,0-255个成员 对应的取值是 0-7 ( 为什么不是 1-8 呢? , 因为数组的下标是 从0 开始的 )
3, 线程的调度
在 以下方法中将线程 从优先队列中删除
void rt_schedule_remove_thread(struct rt_thread* thread)
{
rt_thread_ready_priority_group &= ~thread->number_mask;
}
rt_err_t rt_thread_suspend (rt_thread_t thread) 对其进行调用
rt_thread_sleep() 对 rt_thread_suspend进行调用
rt_sem_release对 rt_thread_suspend进行调用