|
楼主 |
发表于 2023-10-20 11:46:33
|
显示全部楼层
本帖最后由 tzz1983 于 2023-10-28 08:36 编辑
RETI "特殊指令"引起BUG的描述:
"特殊指令"的概念参考STC32G用户手册
在UCOS应用中, 调用OSTimeDly() 或 OSSemPend() 等其它等待事件类应用时, 会调用OS_Sched()来切换任务,如下图:
在临界区内,除 OS_TASK_SW();外可能还会发生其它的中断请求。
退出临界区后,会优先响应除PendSv外的其它中断, 这些中断使用RETI返回时, 会强迫代码继续往下执行一条指令。多个中断并发则可能继续执行多条指令,然后再切换任务。
被多执行的这些代码,本来是要等到时间到或者事件到才能够执行的。现在提前执行,所以据此做出的相关动作违背了等待的意愿,从而产生错误
解决这个BUG的方法是在退出临界区后, 等待任务切换,如下代码
#define PendSv_flag() T4IF //返回软中断标志的表达式或函数
while(PendSv_flag()); //等待任务切换,此处是唯一改原代码的地方,2023/10/19
中断里的OSIntExit() 不会发生这种BUG, 原因是 中断本来就是随机发生的, 能被中断打断的代码, 可以被打断, 也可以继续执行, 所以多往后执行几条指令没有关系, 不必处理.
|
|