【第2章】中断处理概要

上传人:今*** 文档编号:108081790 上传时间:2019-10-22 格式:PPT 页数:45 大小:483.50KB
返回 下载 相关 举报
【第2章】中断处理概要_第1页
第1页 / 共45页
【第2章】中断处理概要_第2页
第2页 / 共45页
【第2章】中断处理概要_第3页
第3页 / 共45页
【第2章】中断处理概要_第4页
第4页 / 共45页
【第2章】中断处理概要_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《【第2章】中断处理概要》由会员分享,可在线阅读,更多相关《【第2章】中断处理概要(45页珍藏版)》请在金锄头文库上搜索。

1、1,中断处理,邹昕光 哈尔滨工业大学自动化测试与控制研究所,课程内容,2.1 中断的概念 2.2 共享数据问题 2.3 中断的性能,2.1 中断的概念,中断使嵌入式系统打断当前正在执行普通程序代码,转而执行中断对应的服务程序。 中断是嵌入式系统对外部和内部事件作出响应的一种能力。,中断和轮询,轮询适合的场合 中断适合的场合,2.1 中断的概念,图2-1 中断信号硬件连接,中断处理程序,Task Code . MOVE R1, (iCentigrade) MULTIPLY R1, 9 DIVIDE R1, 5 ADD R1, 32 MOVE (iFarnht), R1 JCOND ZERO, 1

2、09A1 JUMP 14403 MOVE R5, 23 .,Interrupt Routine PUSH R1 PUSH R2 . ! Read char from hw into R1 ! Store R1 value into memory . ! Reset serial port hw ! Reset interrupt hardware . POP R2 POP R1 RETURN,图2-2 中断处理程序和普通任务程序,Farnht = Centigrade*9/5 + 32,中断处理程序,中断处理程序(Interrupt Service Routine)形式上是一个函数。 该函数没

3、有返回值。 用户程序不主动调用该函数,它只由操作系统进行调用。,中断处理程序,VxWorks的中断处理函数,void HandleTimerIRQ(void) ,void HandleTimerIRQ() ,中断处理程序,中断程序和中断向量连接,中断服务程序,intConnect,中断服务程序,容易误解的地方 此处不代表调用intConnect就会调用ISR; 只是说intConnect调用之后会产生一个Wrapper; 中断向量表中相应表项的中断服务地址指向该Wrapper; 当该Wrapper执行时,第三步是调用ISR。,中断和堆栈,所有ISRs使用同一个中断堆栈interrupt sta

4、ck; 有些CPU架构不允许使用interrupt stack,ISRs需要使用被中断任务的堆栈; 两种情况下都要保证堆栈的大小足够大。,中断服务程序的限制,由于ISRs使用同一个interrupt stack,因此和普通任务(有自己的stack)不同; 对ISRs最基本的限制就是不能调用会引起阻塞的函数;例如获取信号量; 不能调用malloc()和free(),即不能动态分配和释放内存。因为这两个函数要获取信号量; 不能使用IO函数。因为大多数设备驱动都需要对调用进行阻塞;如屏幕输出。,中断禁止,什么是中断禁止 大多数I/O芯片都能进行设置为不再产生中断信号 大多数CPU都可以编程忽略中断信

5、号 为什么需要中断禁止 当任务代码和中断程序共享变量时 任务代码正试图使用几条语句写一个变量 当执行到半路时,中断产生 中断服务程序也试图写这个变量,然后,中断Q&A,【Q】当中断产生时,CPU是如何找到相应中断处理函数的? 【A】根据CPU结构不同采用不同的方法。 Intel 8051的中断处理程序放在内存空间的固定位置上,根据中断号可以计算出中断处理程序的偏移地址; 其他的一些CPU采用中断向量表(interrupt vector)的方式,表格放在内存空间某处。,中断Q&A,【Q】CPU又是如何知道中断向量表的位置呢? 【A】这个也和具体CPU结构有关系 有的CPU将中断向量表放在固定的位

6、置,例如Intel80186将其放在0x00000处; 有的CPU提供某种方式让程序指出中断向量表存放在内存何处。,中断Q&A,【Q】CPU会在执行一条机器指令中被中断吗? 【A】一般不会。但有的指令能够将很多数据从一个位置移动到另一个位置,这种指令会被中断。,中断Q&A,【Q】一个中断请求信号能够打断一个正在执行的中断处理程序的执行吗? 【A】在大多数CPU上是可以的。这种能力称为中断嵌套(interrupt nesting)。 Intel x86 CPU如果要想获得中断嵌套的能力,中断处理程序需要手工使能中断; 其他一些CPU在进入中断时不会自动禁止所有中断,自动具备中断嵌套能力。,中断Q

