ucos移植里的中断调度问题
void OSIntExit (void) <br />{ <br /> OS_ENTER_CRITICAL(); <br /> if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */ <br /> OSIntExitY = OSUnMapTbl; <br /> OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl]); <br /> if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */ <br /> OSTCBHighRdy = OSTCBPrioTbl; <br /> OSCtxSwCtr++; /* Keep track of the number of context switches */ <br /> OSIntCtxSw(); /* Perform interrupt level context switch */ <br /> } <br /> } <br /> OS_EXIT_CRITICAL(); <br />} <br />在上述程序里假如 OSIntCtxSw();里进行了任务调度那么<br /> OS_EXIT_CRITICAL(); 这个函数什么时候执行 <br />该中断应该怎么退出?<br />那位大侠指导、指导。<br /> 中断任务切换,也要等中断函数执行完。
2
你在公司上班,正在整理资料(任务1)。<br />突然想WC(中断),<br />在坑上,接到老总电话,叫你去办公室(任务2)(你不可能先整理完资料再去,因为他是老总)。<br />但是你总得上完WC,然后直接去他办公室,而不是先拿起资料看一眼,再去办公室。<br />但是PP总得要擦吧。不管是国家主席叫你,还是谁叫你,最后一步少不了。中断任务切换,只是告诉你,从WC出来,直接去切换后的目标(办公室),而且不是去原来的目标望望,再转目标。<br />中断级任务切换,省去了,你去自己的办公室,再转去老总办公室的麻烦。但是PP总得要擦的。是不是这样的
是不是这样的:<br />执行OSIntCtxSw()后,只是改变了堆栈等信息,并不是直接进行了任务切换,OSIntCtxSw()巧妙地把中断返回地址设置成了将要执行的最高优先级的就绪任务是
就是免去了,切换回原来任务,再重新切换到高级任务,免去一次切换。sufeng983的wc比喻有意思
<br /> wc比喻比较有意思的,实际上ucos-ii调度本质就是任何时候让高优先级的任务运行,当然是最快的切换方式,所以说免去了切换原来任务的时间。这个比喻有点意思
你在公司上班,正在整理资料(任务1)。突然想WC(中断),在坑上,接到老总电话,叫你去办公室(任务2)(你不可能先整理完资料再去,因为他是老总)。但是你总得上完WC,然后直接去他办公室,而不是先拿起资料看一 ...sufeng983 发表于 2009-7-23 16:03 https://bbs.21ic.com/images/common/back.gif
mark 1# kedayyc
前面的说法都是针对线程的切换来说,这里说说LZ说的问题,因为切换线程里的压入的PSW里面会有进入中断的时候的中断的状态。
所以在弹出的时候会自动恢复中断的标志,不需要再返回 OS_EXIT_CRITICAL()去保证开中断或者还原。所以不用担心。
页:
[1]