×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-06 发布时间:
|
    在单片机或者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);//所有被调用的子函数都应备份
          ……;
          ……;
       }

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?