1、答:
UCOSII的中断服务程序中有必不可少的4个部分:
OSIntEnter(); //(1) 进入中断,OSIntNesting加1,OSIntNesting>0时任务调度被关闭
OSSemPost(Sem); //(2) 发送信号量,使其他任务进入就绪态
清除中断的响应标志 //(3) 清除中断响应标志
OSIntExit(); //(4) 退出中断,OSIntNesting减1,OSIntNesting==0时任务调度才被打开
按照楼主所说,“发现更高优先级任务”的程序应该是在(2)部分,而此时任务调度是关闭的,要想进行 任务切换,至少得等到这个中断结束(至于任务切不切换,怎么切换,看一下OSIntEnter()和OSIntExit() 的相关内容就明白了)。所以在中断中高优先级的任务是不会被执行的。
2、答:
任务要想切换就必须执行一个任务调度函数OS_Sched()(中断另当别论),最典型的就是OSTimeDly()函数里调用了OS_Sched(),所以低优先级任务被高优先级任务剥夺CPU控制权,要等到低优先级任务执行任务调度函数OS_Sched()之后。如果你的程序从头到尾都没调用OS_Sched(),它永远也不会进行任务切换。至于任务怎么切换看看OS_Sched()相关内容就明白了。总之任务切换时,CPU控制权总是被就绪态的任务优先级最高的任务获得。
[ 本帖最后由 SuperStar515 于 2011-7-21 10:19 编辑 ]