本帖最后由 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看下.
|