7、&A,【Q】在中断被禁止状态下,来了中断信号会怎样? 【A】多数情况下,CPU会记住产生的中断信号。当中断使能后,便会跳到相应的中断处理函数中。,2.2 共享数据问题,什么是数据共享问题? 当中断程序和任务程序共享某些变量和内存块时,对这些变量或内存块操作可能会造成数据的破坏或者与预期不相符的结果。,2.2 共享数据问题,Task Code void main(void) int iTemp0, iTemp1; while(TRUE) iTemp0 = iTemperatures0; iTemp1 = iTemperatures1; if (iTemp0 != iTemp1) !报警 ,Int

8、errupt Routine void interrupt ReadTemperatures(void) iTemperatures0 = !传感器0中存储的值 iTemperatures1 = !传感器1中存储的值 ,图2-3 共享数据问题代码1,Shared data static int iTemperatures2;,假设中断前,iTemperature数组中两个温度均为73度; 中断产生后,从传感器中读出两个温度均为74度; 然后,中断前两个温度分别为73,74; 中断产生后,读出的温度值分别是72,73; 然后,改进程序,Task Code void main(void) whil

9、e(TRUE) if (iTemperatures0 != iTemperatures1) !报警 ,Interrupt Routine void interrupt ReadTemperatures(void) iTemperatures0 = !传感器0中存储的值 iTemperatures1 = !传感器1中存储的值 ,图2-4 共享数据问题代码2,Shared data static int iTemperatures2;,改进程序,main函数的汇编代码, MOVE R1, (iTemperatures0) MOVE R2, (iTemperatures1) SUBTRACT R1,

10、 R2 JCOND ZERO, TEMPERATURES_OK ;报警代码 TEMPERATURES_OK: ,中断前两个温度为73,74 中断后读取的两个温度为72,73,if (iTemperatures0 != iTemperatures1),2.2原子操作和临界区,原子操作 Atomic Operation 一块代码在执行的时候不会被中断,这块代码就称为是原子的。 临界区 Critical Section 需要进行原子操作的一块代码又称为临界区。,2.3 共享数据问题,为什么会产生共享数据问题? 通过观察我们发现:iTemperatures2的赋值操作必须是原子的,要么不赋值,要赋值就

11、必须不中断的全部赋值(all or nothing) 只要保证操作的原子性,就解决了共享数据问题,共享数据问题解决方法,中断禁止 只要任务代码要访问共享数据时,就暂时禁止中断,访问结束后,立即使能中断。,void main(void) int iTemp0, iTemp1; while(TRUE) disable(); iTemp0 = iTemperatures0; iTemp1 = iTemperatures1; enable(); if (iTemp0 != iTemp1) !报警 ,共享数据问题解决方法,void main(void) int iTemp0, iTemp1; while

12、(TRUE) oldInterruptState = disable(); iTemp0 = iTemperatures0; iTemp1 = iTemperatures1; if (oldInterruptState) enable(); if (iTemp0 != iTemp1) !报警 ,不使用中断禁止的解决方法,中断禁止会影响中断响应速度。 思考一下,能否设计一种不采用中断禁止的解决办法?,不使用中断禁止的解决方法,不使用中断禁止的解决方法,Task Code static int iTemperaturesA2; static int iTemperaturesB2; static

13、BOOL taskUsingArrayB = FALSE; void main(void) while(TRUE) if (taskUsingArrayB) if (iTemperaturesB0 != iTemperaturesB1) !报警 else if (iTemperaturesA0 != iTemperaturesA1) !报警 ,不使用中断禁止的解决方法,Interrupt Routine void interrupt ReadTemperatures(void) if(taskUsingArrayB) iTemperaturesA0 = !传感器0中存储的值 iTemperat

14、uresA1 = !传感器1中存储的值 else iTemperaturesB0 = !传感器0中存储的值 iTemperaturesB1 = !传感器1中存储的值 taskUsingArrayB = !taskUsingArrayB; ,2.4 共享数据问题 另一个案例,void interrupt UpdateTime(void) +iSeconds; if (iSeconds = 60) iSeconds = 0; + iMinutes; if (iMinutes = 60) iMinutes = 0; +iHours; if (iHours = 24) iHours = 0; ,sta

15、tic int iSeconds, iMinutes, iHours; int SecondsSinceMidnight(void) return (iHours*60 + iMinutes)*60 + iSeconds; void main() int seconds = SecondSinceMidnight(); ,2.4 共享数据问题 另一个案例,第一个解决方法,long SecondsSinceMidnight(void) BOOL oldInterruptState; int iResult; oldInterruptState = disable(); iResult = (iHours*60 + iMinutes)*60 + iSeconds; if (oldInterruptState) enable(); return iResult; ,2.4 共享数据问题 另一个案例,第二个解决方法,static long int secondsToday; long SecondsSinceMidnight(void) long result; result = secondsToday; while (result != secondsToday) result = secondsToday; return result; ,void interrupt

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号