|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-5-14 12:33:32
|
显示全部楼层
deny 发表于 2012-5-14 11:49 ![](static/image/common/back.gif)
执行OSSched()时并不会立刻压栈吧,要执行到最后的OS_EXIT_CRITICAL()开中断以后才开始压栈吧,那回到王 ...
void OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3 //中断函数被设定为模式3
OS_CPU_SR cpu_sr;
#endif
INT8U y; //定义一个8位整数y
OS_ENTER_CRITICAL(); //关闭中断
if ((OSIntNesting == 0) && (OSLockNesting == 0)) {
y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++; //统计计数器OSCtxSwCtr加1,以跟踪任务切换次数
OS_TASK_SW(); //最后宏调用OS_TASK_SW()来完成实际上的任务切换
}
}
OS_EXIT_CRITICAL(); //打开中断
}
如源码,你的意思是,在OS_TASK_SW();执行后并没有压栈操作?是在OS_EXIT_CRITICAL()之后?
是不是OS_TASK_SW()只是软中断置位,当OS_EXIT_CRITICAL()之后才去响应中断然后保护断点的吗? |
|