分享PIC中断内调用函数问题

2020-02-08 09:07发布

PICC中主程序和中断调用同一个子程序的问题
在汇编中,中断和主程序是可以调用同一个子程序的,
在PICC中如果要在中断和主程序中调用同一个子程序:
#pragma interrupt_level 1
void function (void)
{
}
然后在中断函数那写句
#pragma interrupt_level 1
void interrupt(void)
{
   function();
}
void main (void)
{
  function();
}
程序中出现重入现象是错误的。PICC具有的重入保护可以防止这种现象的出现。
换言之,在PIC架构的单片机中,楼主的做法是错误的。主程序和中断程序是不允许调用同一子程序的。
比如子程序A,在主程序中被调用,这时发生中断,该子程序又在中断程序中被调用,这时就发生程序重入。在别的构造的单片机中,如果堆栈可以扩展,则重入问题可以解决,但PIC的堆栈的层数固定,重入会引起地址返回出错,也就是程序出错。
如果在主程序调用子程序A之前先把中断屏蔽了,等执行完了之后再恢复。
这样就不会发生重入的错误吧。。这样可否在主程序和中断中调用同一个子程序?
主程序调用的A程序中,用到的临时变量,跟主程序中的临时变量可以覆盖;而中断程序调用A程序时出现的临时变量,也会产生重入冲突。
本来事情可以很简单的,比如要执行A程序,在主程序中可以调用,而在中断程序中可以设一个标志位,出中断后,在合适的时机,主程序检测到标志位的变化,也可以完成A程序的执行。
---------------

今天关注了这个问题,老板说我如果这样做会死得很惨.
宁愿在中断上加上标志位,主函数再处理
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Gloome
1楼-- · 2020-02-08 09:56
 精彩回答 2  元偷偷看……
millwood0
2楼-- · 2020-02-08 11:43
今天关注了这个问题,老板说我如果这样做会死得很惨.
宁愿在中断上加上标志位,主函数再处理


listen to your boss, because he is right.

thank your boss, because he is kind too: any embedded programmer doing what you were trying to do has no business writing embedded code and should have been fired.
saisam
3楼-- · 2020-02-08 11:53
我没有记错的话,PIC不能有递归!
chengzepeng
4楼-- · 2020-02-08 13:16
本帖最后由 chengzepeng 于 2012-7-29 23:56 编辑

假设你的主函数正在调用子函数,接着一个中断后又调用子函数,
这不就冲突了吗?
还有PICC的中断函数不是这样写的吧?
  1. void interrupt INT() // INT是函数名
  2. {

  3. }
复制代码

一周热门 更多>