打印

ucos任务调度的问题

[复制链接]
4336|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
beebeecici|  楼主 | 2012-1-16 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
john_lee| | 2012-1-16 13:56 | 只看该作者
本帖最后由 john_lee 于 2012-1-16 23:36 编辑

三个时候:
  • 任务请求未准备好的同步对象时。
    当前任务请求同步对象“调用了*Pend()”,或进行延时操作。调度器将进行一次调度,把当前任务从运行态转为阻塞态,并把处于就绪态的任务中优先级最高的任务转入运行态。
  • 任务释放同步对象时。
    当前任务释放同步对象“调用了*Post()”,当此同步对象上有阻塞的任务,如果释放操作唤醒了阻塞的任务,并且刚唤醒的任务优先级比当前任务优先级高,那么调度器将进行一次调度,把当前任务转为就绪态,把刚唤醒的任务转入运行态。
  • 任务抢占时。
    中断发生,如果唤醒了阻塞的任务,并且刚唤醒的任务的优先级比当前被中断的任务优先级高,那么调度器将进行一次调度,把当前任务转入就绪态,把唤醒的任务转为运行态。
也可以把1、2合在一起称为调用同步原语导致调度。

使用特权

评论回复
板凳
xinzha| | 2012-1-16 16:17 | 只看该作者
1、调用系统函数时
2、发生中断时
3、时间片到时

使用特权

评论回复
地板
beebeecici|  楼主 | 2012-1-16 21:57 | 只看该作者
先谢过两位的回复,但我有点笨,希望能得到更详细的答复。
   或者我换一种说法,我知道ucos总是执行处于就绪状态的最高优先级的任务,就像单片机的中断会在某个时钟周期周期性地检测中断标志,我想ucos是不是也应该周期性的去检测现在运行的是不是就绪状态的最高优先级的任务呢?
   于是我查过时钟节拍的源程序,没有任何发现,那是为什么呢?

使用特权

评论回复
5
john_lee| | 2012-1-16 23:41 | 只看该作者
系统节拍中断,只能算导致调度的“充分”条件,而并不是“必要”条件。

使用特权

评论回复
6
jiebin689| | 2012-1-18 15:19 | 只看该作者
本帖最后由 jiebin689 于 2012-1-18 15:26 编辑

揭开神秘的面纱—任务调度全程追踪
For example1 创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级
void Task1(void)                void Task2(void)
{                                            {
while(1)                                    while(1)
{                                                {
blinkled1();                                   blinkled2();
Task1Data++;                              Task2Data++;
OSTimeDly(25);                             OSTimeDly(50);
}                                                 }
}                                                  }

void main()
{
sysinit();
OSInit();
OSTaskCreate( Task1, (void *)&Task1Data,
                        (void *)&Task1Stk[TASK_STK_SIZE],Task1prio);
OSTaskCreate (Task2, (void *)&Task2Data,
                         (void *)&Task2Stk[TASK_STK_SIZE],Task2prio);
ticker_start(OS_TICKS_PER_SEC);
OSStart();
}

void OSStart(void)
{
INT8U y, x;
if (OSRunning== FALSE)
{ 判断是否没有启动内核
y =OSUnMapTbl[OSRdyGrp];
x =OSUnMapTbl[OSRdyTbl[y]];
OSPrioHighRdy= (INT8U)((y << 3) + x); 找到优先级最高的准备就绪任务
OSPrioCur =OSPrioHighRdy; 当前运行任务优先级
OSTCBHighRdy =OSTCBPrioTbl[OSPrioHighRdy]; 根据任务优先级找到任务
OSTCBCur =OSTCBHighRdy;
OSStartHighRdy(); 让优先级最高的任务运行起来
}
}

void  OSSched(void)
{
INT8U y;
OS_ENTER_CRITICAL();
if ((OSLockNesting|OSIntNesting) == 0) { 调度锁,或者处于中断状态禁止调度
y =OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy= (INT8U)((y << 3) +OSUnMapTbl[OSRdyTbl[y]]);
获取准备就绪组里最高优先级的任务
if (OSPrioHighRdy!=OSPrioCur) {
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];
设置运行任务为最高优先级任务
OSCtxSwCtr++;
OS_TASK_SW(); 执行上下文切换
} }
OS_EXIT_CRITICAL();
}

uC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。
uC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换

我也在学uC/OS,
LZ看下.

使用特权

评论回复
7
beebeecici|  楼主 | 2012-1-19 01:43 | 只看该作者
楼上的,我也明白,任务调度的工作就是:查找准备的任务并进行上下文切换,但你有想过,在这个系统里,程序是怎样组织,什么时候去查找这个就绪的最高优先级任务?
  真如3楼所说,是1、调用系统函数时2、发生中断时3、时间片到时?
  但每次调用系统函数都会有这个查询吗?另外两点条件同问?
  好快过年了,这几天好忙,现在刚回到家冲完凉,集体活动不去又不是很好。。。还有4天,等忙完这几天就有5天时间好好看书了,嘻嘻
  ok,睡觉了

使用特权

评论回复
8
jiebin689| | 2012-1-19 11:47 | 只看该作者
本帖最后由 jiebin689 于 2012-1-19 11:49 编辑

楼上的,看下。

调度类型:
长期调度 决定是否产生新的进程
中期调度 决定是否将进程调入内存
短期调度 决定处理器该执行哪个进程
I/O 调度 决定一个I/O 空闲设备该处理哪个进程的I/O 请求

下面我们来着重看看短期调度及其评价标准:
通常是当某个事件的发生导致需要挂起某个进程或者需要某个进程以抢占式方式替换
另外一个正在运行中的进程以取得处理器控制权的时候,短期调度就被激活。这样的事件
可以是时钟中断、I/O 中断、操作系统调用或者信号等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

254

帖子

2

粉丝