STM8中断重入问题

STM8中断重入与栈溢出解析

问题描述:

        在中断服务函数中,写了关闭和打开全局中断的命令,有可能会导致中断函数重入的问题,而不断在中断函数中重复进入,导致不断入栈,最终栈溢出。

具体原因:

        STM8中关闭和打开全局中断的函数为sim()和rim()。这两个函数实际上是修改了当前运行的中断优先级。

        当调用sim(),即关闭全局中断,实际上是将中断优先级提高到L3,即最高级别,此时不可被中断打断(特殊中断除外,比如RESET等—)。从而间接实现屏蔽中断的功能。

        当调用rim(),即打开全局中断,实际上是将中断优先级降低到L0,即最低级别,此时任何中断都可以打断。从而间接实现了关闭屏蔽的功能。如果此时存在中断标志,就会立刻触发中断。

        如果在中断函数中调用rim()时,且当前中断函数的标志未清除,或发生了新的标志。会导致当前中断函数的重入,而重入后很可能仍然没有清除标志,并且仍然调用rim(),然后继续导致重入。最终会不停触发中断,不停入栈,最终导致栈溢出。

结论:

        仅在用户进程中使用sim()和rim(),因为用户程序本身的中断优先级就是L0,调用sim()和rim()不会有影响。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值