打印
[技术问答]

单片机C程序的中断函数调用子程序冲突问题

[复制链接]
1022|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DreamofOven|  楼主 | 2015-11-13 22:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机或者ARM的使用过程中,必会遇到使用片上中断资源的时候,中断单片机的灵魂和精髓所在,像定时/计数器一样有很重要的作用。设置中断的作用是能及时响应重要的程序响应,以提高MCU和MPU的对重要资源的响应速度。在响应中断的过程中,系统会自动保存断点(C语言编程中),等到中断响应结束之后,程序会再次回到断点处继续执行main函数。这就出现了问题:有可能在中断函数中调用的子函数和main函数中调用的子函数重复,比如,在main函数执行到display()显示函数的时候,发生了ESUART中断,这是程序需要保存现场和断点,将现在的main正在执行的一些资源压入堆栈。如果在interrupt()函数中也调用display()函数的话,会导致中断中的函数执行不正常,即显示乱码或者不显示,在返回main函数时,也有可能导致之前压入堆栈的资源发生改变,导致main()显示异常,发生不可预料的结果。但是若main函数中没有执行display函数时发生中断,则中断函数中的display函数则能正常显示。    解决这一问题的一个办法是复制一套需要调用的子函数,给这些子函数重新命名,包括子函数中调用的子函数。这样,主函数和中断函数调用的子函数就不会发生冲突,两边都可正常执行。

void display(void)//供main函数调用
       {
            write_com(0x01);
            ……
            ……;
       }
      void display_interrupt(void)//供interrupt函数调用
      {
          write_com_interrupt(0x01);//所有被调用的子函数都应备份
          ……;
          ……;
       }


沙发
quray1985| | 2015-11-15 20:30 | 只看该作者
调用中断的时候必须要先关中断吗

使用特权

评论回复
板凳
zhuotuzi| | 2015-11-16 20:01 | 只看该作者

调用中断的时候必须要先关中断,这样防止工作的时候被其他中断打断。另外要设计的程序是可以快速实现的,最好不要出现永不退出的情况

使用特权

评论回复
地板
huangcunxiake| | 2015-11-16 20:19 | 只看该作者
解决这一问题的一个办法是复制一套需要调用的子函数,给这些子函数重新命名,包括子函数中调用的子函数。这样,主函数和中断函数调用的子函数就不会发生冲突,两边都可正常执行

使用特权

评论回复
5
mintspring| | 2015-11-16 20:47 | 只看该作者
可能在中断函数中调用的子函数和main函数中调用的子函数重复,比如,在main函数执行到display()显示函数的时候,发生了ESUART中断,这是程序需要保存现场和断点,将现在的main正在执行的一些资源压入堆栈

使用特权

评论回复
6
_寒寒_| | 2015-11-17 14:56 | 只看该作者
中断的时候,向负责显示的模块发送一个事件,退出后再去执行显示。

使用特权

评论回复
7
643757107| | 2015-11-17 20:43 | 只看该作者
在中断函数中调用的子函数和main函数中调用的子函数重复,比如,在main函数执行到display()显示函数的时候还是很少见的。

使用特权

评论回复
8
Mancherstun| | 2015-11-19 21:40 | 只看该作者
若main函数中没有执行display函数时发生中断,则中断函数中的display函数则能正常显示。  

使用特权

评论回复
9
天灵灵地灵灵| | 2015-11-19 22:55 | 只看该作者
如果在interrupt()函数中也调用display()函数的话,会导致中断中的函数执行不正常,即显示乱码或者不显示

使用特权

评论回复
10
gejigeji521| | 2015-11-20 22:30 | 只看该作者
若main函数中没有执行display函数时发生中断,则中断函数中的display函数则能正常显示。   我觉得偶发性的程序段最好用中断调用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

178

帖子

0

粉丝