先响应中断还是先响应堆栈调用

[复制链接]
3510|17
 楼主| entepino 发表于 2011-11-28 18:26 | 显示全部楼层 |阅读模式
在中断中调用E2PROM写函数,在进入E2PROM写函数后,首先关闭中断,处理完写函数,跳出写函数前,然后打开中断,这时候会先响应堆栈,还是先响应中断?响应中断也即重新进入中断,从中断开始处重新执行咧
NE5532 发表于 2011-11-28 19:21 | 显示全部楼层
以7年的工作经验都没看懂楼主“响应堆栈”这四个字。
流行音乐 发表于 2011-11-28 19:31 | 显示全部楼层
估计楼主头脑中的单片机是另外一番景象,不是我们这个世界的单片机。
linty8433 发表于 2011-11-28 20:17 | 显示全部楼层
不懂不懂
highgear 发表于 2011-11-28 21:45 | 显示全部楼层
楼主的意思是不是,开中断后,cpu 先pop,reti, 还是先再次进入本中断?

对于51来说,没有 reti,就不会再次响应同级中断。所以,如果51的中断程序没有修改优先级,那么是先"响应堆栈"(楼主创造了一个新词),后响应中断。对于其他的 cpu, 则要看cpu是否允许响应同级中断.
DownCloud 发表于 2011-11-29 00:05 | 显示全部楼层
确实表达的很不清晰啊。
ayb_ice 发表于 2011-11-29 08:01 | 显示全部楼层
开中断有堆栈没有必然联系,这都哪跟那啊.
"响应堆栈"这个词太有杀伤力了
caner_hn 发表于 2011-11-29 08:31 | 显示全部楼层
在中断中写EEPROM本人认为本就不妥。
像这种速度比较慢的操作应该尽量放到主循环中去。中断程序应该尽可能短小,应该尽快退出。
你可以在中断程序中设置一个“需要写EEPROM的标志位”,然后在主循环中查询该标志位。
 楼主| entepino 发表于 2011-11-29 08:38 | 显示全部楼层
sorry,昨天写的有点着急,重新写一些。

#pragma interrupt ReceiveMessage()  

ReceiveMessage
()


{


coder1


WriiteEEPROM()


coder2


ClearINTFlag;



}

  
WriiteEEPROM()
{

DisableAllInt;


coder3;


EnableAllInt


}


发现执行完函数WriiteEEPROM(),由于没有清中断标志位INTFlag,程序又跳到coder1处执行,而不是去执行coder2,为何?
ayb_ice 发表于 2011-11-29 08:54 | 显示全部楼层
步进看不就知道了
yewuyi 发表于 2011-11-29 09:02 | 显示全部楼层
写EEPROM的数据操作可以在中断程序中完成,如果能确定在当前中断中不可能再有其它中断程序形成中断嵌套,则可以不执行"DisableAllInt;"和"EnableAllInt;",否则需要暂时关闭全局中断容许位确保在执行coder3;过程中不被其它中断打断,执行完coder3;是否开启全局中断容许位需要看芯片和实际项目需要,写EEPROM的延时时间应该在中断中退出,不能形成堵塞,这都是一个完全可控的状态,如果你掌握汇编级的程序编程思想,这些都根本不是问题。
yewuyi 发表于 2011-11-29 09:02 | 显示全部楼层
另:不要生造名词。
zhaodaoyin1 发表于 2011-11-29 10:46 | 显示全部楼层
1# entepino
zhaodaoyin1 发表于 2011-11-29 10:47 | 显示全部楼层
还是应该先把堆栈处理完后再出来比较好。
sysdriver 发表于 2011-11-29 12:25 | 显示全部楼层
LZ先把你的IC型号亮出来,垃圾IC看得多了。特别是仿真时。。。
NE5532 发表于 2011-11-29 12:28 | 显示全部楼层
又是一个被仿真毒害的青年,你实际跑下行不?
hm4243343 发表于 2011-11-29 16:12 | 显示全部楼层
:lol。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

653

帖子

2

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