求教:uCOS操作系统的OS_Sched函数的问题
有谁帮忙解答一下OS_Sched函数的问题:我的问题是:执了OS_TASK_SW();函数之后,它会不会返回调用点,接着调用OS_EXIT_CRITICAL();开中断?我试着在OS_TASK_SW();函数后加调试信息发现它没有执行调试信息,这样子的话,由于前面已经调用了关中断函数OS_ENTER_CRITICAL();,如果OS_TASK_SW();没有返回,又是谁再开中断?
望高手指点,谢谢。
voidOS_Sched (void) CPL_RET
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SRcpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting == 0) { /* Schedule only if all ISRs done and ... */
if (OSLockNesting == 0) { /* ... scheduler is not locked */
OS_SchedNew();
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
OSTCBHighRdy = OSTCBPrioTbl;
#if OS_TASK_PROFILE_EN > 0
OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
#endif
OSCtxSwCtr++; /* Increment context switch counter */
OS_TASK_SW(); /* Perform a context switch */
}
}
}
OS_EXIT_CRITICAL();
}
OS_EXIT_CRITICAL();这个函数以后才会执行PendSV中断, Eric2013 发表于 2013-6-26 11:29 static/image/common/back.gif
OS_EXIT_CRITICAL();这个函数以后才会执行PendSV中断,
刚才做了一个实验,好像是你说的这样子的,多谢啊。那如果是在中断中调用OSIntExit呢?中断函数是怎么返回的? 也无风雨赵 发表于 2013-6-26 12:53 static/image/common/back.gif
刚才做了一个实验,好像是你说的这样子的,多谢啊。那如果是在中断中调用OSIntExit呢?中断函数是怎么返 ...
一样的,不过要考虑中断优先级抢占的问题。比如这个中断是USART。
(1)PendSV抢占了USART
OS_EXIT_CRITICAL(); 后就执行PendSV,然后退回到USART,然后退出USART,执行相应任务
(2)PendSV不能抢占USART
退出USART中断以后,执行PendSV Eric2013 发表于 2013-6-26 13:12 static/image/common/back.gif
一样的,不过要考虑中断优先级抢占的问题。比如这个中断是USART。
(1)PendSV抢占了USART
OS_EXI ...
嗯,是的,谢谢啦,应该是这样的!! Eric2013 发表于 2013-6-26 13:12 static/image/common/back.gif
一样的,不过要考虑中断优先级抢占的问题。比如这个中断是USART。
(1)PendSV抢占了USART
OS_EXI ...
恩,查了一下PendSV的优先级必须设置为最低,也就是退出中断服务程序后才会响应PendSV,进而进行任务切换!
页:
[1]