问题描述:
在中断服务函数中,写了关闭和打开全局中断的命令,有可能会导致中断函数重入的问题,而不断在中断函数中重复进入,导致不断入栈,最终栈溢出。
具体原因:
STM8中关闭和打开全局中断的函数为sim()和rim()。这两个函数实际上是修改了当前运行的中断优先级。
当调用sim(),即关闭全局中断,实际上是将中断优先级提高到L3,即最高级别,此时不可被中断打断(特殊中断除外,比如RESET等—)。从而间接实现屏蔽中断的功能。
当调用rim(),即打开全局中断,实际上是将中断优先级降低到L0,即最低级别,此时任何中断都可以打断。从而间接实现了关闭屏蔽的功能。如果此时存在中断标志,就会立刻触发中断。
如果在中断函数中调用rim()时,且当前中断函数的标志未清除,或发生了新的标志。会导致当前中断函数的重入,而重入后很可能仍然没有清除标志,并且仍然调用rim(),然后继续导致重入。最终会不停触发中断,不停入栈,最终导致栈溢出。
结论:
仅在用户进程中使用sim()和rim(),因为用户程序本身的中断优先级就是L0,调用sim()和rim()不会有影响。
STM8中断重入与栈溢出解析

被折叠的 条评论
为什么被折叠?



