中断处理程序注意事项

[复制链接]
6583|15
 楼主| tianli1980 发表于 2012-4-13 16:38 | 显示全部楼层 |阅读模式
1,尽量不要在ISR内使用全局变量,如果一定要使用的话要做好保护,我们称这种应该受保护的区段为critical section.(方法很多,最简单的是在进入critical section之前,先禁止中断的产生,所以在critical section中全局变量不会被ISR破坏,从而达到保护的效果。
2,ISR的第一个动作一定是将所有的CPU内部缓存器存储起来,一般都是存在stack memory内,而ISR的最后一个动作就是返回所有缓存器的值。
3,调用外部函数时要确认其是否“可重进入”,如果一定要在ISR内调用非常reentry的函数,则一般程序在使用同一个模块的函数时,一定要加以保护。
4,ISR的程序或执行时间尽量不要太长。
5,IST尽量不要牵涉到复杂的算法,它的任务只是负责弄清楚发生了什么硬件送给上层的程序,交由系统或应用程序决定要如何处理这个硬件事件。
jayy 发表于 2012-4-13 18:38 | 显示全部楼层
过来了解下
jayy 发表于 2012-4-13 18:39 | 显示全部楼层
谢谢楼主分享
xiaoxi053 发表于 2012-4-13 18:52 | 显示全部楼层
这个要好好看看
xiaoxi053 发表于 2012-4-13 18:53 | 显示全部楼层
都是些细节的概念
liwsx 发表于 2012-4-13 21:37 | 显示全部楼层
过来学习一下
长长见识
拿起书本 发表于 2012-4-13 21:44 | 显示全部楼层
挺好的经验小技巧,驱动程序开发有两个地方和一般程序比较不一样的地方,一个是中断处理程序ISR,另一个是测试手法。
jxmzzr 发表于 2012-4-13 22:43 | 显示全部楼层
驱动程序开发的门槛还是比较高的。
学习了。谢谢楼主
nongfuxu 发表于 2012-4-14 04:51 | 显示全部楼层
尽量不要在ISR内使用全局变量

LZ能否说点具体情况?
xlsbz 发表于 2012-4-14 08:08 | 显示全部楼层
1  8bit机在全局单字节时候,中断用到 不用保护。全局U16 U32得保护。
2 32位机则全局U16 U32不用保护
保护方法可以禁用中断  也可以比较两值是否相同

中断调用自己写的函数 那么这个函数就仅在中断用。水平不够的话 不要自己写重入

自己的一点理解
meihongpu 发表于 2012-4-14 08:12 | 显示全部楼层
感觉说得还不够到位
chenbb8 发表于 2012-4-14 10:29 | 显示全部楼层
volatile型的全局变量A,在主循环中被多次使用到,而A的值会被ISR修改,那么在主循环的时候可能会导致出错,而使用保护的话那就会导致长时间中断得不到相应,因此在主循环的某个位置将A赋值给B,然后再使用B来参与任务就OK了
nongfuxu 发表于 2012-4-14 13:28 | 显示全部楼层
学习讨论: 询问LS,那是否需要在ISR中设置变量A被改动的标志?:)
vivilzb1985 发表于 2012-4-15 23:10 | 显示全部楼层
每次只是用,没系统的去想过的啊,温习一下的
sqcumt123 发表于 2012-4-17 16:47 | 显示全部楼层
若是改写系统中断,尽量保存系统中断的原地址;
如果是自定义中断,需要注意是否允许多重中断,即能否被另一个中断(包括同一个中断号的相同中断)打断,若不希望被打断,应当在中断处理程序开始时关闭中断允许位IF(用CLI指令),并且在程序结束时开启中断位(用STI指令)。
另外,中断处理程序本身也是一个过程,也有可能出错,所以尽量不要在中断处理程序中产生错误,以免程序不可控。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

482

主题

2214

帖子

11

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