中断向量表

第12章 内中断

微笑、不失礼 提交于 2020-03-05 23:49:51
第12章 内中断 12.1内中断的产生 除法错误:0,表示出发错误,如执行div指令产生的除法溢出; 单步执行:1; 执行into指令:4; 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供的CPU的中断类型码。 12.2 中断处理程序 CPU在收到中断信息后,应该转去执行该中断信息的处理程序。 12.3 中断向量表 CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。中断向量表就是中断向量的列表。所谓的中断向量,就是中断处理程序的入口地址。展开来说,中断向量表,就是中断处理程序入口地址的列表。 中断向量表在内存中存放,对于8086PC机,中断向量表指定存放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。 在中断向量表中,对于8086CPU,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。 12.4中断过程 CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。 下面是8086CPU收到中断信息后,所引发的中断过程 12.5 中断处理程序和iret指令 中断处理程序的编写方法与子程序的编写方法比较相似,下面是常规的步骤: 1、 保存用到的寄存器 2、 处理中断 3、 恢复用到的寄存器

X86汇编7.内部中断

元气小坏坏 提交于 2020-02-26 04:12:38
最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。 依据中断来源,中断可以分为内部中断,和外部中断。 1.内部中断的产生 当CPU发生下列事情后,会产生中断: (1)除法错误,中断号:0 (2)单步执行,中断号:1 (3)执行info指令,中断号:4 (4)执行int指令,中断号:int 指令后面跟随的立即数 CPU收到中断信息后,需要立即对中断进行处理,处理中断的程序叫中断处理程序。CPU用8位的中断码通过中断向量表找到相应的中断处理程序,中断向量就是中断处理程序入口地址。 中断向量表: 0号中断对应的中断处理程序的入口地址 1号中断对应的中断处理程序的入口地址 ...... n号中断对应的中断处理程序的入口地址 这样,CPU通过中断号就能找到中断处理程序的入口地址。中断向量表在内存中存放,对于8086处理器,中断向量表指定放在内存地址0处,从0000:0000到0000:03FF的1024个地址单元中,不同CPU可能有不同的约定。 CPU响应中断的方式是:设置CS:IP的值,使他指向中断处理程序入口地址。 中断过程: (1)(从中断信息中心)取得中断号 (2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值

单片机启动文件

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-17 14:47:58
初始化堆栈指针SP 初始化PC指针 初始化中断向量表 配置系统时钟 调用C库函数_main,最终去到C的世界 启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户c代码之前。上电后,arm处理器处于arm态,运行于管理模式,同时系统所有中断被禁止,pc到地址0处取指令执行。一个可执行映像文件必须有个入口点,而能放在rom起始处的映像文件的入口地址也必须设置为0.在汇编语言中,我们已经说过怎样定义一个程序的入口点,当工程中有多个入口点时,需要在连接器中使用-entry指出程序的入口点。如果用户创建的程序中,包含了main函数,则与c库初始化代码对应的也会有个入口点。 总的来说,启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、i/o等;二是初始化c库和用户应用程序。在第一阶段,启动代码的人物可以描述为: (1)建立中断向量表; (2)初始化存储器; (3)初始化堆栈寄存器; (4)初始化i/o以及其他必要的设备; (5)根据需要改变处理器的状态。 -->建立中断向量表 初始化代码必须建立好中断向量表,以备应用程序后续使用。如果系统的地址0处是rom,则中断向量表直接是一些跳转指令就可以了,他们转到相应的中断处理函数执行。如果系统的0地址处不是rom,则中断向量表是通过动态的方式创建的,这主要是通过存储器映射的方式来实现:即上电后

中断&异常

五迷三道 提交于 2020-01-16 04:00:33
中断分类      类别 原因 返回行为 例子 广义 中断 异步中断 ( 狭义中断 ) 中断 ( interrupt) 可屏蔽中断 来自 I/O 设备的信号 总是返回到下一条指令 所有的 IRQ 中断 不可屏蔽中断 电源掉电和物理存储器奇偶校验 同步中断 ( 也称异常 ) 陷阱 (trap) 有意的异常 总是返回到下一条指令 系统调用、信号机制 ( 通过软中断实现 ) 故障 (fault) 潜在可恢复的错误 返回到当前指令 缺页异常、除 0 错误、段错误 终止 (abort) 不可恢复的错误 不会返回 硬件错误 注: 80386有两根引脚INTR和NMI接受外部中断请求信号,INTR接受可屏蔽中断请求。在80386中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。 中断的定义( wikipedia ) 中断 是指由于接收到来自外围硬件(相对于 中央处理器 和 内存 )的 异步 信号或来自 软件 的 同步 信号,而进行相应的硬件/软件处理。硬件中断导致处理器通过 一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令(汇编中的int 指令),以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。软中断陷入内核,常被用于实现系统调用(int 80等)。

IDT 中断描述符表

≡放荡痞女 提交于 2020-01-08 00:44:52
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。 IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。 中断描述符表IDT和寄存器IDTR LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前 特权级 CPL 是0的代码执行,通常被用于创建IDT时的操作 系统初始化 代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。   如果中断或异常向量引用的描述符超过了IDT的界限

stm32启动文件分析

一个人想着一个人 提交于 2019-12-24 02:02:39
这篇文章主要是分析stm32启动文件,启动文件是由汇编编写的,文件名为startup_stm32f40_41xxx.s。 启动文件做的工作: 启动文件最主要的功能就是初始化堆栈指针sp,执行复位程序进入C语言main函数 1.初始化堆栈空间大小,定义栈顶位置、堆起始位置等等 2.定义中断向量表,初始化sp指针 3.Reset_Handler复位函数定义 4.配置系统时钟,进入main函数 具体代码分析 Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp 在MDK帮助文档中可以查到EQU是宏定义的伪指令,它的作用就相当于C语言中的define,首先定义栈大小为1KB(0x00000400)。 栈的作用主要保存函数中的局部变量,函数调用过程中的形参,返回地址,因此在函数中如果有较多的局部变量,大型数组最好不要放在函数中定义,在这种情况下就要考虑栈大小是否充足,如果栈溢出了,那程序会出现跑飞,找不到返回地址。 AREA是告诉编译器汇编一个代码段或者数据段,STACK 表示段名,这个可以任意命名; NOINIT 表示不初始化; READWRITE 表示可读可写, ALIGN=3,表示按照 2^3对齐,即 8 字节对齐。

汇编语言||8086/88的中断向量表

蓝咒 提交于 2019-12-22 19:25:07
中断向量表: 用来存放中断码对应中断处理程序的入口地址,一个地址包括段地址和偏移地址,高地址存放段地址,低地址存放偏移地址 需要四个字节来存储中断处理程序的入口地址,256个中断信号处理程序需要1024个字节来存储 8086CPU中断向量表存放在0地址处开始的1024个存储单元中,地址为0000:0000~0000:03FF 来源: CSDN 作者: Jock.Liu 链接: https://blog.csdn.net/JockLiu/article/details/103654836

IDT 中断描述符表

拜拜、爱过 提交于 2019-12-09 13:58:52
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。 IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。 中断描述符表IDT和寄存器IDTR LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前 特权级 CPL 是0的代码执行,通常被用于创建IDT时的操作 系统初始化 代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。   如果中断或异常向量引用的描述符超过了IDT的界限

Cortex-M0 & LPC11U 中断向量

大城市里の小女人 提交于 2019-12-05 05:05:36
1.异常分类及地址 Cortex-M0 中断向量表地址固定为0x00000000,向量表大小为48*4字节,其中: 0 处放的是main stack的初始化sp指 1~15 是内核自己使用的excption 16~47 是外设使用 Reset:芯片复位时从Reset存放的地址开始执行。 NMI: 不可屏蔽中断,优先级最高,不会被抢断,不能被屏蔽。 HardFault: 操作过程中出错时产生。 SVCall: 系统调用,由SVC指令触发。应用于OS中call内核函数或者驱动。 PendSV:中断驱动的系统级服务。应用于OS中任务切换。 SysTick: 系统定时器触发。应用于OS Tick。 IRQ:可用于芯片的其它外设中断。例如I2C,USB等等.. 2.异常的优先级: 3. Cortex-M0 中断特点 支持4个优先级。 出入中断的现场保护由硬件完成。 末尾连锁 — 这个机制加速了异常的处理。当一个异常处理程序结束时,如果一个挂起的异常满足异常进入的要求,就跳过堆栈弹出,控制权移交给新的异常处理程序。 迟来(Late-arriving) — 这个机制加速了抢占的处理。如果一个高优先级的异常在前个异常正在保存状态的过程中出现,处理器就转去处理更高优先级的异常。状态保存不受迟来异常的影响,因为两个异常保存的状态相同。从迟来异常的常处理程序返回时,要遵守正常的末尾连锁规则。

stm32F105RC6 U盘升级实验 跳转APP后中断出错问题

匿名 (未验证) 提交于 2019-12-03 00:26:01
最近在做STM32F105的U盘升级功能,其中bootloader中的FLASH写入,APP跳转等均参考了正点原子的F1串口IAP实验。值得注意的是F103的USB是不带HOST功能的,上次做的INIT Kit小板就使用了103的芯片,导致没办法加U盘升级功能。 在移植好USB Host 功能后(F1的usb打算后续专门写一篇,这里就不介绍移植的工作了),移植FATFS文件系统,然后测试能够成功识别U盘,挂载文件系统,打开关闭文件等。U盘升级实际上就是通过USB host功能,从U盘的指定文件中读取KEIL生产的.bin文件,然后写入32内部FLASH。如果USB Host功能没问题后,基本上就剩下APP程序中断向量表的偏移了。 这次项目进行过程中,Bootloader程序完成后,发现在跳转到APP程序后会进入Default_Handler这个错误中断里。并且是0X8000000的地址的Default_Handler(APP程序从0x8010000开始,有APP自己的中断向量表)。在APP程序中已经设置了如下代码的地址偏移,并且Keil中也都设置过了。.map文件的也能看到地址已经变了。 SCB->VTOR = FLASH_BASE | 0x10000; 在跳转程序前,使用__disable_irq()关闭所有中断则不会进入Default_Handler,但是如果在APP程序中使用