kedayyc 发表于 2009-7-19 15:22

ucos移植里的中断调度问题

void&nbsp;OSIntExit&nbsp;(void)&nbsp;&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((--OSIntNesting&nbsp;|&nbsp;OSLockNesting)&nbsp;==&nbsp;0)&nbsp;{&nbsp;/*&nbsp;Reschedule&nbsp;only&nbsp;if&nbsp;all&nbsp;ISRs&nbsp;completed&nbsp;&&nbsp;not&nbsp;locked&nbsp;*/&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSIntExitY&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;OSUnMapTbl;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSPrioHighRdy&nbsp;=&nbsp;(INT8U)((OSIntExitY&nbsp;&lt&lt&nbsp;3)&nbsp;+&nbsp;OSUnMapTbl]);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(OSPrioHighRdy&nbsp;!=&nbsp;OSPrioCur)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;No&nbsp;context&nbsp;switch&nbsp;if&nbsp;current&nbsp;task&nbsp;is&nbsp;highest&nbsp;ready&nbsp;*/&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTCBHighRdy&nbsp;&nbsp;=&nbsp;OSTCBPrioTbl;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSCtxSwCtr++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Keep&nbsp;track&nbsp;of&nbsp;the&nbsp;number&nbsp;of&nbsp;context&nbsp;switches&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSIntCtxSw();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Perform&nbsp;interrupt&nbsp;level&nbsp;context&nbsp;switch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;<br />在上述程序里假如&nbsp;OSIntCtxSw();里进行了任务调度那么<br />&nbsp;OS_EXIT_CRITICAL();&nbsp;&nbsp;&nbsp;这个函数什么时候执行&nbsp;<br />该中断应该怎么退出?<br />那位大侠指导、指导。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

sufeng983 发表于 2009-7-23 15:54

中断任务切换,也要等中断函数执行完。

sufeng983 发表于 2009-7-23 16:03

2

你在公司上班,正在整理资料(任务1)。<br />突然想WC(中断),<br />在坑上,接到老总电话,叫你去办公室(任务2)(你不可能先整理完资料再去,因为他是老总)。<br />但是你总得上完WC,然后直接去他办公室,而不是先拿起资料看一眼,再去办公室。<br />但是PP总得要擦吧。不管是国家主席叫你,还是谁叫你,最后一步少不了。中断任务切换,只是告诉你,从WC出来,直接去切换后的目标(办公室),而且不是去原来的目标望望,再转目标。<br />中断级任务切换,省去了,你去自己的办公室,再转去老总办公室的麻烦。但是PP总得要擦的。

zchong 发表于 2009-7-23 16:51

是不是这样的

是不是这样的:<br />执行OSIntCtxSw()后,只是改变了堆栈等信息,并不是直接进行了任务切换,OSIntCtxSw()巧妙地把中断返回地址设置成了将要执行的最高优先级的就绪任务

sufeng983 发表于 2009-7-23 17:22

就是免去了,切换回原来任务,再重新切换到高级任务,免去一次切换。

nenozyp 发表于 2009-7-24 13:10

sufeng983的wc比喻有意思

&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;wc比喻比较有意思的,实际上ucos-ii调度本质就是任何时候让高优先级的任务运行,当然是最快的切换方式,所以说免去了切换原来任务的时间。

fe_arm 发表于 2009-7-26 12:52

这个比喻有点意思

qiyinxian 发表于 2012-7-20 15:44

你在公司上班,正在整理资料(任务1)。突然想WC(中断),在坑上,接到老总电话,叫你去办公室(任务2)(你不可能先整理完资料再去,因为他是老总)。但是你总得上完WC,然后直接去他办公室,而不是先拿起资料看一 ...
sufeng983 发表于 2009-7-23 16:03 https://bbs.21ic.com/images/common/back.gif



mark

yifeng1118 发表于 2012-7-28 15:19

1# kedayyc
前面的说法都是针对线程的切换来说,这里说说LZ说的问题,因为切换线程里的压入的PSW里面会有进入中断的时候的中断的状态。
所以在弹出的时候会自动恢复中断的标志,不需要再返回 OS_EXIT_CRITICAL()去保证开中断或者还原。所以不用担心。
页: [1]
查看完整版本: ucos移植里的中断调度问题