打印

中断处理程序都有哪些注意事项

[复制链接]
1895|41
手机看帖
扫描二维码
随时随地手机跟帖
沙发
jiaxw| | 2018-12-4 18:34 | 只看该作者
尽量不要在ISR内使用全局变量

使用特权

评论回复
板凳
spark周| | 2018-12-4 18:37 | 只看该作者
如果一定要使用的话要做好保护,我们称这种应该受保护的区段为critical section

使用特权

评论回复
地板
spark周| | 2018-12-4 18:41 | 只看该作者
方法很多,最简单的是在进入critical section之前,先禁止中断的产生,所以在critical section中全局变量不会被ISR破坏,从而达到保护的效果。

使用特权

评论回复
5
zhanghqi| | 2018-12-4 18:44 | 只看该作者
ISR的第一个动作一定是将所有的CPU内部缓存器存储起来,一般都是存在stack memory内,而ISR的最后一个动作就是返回所有缓存器的值。

使用特权

评论回复
6
zhaoxqi| | 2018-12-4 18:49 | 只看该作者
调用外部函数时要确认其是否“可重进入”,如果一定要在ISR内调用非常reentry的函数,则一般程序在使用同一个模块的函数时,一定要加以保护。

使用特权

评论回复
7
午夜粪车| | 2018-12-4 18:52 | 只看该作者
ISR的程序或执行时间尽量不要太长。

使用特权

评论回复
8
午夜粪车| | 2018-12-4 18:57 | 只看该作者
IST尽量不要牵涉到复杂的算法,它的任务只是负责弄清楚发生了什么硬件送给上层的程序,交由系统或应用程序决定要如何处理这个硬件事件。

使用特权

评论回复
9
jiajs| | 2018-12-4 19:01 | 只看该作者

1  8bit机在全局单字节时候,中断用到 不用保护。全局U16 U32得保护。
2 32位机则全局U16 U32不用保护
保护方法可以禁用中断  也可以比较两值是否相同

使用特权

评论回复
10
jiajs| | 2018-12-4 19:05 | 只看该作者
中断调用自己写的函数 那么这个函数就仅在中断用。水平不够的话 不要自己写重入

自己的一点理解

使用特权

评论回复
11
zhanghqi| | 2018-12-4 19:10 | 只看该作者
volatile型的全局变量A,在主循环中被多次使用到,而A的值会被ISR修改,那么在主循环的时候可能会导致出错,而使用保护的话那就会导致长时间中断得不到相应,因此在主循环的某个位置将A赋值给B,然后再使用B来参与任务就OK了

使用特权

评论回复
12
jiaxw| | 2018-12-4 19:13 | 只看该作者
学习讨论: 询问LS,那是否需要在ISR中设置变量A被改动的标志?

使用特权

评论回复
13
spark周| | 2018-12-4 19:18 | 只看该作者
若是改写系统中断,尽量保存系统中断的原地址;
如果是自定义中断,需要注意是否允许多重中断,即能否被另一个中断(包括同一个中断号的相同中断)打断,若不希望被打断,应当在中断处理程序开始时关闭中断允许位IF(用CLI指令),并且在程序结束时开启中断位(用STI指令)。

使用特权

评论回复
14
spark周| | 2018-12-4 19:21 | 只看该作者
另外,中断处理程序本身也是一个过程,也有可能出错,所以尽量不要在中断处理程序中产生错误,以免程序不可控。

使用特权

评论回复
15
wuhany| | 2018-12-4 19:23 | 只看该作者
还有就是中断程序不要耗时过长的,否则会造成很多的不必要的麻烦的

使用特权

评论回复
16
jiahy| | 2018-12-4 19:27 | 只看该作者
比如按键,我们习惯在中断内扫描按键,并返回一个键值,这个键值就是个全局变量

使用特权

评论回复
17
jiaxw| | 2018-12-4 19:30 | 只看该作者
别执行太多的程序
中断的程序要简洁才行。

使用特权

评论回复
18
zhanghqi| | 2018-12-4 19:35 | 只看该作者
怎么自定义中断呢

使用特权

评论回复
19
liliang9554| | 2018-12-4 19:39 | 只看该作者
这个得注意不能死循环执行函数呢。

使用特权

评论回复
20
jiajs| | 2018-12-4 19:41 | 只看该作者
中断处理太浪费时间了。
中断使能,还有清中断标志位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

857

主题

10661

帖子

5

粉丝