中断打断导致IO操作异常的问题分析

【场景】

在非中断代码中有IO相关操作,在中断代码中也有相关的IO操作(即便不是同一个IO)。且两个IO配置高低电平均在同一个地址寄存器下。

【现象】

中断中的IO操作,偶尔会出现退出中断就无效的情况,抓波形仅仅抓到一个脉冲。

【分析】

由于常用的方式为异或或者与非的操作,来修改寄存器中某位bit的值,这样在汇编的角度而言,本质上主要是三个流程:

  1. 读取外设寄存器的值
  2. 修改该参数(用的通用寄存器)
  3. 将修改后的值写入的外设寄存器
    如果中断发生在1-3步骤中间,那么会导致中断中修改了IO寄存器无效。
    因为从中断退出之后,执行第3步骤之前,即将写入外设寄存器的值,还是基于进入中断前的IO状态来写入的,因此会导致中断中对IO的操作无效。(中断进入之前会保存通用寄存器的值)

【解决方案】

  • 有位域操作的芯片
    类似stm32的芯片,芯片实现的时候就考虑到了这种情况,也即使用位域操作的方式。
  • 没有位域操作的芯片,想到如下三种解决方法
    1. 在(非中断)执行IO相关操作,先将对应的中断关闭。执行完成之后再打开。
    2. 将IO操作放在线程中执行,中断中建立相关的变量标志。
    3. 若外设寄存器可以使用8bit访问,则可以考虑将IO放在不通的字节中,然后独立访问。(这种方式比较独特,需要考虑的情况较多,一般常用上述两种方式。)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值