第4章 中断

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

§4.2 中断基础知识(回顾)

定义
— 由于某些事件的出现,中止现行进程的运行,而转去处理出现的事件,
待适当的时候让被中止的进程继续运行,这个过程称为中断 。

作用
— 快速响应外部事件 。

中断是从一个硬件信号开始的 ,其实是电平信号引 起的。
§4.2.1 上下文的保存和恢复

保存上下文
— 在中断程序开始时要把所有的寄存器压入堆栈, 我们把这个过程称作保存上下文。
§4.3.2 解决共享数据问题

第一种方法
— 禁止和允许中断。
必须清楚什么时候禁 止中断,并在必要的时 候通过明确的程序代码 来实现。

§4.3.3 “原子的”和“临界区”

程序中不能被中断的部分代码称为“原子的”。 在操作系统中,称作“原语”。
—不能被中断的意思是如果执行了就不能被停止,一直到结束
中断程序的定位问题
— 固定位置 — 在中断向量表中

中断向量表的定位问题
— 固定位置 — 通过一些方法提供

一条指令在执行过程中,微处理器能被中断吗?
— 通常是不行的。 — 在绝大多数情况下,微处理器会在执行完当前指令以后才跳 转到中断程序。

如果两个中断同时产生,微处理器会优先执行哪一个 中断程序呢?
免出现共享数据问题。
§4.3.6 volatile关键字


在嵌入式C中常用。 为了防止编译器的优化,需要volatile关键字。
— 警告编译器,不要优化代码,以免出错。


如果编译器不支持volatile关键字,可以通过关掉编 译器的优化功能来达到相同目的。 上述例子的另一解决办法,但要需要volatile关键字。

恢复上下文
— 中断程序结束后的弹出堆栈,我们称之为恢复上 下文。
§4.2.2 禁止中断


禁止CPU对中断的响应,也就是说中断被屏蔽 了。当允许中断时,再被执行。 屏蔽中断的方法 — 有一些专用的寄存器来管理中断的禁止和允许。
— 利用优先级机制(比较少见)。
Leabharlann Baidu
§4.2.3 和中断有关的常见问题



使用中断时都会碰到这样一个问题
— 中断程序可能会与用户所写的其他的任务代码通信。
在这种情况下,中断程序和任务代码就必须 共享一个或多个变量来实现它们之间的通信。 什么是共享数据?
— 指中断程序和任务代码或任务之间的代码共同使用的一个 或多个变量。 — 举例例子

说明
—功能:监控着两个应该 相等的温度。如果它们不 等了,系统就发出警报。 —函数main是一个无限循环, 它的功能是确定两个温度 相等与否。 —中断程序周期性执行。

如果忘了恢复被禁止的中断会怎么样?
—微处理器将不会执行任何中断程序,任何跟中断程 序有关的处理都会慢慢停下来。

如果禁止/允许一个已被禁止/允许的中断会怎么 样? 微处理器启动时中断是被禁止还是被允许的? 可以用C语言写中断程序吗?
—不会发生任何事情。

— 被禁止

— 通常是可以的。
§4.3 共享数据问题
但是注意:static volatile long int lSecondsToday;
§4.4 中断延迟


可以反映出系统对外界变化的反应速度。 系统对每个中断响应速度能有多快,与以下 4个因素有关:
—中断被禁止的最长时间(越短,响应越好) 。 —高优先级的中断程序的执行时间(编写短的ISR)。 —微处理器停止当前任务、保存必要的信息以及执行中断程 序中的指令所花费的时间(由硬件完成)。 —从中断程序保存上下文到完成一次响应需要的时间。 (由软件完成,可以通过编写高效代码来解决它)

把必须是“原子的”以保证系统正常运转的指 令的集合定义为“临界区”。
注意:临界区是一部分代码段。
§4.3.4 更多一些例子

说明
—共享了三个全局变量。 —中断程序负责时的时更新。 —任务负责返回午夜到现在的 时间秒数。

问题
—假设现在时间为3:59:59,任 务读iHours=3后,被中断了; —时间更新为4:00:00 ; —再返回任务读iMinutes=00, iHours=00; —结果时间为3:00:00 ,差了 一个小时。
§4.3.5 第四种方法
— 把秒数计算放在中断程序中,由任务返回结果。 — 但return (lSecondsToday ) 不一定是“原子的”。 — 如果微处理器的寄存器达到可存放一个长整数,则是“原子 的”; —如果达不到,则不是“原子的”。

更好的解决办法
— 当函数读取共享变量时就禁止中断,从而绝对避

存在的问题
—可能会误发警报。 —因中断程序和主函数共用 iTemperatures[2]变量。

说明
—也存在数据共享。 —只是更加不明显了。 —因while循环中的语句能 被中断。
§4.3.1 共享数据问题的特征

隐蔽性 发生时间的不确定性
一旦你的中断程序和任务代码共享了数据,请你务 必保持怀疑的态度,来分析各种可能出现的情况, 以确保你的代码中没有共享数据问题。

中断延迟是指系统响应一个中断所需要花费 的时间

这些因素如何得到?
— 第三个因素可以通过制造商提供的微处理器文档得到。 — 其余三个因素可以通过实验测量或查阅指令数量和类型, 再查阅文档得到,但是有Cache就不是很有效了。

要保持中断延迟短,需要:
— 使中断程序尽可能短。 — 仅禁止中断一段短的时间。
解决办法:

第一种方法
— 直接加禁止和允许中断。
— 但是enable( )不能被执行,因为任务已经返回了。

第二种方法
— 变形后加禁止和允许中断。 — 但是如果函数被其他临界区调用时,会导致其他
临界区中允许中断而产生错误。

第三种方法
— disable( )除禁止中断外,还有返回值。 — 返回1,可以允许中断。 — 返回0,不允许中断。 — 缺点:速度稍慢一些。
§4.1 微处理器体系结构

汇编语言又叫助记符语言
— 是能在微处理器上执行的机器指令的另一种表示形式。 — 每一条汇编语句对应一条机器指令。 — 每一种微处理器都有它自己的汇编语言。

微处理器内的寄存器:
有一组寄存器 — 通用寄存器(如,AC) — 专用寄存器(如PC和SP)

C语言是高级语言
— 一条C语句可能对应多条汇编指令。 — 例子:
《嵌入式系统软件教程》
David E Simon著 陈向群 等译 机械工业出版社
第四章 中断

从第四章开始进入我们的主题是嵌入式系统软 件,跟操作系统有关的概念。 即使嵌入式系统正在做某些事情,也要能够快 速响应外部事件。 为保证到达这一要求,响应是必须面对的一个 难题之一。 解决响应问题的第一个方法就是使用中断 —使用中断好处:对外部事件能快速响应。 —使用中断坏处:使程序设计复杂化。
— 利用优先级,优先级高的可以中断优先级低的程序。

一个中断请求能够中断另一个中断程序吗?
— 对大多数的微处理器而言,中断嵌套是可以的。

在中断被禁止的时候发生中断请求会怎么样?
— 在绝大多数情况下,微处理器会记下发出请求的 中断,等到允许中断的时候就会转去执行中断程序。 —中断并没有被真正地禁止,而是仅仅被推迟了。
相关文档
最新文档