Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231930
  • 博文数量: 56
  • 博客积分: 2480
  • 博客等级: 大尉
  • 技术积分: 475
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-28 10:57
文章分类

全部博文(56)

文章存档

2012年(36)

2011年(4)

2010年(2)

2009年(14)

我的朋友

分类: 嵌入式

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进行调用

 

 

阅读(1729) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~