-
2021-07-30 16:14:19
中断问题也是面试嵌入式岗位时,面试官比较喜欢拷问的问题之一,作为一个嵌入式开发人员,自然少不了与中断打交道,裸机程序中作为前台服务程序,发挥着重要的作用。
中断服务函数应该注意的四大点:
1.中断服务函数不能传入参数;
2.中断服务函数不能有返回值;
3.中断服务函数应做到短小精悍;
4.不要在中断函数中使用printf函数,会带来重入和性能问题
中断并不是程序一开始就判断好会在那里发生,或者会在什么时候发生。中断发生的完全是随机的,中断源连接到硬件,由硬件来产生触发中断,而众所周知,函数、函数内变量等大部分是存储在堆栈区,但是中断是随机产生的,且由硬件告知,那么去哪分配存储位置,自然一二点是无法满足的。
第三点,中断内应做到短小精悍,这个就要求我们要动动脑筋了,但是很多东西在没有需求的情况下,光靠乱猜想挺难的。我在一本书上看到一个作者写了一段关于中断处理代码的,就觉得很好,值得学习(作者也是源于项目的需求,然后动手)。
//定义一个队列结构体,用于存储中断类型
typedef struct tagIntQueue
{
int Type; //中断类型struct tagIntQueue *next;
}IntQueue;
IntQueue IpIntQueueHead;
__interrupt ISRexample()
{
int Type;Type = GetSystemType(); //获取类型 QueueAddTail(IpIntQueueHead,Type); //加入队列
}
//在猪程序中完成所有的工作
while(1){
Type = GetFirstInt();switch(Type) { case xxx: ... break; case xxx: ... break; ....... default: ... break; }
}
把中断提炼到到短小精悍才是中断的灵魂所在,这里中断只做了两件事,就是获取中断类型,然后加入队列中,其余复杂的程序处理都在主函数中完成。更多相关内容 -
:I/O中断处理过程包括哪几个阶段?中断服务程序流程分为哪几部分?
2020-03-22 19:20:25系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。...完整的中断处理过程分为
1)中断响应的事前准备:
系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。
2) CPU检查是否有中断/异常信号
CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量。
对于异常和系统调用那样的软中断,因为中断向量是直接给出的,所以和通过IRQ(中断请求)线发送的硬件中断请求不同,不会再专门去取其对应的中断向量。
3) 根据中断向量到IDT表中取得处理这个向量的中断程序的段选择符
CPU根据得到的中断向量到IDT表里找到该向量对应的中断描述符,中断描述符里保存着中断服务程序的段选择符。
4) 根据取得的段选择符到GDT中找相应的段描述符
CPU使用IDT查到的中断服务程序的段选择符从GDT中取得相应的段描述符,段描述符里保存了中断服务程序的段基址和属性信息,此时CPU就得到了中断服务程序的起始地址。
5) CPU根据特权级的判断设定即将运行的中断服务程序要使用的栈的地址
CPU会根据CPL和中断服务程序段描述符的DPL信息确认是否发生了特权级的转换,比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的首地址存在TR寄存器中)里取得该程序的内核栈地址。
6) 保护当前程序的现场
CPU开始利用栈保护被暂停执行的程序的现场:依次压入当前程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息。
7) 跳转到中断服务程序的第一条指令开始执行
CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。
8) 中断服务程序处理完毕,恢复执行先前中断的程序
在每个中断服务程序的最后,必须有中断完成返回先前程序的指令,这就是iret(或iretd)。程序执行这条返回指令时,会从栈里弹出先前保存的被暂停程序的现场信息,即eflags,cs,eip重新开始执行。
中断服务程序流程
保护现场
保护现场有两个含义,其一是保存程序的断点;其二是保存通用寄存器和状态寄存器的内
容。前者由中断隐指令完成(详见8.4.4节),后者由中断服务程序完成。具体而言,可在中断
服务程序的起始部分安排若干条存数指令,将寄存器的内容存至存储器中保存,或用进栈指令
(PUSH)将各寄存器的内容推入堆栈保存,即将程序中断时的“现场”保存起来。2.中断服务(设备服务)
这是中断服务程序的主体部分,对于不同的中断请求源,其中断服务操作内容是不同的,例
如,打印机要求CPU将需打印的一行字符代码,通过接口送人打印机的缓冲存储器中(参见图
573)以仕打印机打印又如,显示设各要求CPU将需显示的一屏字符代码通过接口送人显示
5.23)以供打印机打印。又如,显示设备要求CPU将需显示的一屏字符代码通过接口送入显示
器的显示存储器中(参见图5.18)。3.恢复现场
这是中断服务程序的结尾部分,要求在退出服务程序前,将原程序中断时的“现场”恢复至
原来的寄存器中。通常可用取数指令或出栈指令(POP),将保存在存储器(或堆栈)中的信息这
回到原来的寄存器中。4.中断返回
中断服务程序的最后一条指令通常是–条中断返回指令,使其返回到原程序的断点处,以信
继续执行原程序。
计算机在处理中断的过程中,有可能出现新的中断请求,此时如果CPU暂停现行的中断月
务程序,转去处理新的中断请求,这种现象称为中断嵌套,或多重中断。倘若CPU在执行中断月
务程序时,对新的中断请求不予理睬,这种中断称为单重中断。这两种处理方式的中断服务程戶
略有区别。图5.43(a)和图5.43(b)分别为单重中断和多重中断服务程序流程。比较图5.4
()和图5.43(h)可以发现.其区别在千“开中断”的设置时间不同。 -
ARM中断处理过程
2021-02-24 16:55:21具体整个处理过程分成三个步骤来描述:1、第二章描述了中断处理的准备过程2、第三章描述了当发生中的时候,ARM硬件的行为3、第四章描述了ARM的中断进入过程4、第五章描述了ARM的中断退出过程本文涉及的代码来自3.14... -
ARM-中断状态,中断响应流程(四大步三小步)
2020-04-10 14:09:58在处理器中,中断是一个过程。即CPU在正常执行程序的过程中,遇到外部或内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去完成事件服务程序,待事件完毕后,再返回到暂停处(断点)继续执行原来的程序。...中断
中断
1) 硬中断
在处理器中,中断是一个过程。即CPU在正常执行程序的过程中,遇到外部或内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去完成事件服务程序,待事件完毕后,再返回到暂停处(断点)继续执行原来的程序。事件服务程序又称中断处理程序或中断服务程序。严格意义上来说,上面的描述是针对硬件中断而言的。
2) 软中断
用软件方法引起的中断,即事先在程序中安排特殊的指令,CPU执行到该类指令的时候,会跳转去执行相应的一段预先安排好的程序,待程序执行完,再返回原来程序处。这种通过软件方法实现的中断叫软中断。3) 软、硬中断和信号的区别
- 硬中断的出现过程是不可预测的,是随机的;而软中断是预先安排好的指令中断方式。
- “硬中断是外部设备对CPU的中断”,“软中断通常是硬中断服务程序对内核的中断”,“信号则是由内核(或其他进程)对某个进程的中断”。
中断源
把引起中断的原因,或者能够发出中断请求信号的来源统称为中断源。
中断/异常优先级
ARM处理器五种模式对应的7种异常源优先级顺序(从高到低):
1 复位异常(reset)
2 数据异常(Data Abord)
3 快速中断异常(FIQ)
4 外部中断异常(IRQ)
5 预取异常(prefetch Abord)
6 软中断异常(SWI)
7 未定义指令异常(Undefined)异常和中断的区别
异常主要是从处理器被动接受异常的角度来考虑;中断带有主动请求处理器处理中断的意味。
共同点:都是打断当前程序执行,进入特定的程序处理事件的一种机制。中断的状态
- 挂起态:中断已发生,但是中断没有被处理执行
- 激活态:中断发生,正在执行对应的中断处理函数,但是还没有执行结束
- 未激活态:中断没有发生。
ARM-7种异常类型
1) 复位异常(reset)
两种情况引起异常:系统上电/系统复位
复位异常中断处理程序完成的功能:- 设置异常向量表
- 初始化栈和寄存器
- 初始化MMU,Cache
- 初始化关键的I/O设备
- 使能中断
- 切换到SVC模式
- 初始化C程序中的变量,跳转到相应程序的执行
2)数据异常(Data Abord)
存储器访问指令load/store访问外部数据时,出现地址不存在或不允许访问等时产生:取数据中止异常
3)快速中断异常(FIQ)
4)外部中断异常(IRQ)
5)预取异常(prefetch Abord)
取一条被标记无效的指令时:取指令中止异常
6)软中断异常(SWI)
软中断发生,系统进入SVC模式,跳转到处理程序
7)未定义指令异常(Undefined)
:未定义指令的异常,指令取出后通过译码器后未定义指令导致译码出错
ARM-异常中断的响应流程(四大步三小步)
注意:
- User和System模式是不可通过异常进入的两种模式,即要进入这两种模式,必须要编程设置CPSR的模式状态。
- ARM处理器中cortex-A不支持中断嵌套,因为ARM处理器的处理中断处理速度较快;
- cortex-M系列支持中断嵌套,eg:stm32。
ARM异常处理:处理器对特定的异常事件进行的处理流程(CPU指导硬件自动完成:四大步三小步)。
一、保存现场(四大步):
1)保存CPSR到SPSR_mode
2)适当设置 CPSR 对应功能位(三小步):- 1、切换处理器进入ARM状态:T[5]
- 2、根据需要,禁止中断位:F[6] / I[7]
- 3、根据异常切换到对应的异常模式:M[4:0]
3)保存返回地址:把当前 PC 保存到 lr_mode
4)设置PC = 存放跳转到对应的异常向量表的固定首地址。
二、恢复现场(必须手动恢复):
1)恢复 SPSR_mode 到 CPSR
2)恢复 lr_mode 到 PC
3)恢复普通寄存器:R0-R7,操作sp将栈中将数据恢复。软中断 汇编测试代码
.text .globl _start _start: b reset b undefined_instruction b software_interrupt b prefetch_abord b data_abord b reserved b irq b fiq reset: @初始化SVC下的栈内存空间 ldr sp, =0x40000100 @切换到User模式下0xD3:SVC;0xD0:User msr CPSR, #0xD0 @初始化User下的栈内存空间 ldr sp, =0x40000200 @执行用户代码 mov r0, #0x1 mov r1, #0x2 @swi软中断:swi <软中断号,取值范围:0-(2^24-1)> swi 2 @执行用户代码:r2 = 1+2 = 3 add r2, r0,r1 undefined_instruction: software_interrupt: @保存现场 stmfd sp!,{r0-r1, lr} @执行用户代码 mov r0, #0x5 mov r1, #0x6 add r3, r0,r1 @恢复现场:{r0-r1,pc}将lr恢复给pc,"^"是表示将SPSR恢复到CPSR ldmfd sp!, {r0-r1,pc}^ prefetch_abord: data_abord: reserved: irq: fiq: loop: b loop .end
-
中断服务程序设计实验
2012-05-16 11:38:39若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断... -
中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
2019-11-24 15:17:43一,中断的定义 二 ,中断处理的过程 三,8086/8088CPU可以处理256种不同类型的终端 四,中断服务程序的设计方法 五中断向量表的建立一,中断的定义
在CPU执行程序的过程中,出现了某种紧急或异常的事件(中断请求),CPU需要暂时停止正在执行的程序,转去处理该事件(执行终端服务程序),并在处理完毕后,返回断点继续执行被暂停的程序,这一过程,称为中断。
二 ,中断处理的过程主要有五步
1.中断请求
2.中断响应
3.保护断点
4.中断处理
5.中断返回
三,8086/8088CPU可以处理256种不同类型的终端
四,中断服务程序的设计
1.用户在设计中断服务程序时要预先确定一个中断类型号,不论是硬件中断还是软件中断,都只能在系统预留给用户的类型号中选择,
2.确定中断类型号之后还要把中断服务程序入口地址置入中断向量表,以确保在中断响应时CPU能自动转入该类型号相对应的中断服务程序。
3.中断向量表的建立
设用户定义的中断类型号为60H
1)DOS系统功能调用法
功能号:(AH)=25H
入口参数:
(AL)=中断类型号
(DS)=中断服务程序的入口地址的段地址
(DX)=中断服务程序的入口地址的段地址
下面程序段完成中断类型号为 60H的中断服务程序的入口地址的置入PUSH DS //保护DS MOV DX, OFFSET INT _60 //取中断服务程序INT_60的偏移地址 MOV AX, SEG INT _60 //取中断服务程序INT_60的段地址 MOV DS, AX MOV AH, 25H //送功能号 MOV AL, 60H //送中断类型号 INT 21H //DOS功能调用 POP DS //恢复DS
2)直接装入法
用传送指令直接将中断服务程序入口地址置入中断向量表。
设中断类型号为60H,此类型号对应的中断服务程序入口地址应存放在中断向量表00180H开始的四个连续存储单元中。
采用直接装入的程序段如下:XOR AX, AX //清零 MOV DS, AX MOV AX, OFFSET INT_60 MOV DS: [0180H], AX // 置中断服务程序INT_60的偏移地址 MOV AX, SEG INT_60 MOV DS: [0180H+2], AX //置中断服务程序INT_60的段地址
接下来会对可编程中断控制器8259 A进行理解,请大家拭目以待!
学习是对体系结构的一种建立,今天不会的不要慌,当体系结构达到一个水准之后,或许明天就会了呢?
目之所及,皆是回忆!
心之所想,皆是过往!
眼之所看,皆是遗憾! -
计算机中的中断处理流程
2022-03-18 22:15:05处理器响应中断后,首先要保护程序的现场状态,在保护现场过程中, CPU 不应该响应更高级中断源的中断请求。否则 ,如果现场保存不完整,在中断服务程序结束后,也就不能正确地恢复并继续执行现行程序。 二、保存... -
四线两相步进电机控制 Stm32F407 定时器中断 带缓启动和减速过程(初级版本)
2019-04-12 10:34:23资源的介绍在这里 : ...很简单的一个版本 代码做了比较多的注释 新手刚开始玩步进电机可以有一点点参考,后期会做一些更加实用的版本出来 STM32F407 + 定时器 中断 有缓启动 和缓慢减速 (非S曲线 ) -
中断全过程
2020-03-27 18:54:19中断全过程指的是从中断源发出中断请求开始,CPU响应这个请求,现行程序被中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来的程序继续执行的整个过程。 大体上可以把中断全过程分为5个阶段:中断... -
单片机_C语言函数_中断函数(中断服务程序)
2021-05-20 03:38:35c语言中的中断函数注意事项单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在... -
画出中断响应流程图?并叙述中断响应的流程
2020-12-20 04:41:18判断正确的是【单选题】由曲面围成或由曲面和平面围成的立体称为曲面立体,如圆柱体由圆形平面和柱面构成,圆环体由圆环面构成,圆锥体由【判断题】若圆柱体的底面为水平面,则圆柱体的三面投影是一个圆和两个大小相等的... -
中断处理的基本过程
2020-03-24 15:07:49中断处理的基本过程包括中断请求、中断判优、中断响应、中断服务 和中断返回等五个阶段。 1.中断请求阶段 1)发生在CPU内部的中断(内部中断),不需要中断请求,CPU内部的中断控制逻辑直接接收处理。 2)外部中断... -
简述CPU中断响应过程的九大步骤
2020-12-19 13:28:25CPU响应中断:就是CPU要去执行相应的中断服务程序,其响应过程是CPU将现在执行程序的指令地址压入堆栈,跳转到中断服务程序入口地址,中断服务程序的入口地址就是中断向量,这个中断向量用2个16位寄存器存放。... -
中断
2016-08-21 00:18:20由于内部/外部事件或由程序预先安排的事件,引起CPU暂时停止正在运行的程序,转到为该内部/外部事件或预先安排的事件服务的程序中去,服务完毕,再返回去继续运行被暂时中断的程序,这个过程称为中断。 2. 可屏蔽... -
8.4-中断系统小结(cpu中断七个问题)
2022-03-16 23:09:34【1】中断系统 1)作用:用中断系统实现了外设数据的输入输出; 还可以用于程序调试,计算机系统的异常事件,都可以用中断系统来处理; 2)中断因素 人为设置的中断; 程序性事故,如java异常; 硬件故障,如... -
help!!!!!请教:关于中断处理程序 ,中断服务例程
2019-02-18 20:46:08这是书上I/O中断部分“单重中断和多重中断服务程序的流程”,我的疑问是: 1、保护现场包括 :a.保护程序断点;b.保存各寄存器内容。书上说: a由中断隐指令完成,b由中断服务程序完成 我理解为:ab都属于保护现场... -
C51教程 第四个51程序:中断控制--外部中断0
2020-02-18 20:31:52单片机中断是指CPU在正常执行程序的过程中,由于计算机内部或外部发生了另一...今天要做的一个实验叫做外部中断,按下按键,停止主程序中的内容,立即转去执行中断服务函数。 我们主要看到原理图与代码,了解中断是什... -
实验四 页式虚拟存储管理中地址转换和页式中断 FIFO LRU OPT C++版本.doc
2020-01-17 01:38:14实验四 页式虚拟存储管理中地址转换和页式中断 FIFO 一实验目的 深入了解页式存储管理如何实现地址转换进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法 二实验主要内容 编写程序完成页式虚拟存储管理... -
外中断(按键)控制数码管显示
2020-07-25 15:47:13本文给大家分享了外中断(按键)控制数码管显示的代码。 -
8086CPU中断响应流程.ppt
2020-12-24 22:07:34四、8259A 的初始化命令字 8259A 初始化编程时,有四个初始化命令字ICW(Initialiation Command Word),即ICW1?ICW4 ;8259A工作期间,有三个操作命令字OCW(Operation Command Word),即OCW1~OCW3。 8259A 只有两个... -
中断服务子程序
2018-05-16 17:55:42中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准...下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 __interrupt double compute_... -
8086学习(四)中断
2020-05-19 15:59:59答:四个不匹配:速平格时,就这样记了,没法记的。针对这几个不匹配,用不同的方法,例如设置缓冲以匹配速度,设置电平转换电路,设置格式转换电路,设置时序控制电路等 缓冲器与锁存器各用在什么地方? 很显然了... -
中断服务函数与函数调用的区别
2019-12-23 17:02:06在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过... -
浅谈中断与单片机中断处理的过程
2020-06-01 15:46:27中断是个很重要的一个概念,在计算机组成原理中曾经讲过这一概念,对于嵌入式方向来说,也是一个非常重要的一个知识点,经常出现在笔试中。 中断 所谓中断就是:CPU在正常执行程序的过程中,由于内部/外部事件的触发... -
《VxWorks7编程指南》笔记(四)——中断服务程序ISR
2020-06-13 22:39:36《VxWorks7编程指南》中有关中断服务程序的笔记 -
ARM中断处理流程
2017-06-17 22:52:07这边文章主要是讲解一下,对ARM_Linux中断处理的一个流程介绍,在底层处理部分,不同的架构会有不一样处理,但Linux中断注册过程是一样的。 一、Linux中断的简易模型: 当一个IRQ产生时,会发生什么? 当一个... -
中断服务函数的过程_20160206
2016-02-17 08:44:22中断对于操作系统来说非常重要,就好像机器中的齿轮,驱动各部件的动作。所以,许多人把操作系统称为是由“中断驱动”的。那么,究竟什么是中断呢?我们有如下定义:所谓中断是指CPU对系统发生的某个事件做出的一种...