-
2017-08-14 22:39:28
首先,PIC(可编程中断控制器)将外设的中断信号映射为一个中断向量,另一方面将信号发送给cpu的intr管脚。
cpu从PIC读取中断向量值i,到IDT(中断描述符表)表的第i项找到中断服务程序的段基址和偏移。
执行中断服务程序前,首先进行当前进程寄存器的压栈处理,然后向cs和eip装载中断服务程序的基址和偏移,执行中断服务程序。
执行中断服务程序前,还要比较cs寄存器的中CPL和中断服务程序所在段的DPL,DPL不允许小于CPL,即中断源不能越权激活中断服务程序。
IDT表是可编辑的,一部分由内核初始化使用,一部分留给用户使用。
更多相关内容 -
什么是异常中断产生指令
2020-07-26 13:29:01软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下对操作系统中特权模式的程序调用;断点中断指令BKPI主要用于产生软件断点,供调试程序用。 -
C51使用定时器中断产生PWM方波信号
2020-05-06 09:29:16使用定时器中断产生PWM方波信号,完成50个频率为1KZ的矩形脉冲输出,P20端口接LED闪烁,用于演示。 矩形脉冲频率为1KZ,周期则为1ms, 中断为0.5ms, 所以T0: TH0=(65536-500)/256, TL0=(65536-500)%256。 ...使用定时器中断产生PWM方波信号,完成50个频率为1KZ的矩形脉冲输出,P20端口接LED闪烁,用于演示。
矩形脉冲频率为1KZ,周期则为1ms, 中断为0.5ms, 所以T0: TH0=(65536-500)/256, TL0=(65536-500)%256。
使用示波器观察输出信号波形。电路原理图:
代码:
/* 用定时/计数器 T0 输出引脚 P1.4 延时30ms 完成50个频率为1KZ的矩形脉冲输出(用中断) 矩形脉冲频率为1KZ,周期则为1ms, 中断为0.5ms, 所以T0: TH0=(65536-500)/256, TL0=(65536-500)%256 注意:89c51 以及 程序 均按12Mhz计算 */ #include <reg52.h> #define uchar unsigned char #define uint unsigned int uint i = 0; sbit P1_4 = P1^4; sbit led=P2^0; //将单片机的P2.0端口定义为led void delay(uint i) { while(i--); } //定时器T0初始化 void Timer0init() { //设置T0 TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动 TH0=(65536-500)/256; //给定时器赋初值,定时0.5ms TL0=(65536-500)%256; ET0=1; //打开定时器0中断允许 EA=1; //打开总中断 TF0=0; //溢出位清零 TR0=1; //打开定时器 } void Timer0() interrupt 1 { TR0 = 0; TH0=(65536-500)/256; //给定时器赋初值,定时0.5ms TL0=(65536-500)%256; P1_4 = ~P1_4; i++; if(i==50) { TH0=(65536-30000)/256; //给定时器赋初值,定时30ms TL0=(65536-30000)%256; i = 0; } TR0=1; //打开定时器 } void main(void) { Timer0init(); //定时器T0初始化 while(1) { led=0; delay(50000); //大约延时450ms led=1; delay(50000); //大约延时450ms } }
效果截图:
-
中断的产生、含义,处理过程
2021-06-03 09:36:39中断:cpu里面发生了某些事,需要 cpu 马上去处理,这就叫中断,处理事情的程序 叫做中断程序 除法错误 单步执行 执行 into 指令 执行 int 指令 你要处理中断,那至少要晓得...中断是什么
中断:cpu里面发生了某些事,需要 cpu 马上去处理,这就叫中断,处理事情的程序 叫做中断程序
除法错误
单步执行
执行 into 指令
执行 int 指令你要处理中断,那至少要晓得发生了啥事,啥事要我(cpu)处理呀,也就是中断的类型是啥,一般8086用的是中断类型码来标识是啥中断要处理
有了中断类型码,我(cpu)晓得你要我处理啥事了,那我(cpu)该咋处理呀,处理这件事的程序在哪儿呀,我(cpu)只是个无情的代码执行工具人。通过中断类型码,就可以得到程序的入口地址,
有了处理程序的入口地址,那我(cpu)就可以给你执行了,那这个入口地址到底怎么通过终端类型码得到呢,其实是这样的,在8086体系下,地址最开始(0000:0000)存放的是一张中断向量表,内容是各种中断处理程序的地址(段地址和偏移地址),一个中断占两个字(32个字节,段地址16个,偏移地址16个),理论上要存 256个中断处理程序地址,实际上,基本用不完,因为没这么多个中断要处理
那就得了,N号中断的入口地址存放在 (0000:4*N——0000:4 * N+2)处,其中段地址在高地址,偏移地址子在地址值,即 N号中断的段地址 0000:4 *N+3 0000:4 *N+2 (一个地址存了一个字节),偏移地址0000:4 *N+1 0000:4 *N对于cpu来讲就是这样一个过程,
发生了某个中断——cpu取得中断类型码——通过类型码找到对应中断处理程序的段地址和偏移地址——然后通过设置cs为段地址,ip为偏移地址,开始运行程序
加上保护现场,出栈入栈啥的,基本步骤如下
- 从中断信息中取得中断类型码
- 标志寄存器入栈 。pushf
- 设置标志寄存器的 TF IF为0。 TF=0 , IF=0
- cs入栈 push cs
- ip入栈 push ip
- 从内存地址
中断类型码*4
和中断类型码 *4+2
的两个字单元读取中断处理程序的入口地址,设置cs 和ip。(ip)=(N*4)
,(cs)=(N*4+2)
,()是取内容的意思,汇编有讲过
-
32位保护模式下中断发生时的压栈情况
2018-12-13 14:31:53我们知道,中断在发生时,处理器根据收到的中断向量号在中断描述符表中找到相应的中断门描述符。 处理器从该描述符中加载目标代码段选择子到代码段寄存器 cs 及偏移量到指令指针寄存器 EIP。 注意,由于 cs 加载了...我们知道,中断在发生时,处理器根据收到的中断向量号在中断描述符表中找到相应的中断门描述符。
处理器从该描述符中加载目标代码段选择子到代码段寄存器 cs 及偏移量到指令指针寄存器 EIP。
注意,由于 cs 加载了新的目标代码段选择子,处理器只要发现段寄存器被加载,段描述符缓冲寄存器就会被刷新,因为处理器认为是换了一个段,属于段间转移,也就是远转移。
所以,当前进程被中断打断后,为了从中断返回后能继续运行该进程,处理器自动把 cs 和 EIP 的当前值保存到中断处理程序使用的栈中。
除了要保存 cs、 EIP 外,还需要保存标志寄存器 EFLAGS,
因为中断是可以在任何特权级别下发生的,不同特权级别下处理器使用不同的栈,如果涉及到特权级变化,还要压入 SS 和 ESP 寄存器。
那么我们就来看看到底中断的时候是如何来压栈的吧~
1。当中断发生时,低特权级向高特权级转化时的压栈现象
当处理器根据中断向量号找到中断描述符后,根据中断描述符中的段描述符选择子+GDTR的值,我们可以找到目标段描述符。我们是否能访问这个目标段描述符,要做的就是将找到中断描述符时当前的CPL与目标段描述符的DPL进行对比。
这里我们讨论的是CPL特权级比DPL低的情况,即数值上CPL > DPL.
这表示我们要往高特权级栈上转移,也意味着我们最后需要恢复旧栈,所以(1) 处理器先临时保存一下旧栈的SS和ESP(SS是堆栈段寄存器,因为换了一个栈,所以其也要变,ESP相当于在栈上的索引),然后加载新的特权级和DPL相同的段,将其加载到SS和ESP中,然后将之前保存的旧栈的SS和ESP压到新栈中
由于SS堆段寄存器是16位寄存器,所以为了对齐,将其0拓展后压栈。
然后在新栈中压入EFLAGS标志寄存器,得到图如下:
2.因为是要切换栈,属于段间转移,所以我们还要将旧栈SS和EIP备份,以便中断程序执行后还可以恢复到被中断的进程。因为CS代码段寄存器也是16位寄存器,所以也要在压入栈前进行0扩展,此时如下图
3.某些异常会有错误码,此错误码用于报告异常是在哪个段上发生的,也就是异常发生的位置,所以错误码中包含选择子等信息。错误码会紧跟在 EIP 之后入栈,记作 ERROR CODE
2。当中断发生时,无特权级转化时的压栈现象
此时由于不会切换栈,就不用保存SS和ESP,但是由于在处理完中断程序后还是要返回源程序中继续执行的,所以,我们的CS EIP寄存器还是要保存的。
这种中断返 回是用 iret 指令实现的。 Iret,即 interrupt ret。注意在返回的时候,其错误码不会自动跳过,所以需要我们手动跳过。
????????????????????????
好了,我们的压栈过程就到此讲完了,下面我们来了解一下,中断程序返回即出栈的过程,假设此时ESP已经跳过错误码指向eip_old
当处理器执行到 iret指令时,它首先需要从栈中返回CS_old 及EIP_old,由于处理器在中断返回的时候,并不记得自己来的时候也曾经做过特权级检查,所以这时候它还要再进行特权级检查。
特权级检查如下:
(1)将cs_old对应的代码段的DPL及cs_old中的RPL做特权级检查, 如果检查通过,随即需要
更新寄存器cs和EIP
由于cs_old在入栈时已经将高16位扩充为 0,现在是 32 位数据,段寄存器 cs 是 16 位,故处理器丢弃 cs_old 高 16 位,将低16 位加载到 cs.
将 EIP_old加载到 EIP 寄存器,之后栈指针指向 EFLAGS。如果进入中断时未涉及特权级转移,此时栈指针是 ESP_old (说明在之前进入中断后,是继续使用旧栈)。否则栈指针是 ESP_new (说明在之前进入中断后用的是 TSS 中记录的新栈)。
(2)将栈中保存的
EFLAGS 弹出到标志寄存器 EFLAGS
。如果在第 1 步中判断返回后要改变特权级, 此时栈指针是 ESP_new,它指向栈中的 ESP_old。否则进入中断时属于平级转移,用的是旧栈,此时栈指针是 ESP_old,栈中已无因此次中断发生而入栈的数据,栈指针指向中断发生前的栈顶。(3)如果在第 1 步中判断出返回时需要改变特权级,也就是说需要恢复旧栈,此时便需要
将 ESP_old 和 SS_old 分别加载到寄存器 ESP 及 SS
,丢弃寄存器 SS 和 ESP 中原有的 SS_new 和 ESP_new,同时进行特权级检查。由于 SS_old 在入栈时已经由处理器将高 16 位填充为 0,现在是 32 位数据,所以在 重新加载到栈段寄存器 SS 之前,需要将 SS_old 高 16 位剥离丢弃,只用其低 16 位加载 SS。
至此,处理器回到了被中断的那个进程。
参考书籍:《操作系统真相还原》第七章7.4.2
-
单片机中断实验
2013-05-12 12:23:18P2口连接8个发光二极管,用来反映中断程序处理过程. 中断未发生时,LED做闪烁状态,当有中断产生,LED呈流水灯操作 。文件包含程序以及电路图。 -
模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序.doc
2020-06-28 20:52:03操作系统-时钟中断-模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序,含详细代码 操作系统-时钟中断-模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序,含详细代码 -
中断产生EINTR错误
2018-05-22 11:53:573 忽略信号(让系统不产生信号中断) [html] view plain copy struct sigaction action; action.sa_handler = SIG_IGN ; sigemptyset(&action.sa_mask); sigaction(SIGALRM, &action, ... -
内中断,外中断,软中断,硬中断,异常,陷阱
2022-03-03 20:40:59不管是内中断,外中断,软中断还是硬中断都是按照中断...内中断也常称作异常(exception),指的是CPU执行当前指令时所发生的中断,一般分为两种: 1.自愿中断。比如当前执行的是trap指令。 2.强迫中断。即当前指令在执 -
第9课,按键中断和定时器中断
2018-06-13 22:56:35中断的处理 1.1 中断初始化 1.1.1 设置中断源,让他能够发出中断信号 a.以按键中断为例,按键原理图如下,4个按键分别接到EINT0,EINT2,EINT11,ENIT19对应GPF0,GPF2,GPG3,GPG11 b.配置GPFCON,GPGCON使得GPF0,GPF2,... -
STM32异常与中断过程详解
2021-06-14 15:14:52中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而... -
Linux中断机制(转)
2019-02-13 15:22:33为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中... -
Linux 中断之中断处理浅析
2019-01-17 14:15:091. 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时... -
什么是中断?中断发生时cpu做什么工作?
2014-07-04 21:08:39中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。 ... -
DSP的中断系统
2022-04-04 10:38:53文章目录1. 什么是中断 1. 什么是中断 中断是硬件和软件驱动事件,它使得CPU暂停当前的主程序,转而去执行一个中断服务子程序...X281x的中断系统从上至下分成了三级,即CPU级中断、PIE级中断、外设中断。 ... -
CPU关闭总中断过程中中断会丢失吗
2018-11-29 19:16:04在开发过程中,一直因为犹豫开关中断是否会导致期间中断的丢失,这种应用场景通常在怕中断导致出现不必要异常,比如用在互斥锁等场景,终于有幸知道了答案,详见下图 原文请见:... -
初学zigbee--IO口中断产生配置条件
2015-07-25 23:57:46IO口中断产生配置条件 中断概述;CC2530的CPU有18个中断源,每个中断请求可以通过设置中断使能 SFR 寄存器的中断使能位 IEN0,IEN1 或者 IEN2 使能或禁止 1. CPU中断开关打开 -
Linux之时钟中断详解
2021-01-20 16:27:30在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的。该频率是常量HZ,该值一般是在100 ~ 1000之间。该中断的作用是为了定时更新系统日期和时间,使系统时间不断地得到跳转。另外该中断的中断... -
STM32单片机(五). 中断系统
2021-04-18 20:43:33中断的概念: 中断是当单片机的CPU在执行程序时,外部或内部发生了一个随机事件,导致CPU暂时中断正在执行的程序,转去执行一段特殊的服务程序也就是中断服务子程序或中断处理程序。当处理完服务程序后,返回到被... -
第7章中断处理程序
2018-09-17 20:40:11产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一个函数专门处理由键盘产生的中断。一个设备的中断处理程序是它设备驱动程序的一部分——设备驱动程序是用于对... -
STM32——串口中断触发条件
2020-07-13 16:18:28单片机串行口是发送或接收完一帧数据才进入中断的,一帧数据一般设定为一个字节(8位),此时串口的DR寄存器中只有这一帧的数据,记住只有这一帧的数据!!! -
ARM 中断发生时 PC,LR,SPSR,CPSR寄存器相关问题总结
2020-09-16 15:16:03问:ARM在从SVC模式,进入IRQ中断时,现场是如何保存的?...另外 ,PC指针地址,在中断发生时会向LR寄存器赋值,但是赋值对象也不是LR_svc寄存器,而是在IRQ模式下的LR_irq寄存器。 因此,在进入中断IR -
硬件中断,软件中断
2020-08-10 09:54:21处理中断的驱动是需要运行在CPU上的, 因此, 当中断产生时, CPU会暂时停止当前程序的程序转而执行中断请求. 一个中断只能中断一颗CPU(也有一种特殊情况, 就是在大型主机上是有硬件通道的, 它可以在没有主CPU的支持下... -
第四节:定时器中断及定时器产生PWM(用CubeMX学习STM32)
2020-01-05 22:40:29用STM32CubeMx学习stm32; 使用cube配置,IAR或者Keil编程, 学习STM32定时器中断以及用STM32的定时器产生PWM; -
用户态和内核态 中断处理机制
2021-01-15 22:57:541.2 中断 1.2.1 中断机制的产生 早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。 中断是多程序... -
ARM架构异常中断处理流程
2018-12-05 21:02:51当IRQ和FIQ异常中断产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令。当IRQ和FIQ异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_mode中。这时(PC-4)即指向当前指令后的第2条指令。... -
实验一 时钟中断事件模拟
2018-03-08 11:16:01模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。 通过实习了解中断及中断处理程序的作用。本实习模拟“时钟中断事件”的处理,对其它中断事件的模拟处理,可根据各中断事件的性质确定处理原则,... -
arm 处理器进入和退出异常中断的过程
2019-08-14 22:16:29在介绍arm处理器异常中断处理过程之前,先看一下arm寄存器的基本情况。 从这个博客引用一些知识点https://blog.csdn.net/Rik_Liu/article/details/90215982: R0~R7:在所有模式下对应的物理寄存器都是相同的... -
FreeRTOS中断管理
2022-01-08 15:27:38嵌入式实时系统需要对整个系统环境... 二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)中只是快速处 -
中断应用—时钟中断
2019-08-20 15:40:54在所有的外部中断中,时钟中断起特殊的作用。因为计算机是以精确的时间进行数值运算和数据处理的,最基本的时间单元是时钟周期,例如取指令、执行指令、存取内存等,这里讨论的是操作系统建立的时间系统,这个时间...