本帖最后由 杨为民 于 2023-8-2 01:04 编辑
本帖子前面提到的关于瑕疵问题: 其中的“重要瑕疵,如果当前有任务调度,会导致随后任务级OSCtxSw 任务切换函数执行”不存在。并且按照用户程序设计的次序,从时间次序上P23脉冲发生在P21脉冲前面。
(1)通过孤立疗法,将3个任务依次注释掉,可以看到这个现象出现在“任务C”中。因此将程序进一步修改为研究程序,只运行任务C: 其中将任务C的第74行注释掉,使该任务无限循环执行。然后用P25夹住“uCx51_Task_SleepMS”休眠函数。这样从时间次序上为:P25=0-->休眠-->睡醒-->P25=1。
这样我们就可以看到该现象被“孤立”出来,唯一而重复第发生了,这样就便于我们研究查找问题了: (2)将单次的事件放大: 1)图中可以看到当程序执行到第70行的T1时刻,P25=0,然后开始执行第71行程序,访问休眠函数。 2)在休眠函数中,经过14.875微秒,程序设置好延时计数,挂起本任务后,T2时刻开始进行非中断的任务切换,将任务切换给空闲任务,图中呈现出P23的正脉冲。 3)经过100毫秒的休眠后,由RTOS的“_?OSTimeTick” 系统节拍处理程序唤醒任务C,由“_?uCx51_IntSched”中断任务切换函数将任务执行权切换给任务C。但是按照时间顺序这个切换过程的P21通道正脉冲位于图的右面,在本图中是看不到的。本图上显示的P21通道正脉冲是上一个程序循环的。 4)当任务C被唤醒后,程序从第72行P25=1开始执行,继续从第68行执行到第70行,实现下一个循环。图中P25的正脉冲代表了执行这一段用户程序的过程。 (3)结论。对于任何一个RTOS的休眠函数,都将产生两次关联的任务切换,第一次是将本任务挂起,进入休眠状态,由非中断任务切换函数将任务控制权切换给其他任务,第2次是休眠时间到后,有中断任务切换函数将任务控制权切换回本函数,从休眠函数的下一行程序开始执行。 两者从时间上非中断切换在线,中断切换在后,但不是因果关系。休眠函数是因,两者皆是果。 (4)任务切换函数是uC/OS-II原有的,本移植并未改变,因此uC/OS-II的任务切换函数没有错误。在这里仍然要谢谢熊仔坛友的这次的抛砖引玉,经这一轮的讨论使得我们大家加深了对RTOS的认识。
|