[技术问答] 单片机C程序的中断函数调用子程序冲突问题

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

  1. void display(void)//供main函数调用
  2.        {
  3.             write_com(0x01);
  4.             ……
  5.             ……;
  6.        }
  7.       void display_interrupt(void)//供interrupt函数调用
  8.       {
  9.           write_com_interrupt(0x01);//所有被调用的子函数都应备份
  10.           ……;
  11.           ……;
  12.        }


quray1985 发表于 2015-11-15 20:30 | 显示全部楼层
调用中断的时候必须要先关中断吗
zhuotuzi 发表于 2015-11-16 20:01 | 显示全部楼层

调用中断的时候必须要先关中断,这样防止工作的时候被其他中断打断。另外要设计的程序是可以快速实现的,最好不要出现永不退出的情况
huangcunxiake 发表于 2015-11-16 20:19 | 显示全部楼层
解决这一问题的一个办法是复制一套需要调用的子函数,给这些子函数重新命名,包括子函数中调用的子函数。这样,主函数和中断函数调用的子函数就不会发生冲突,两边都可正常执行
mintspring 发表于 2015-11-16 20:47 | 显示全部楼层
可能在中断函数中调用的子函数和main函数中调用的子函数重复,比如,在main函数执行到display()显示函数的时候,发生了ESUART中断,这是程序需要保存现场和断点,将现在的main正在执行的一些资源压入堆栈
_寒寒_ 发表于 2015-11-17 14:56 | 显示全部楼层
中断的时候,向负责显示的模块发送一个事件,退出后再去执行显示。
643757107 发表于 2015-11-17 20:43 | 显示全部楼层
在中断函数中调用的子函数和main函数中调用的子函数重复,比如,在main函数执行到display()显示函数的时候还是很少见的。
Mancherstun 发表于 2015-11-19 21:40 | 显示全部楼层
若main函数中没有执行display函数时发生中断,则中断函数中的display函数则能正常显示。  
天灵灵地灵灵 发表于 2015-11-19 22:55 | 显示全部楼层
如果在interrupt()函数中也调用display()函数的话,会导致中断中的函数执行不正常,即显示乱码或者不显示
gejigeji521 发表于 2015-11-20 22:30 | 显示全部楼层
若main函数中没有执行display函数时发生中断,则中断函数中的display函数则能正常显示。   我觉得偶发性的程序段最好用中断调用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

178

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部