中断向量表
- 格式:doc
- 大小:45.00 KB
- 文档页数:6
关于STM32 中断向量表的位置、重定向问题首先我们需要跳到main 函数,这个就不多说了。
那么,中断发生后,又是怎么跑到中断入口地址的呢?从stm32f10x.s 可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE 区(假设STM32 从FLASH 启动,则此中断向量表起始地址即为0x8000000)EXPORT __Vectors IMPORT OS_CPU_SysTickHandler IMPORT OS_CPU_PendSVHandler__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler 这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU 找入口地址就靠它了,bin 文件开头就是他们的地址,参考手册RM0008 的10.1.2 节可以看到排列。
我们再结合CORTEX-M3的特性,他上电后根据boot 引脚来决定PC 位置,比如boot 设置为flash 启动,则启动后PC 跳到0x08000000。
此时CPU 会先取2 个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。
那么这个reset_handler 的实际地址是多少.?下面的一堆例如Nmi_handler 地址又是多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。
1.什么是中断?什么是中断向量?中断向量表的地址范围?答:中断就是CPU在执行当前程序时由于内外部事件引起CPU暂时停止当前正在执行的程序而转向执行请求CPU暂时停止的内外部事件的服务程序,该程序处理完后又返回继续执行被停止的程序;中断向量是中断处理子程序的入口地址;地址范围是00000H-003FFH。
2.3.微机系统的硬件由哪几部分组成?答:微型计算机(微处理器,存储器,I/0接口,系统总线),外围设备,电源。
4.什么是微机的总线,分为哪三组?答:是传递信息的一组公用导线。
分三组:地址总线,数据总线,控制总线。
5.8086/8088CPU的内部结构分为哪两大模块,各自的主要功能是什么?答:总线接口部件(BIU)功能:根据执行单元EU的请求完成CPU与存储器或IO 设备之间的数据传送。
执行部件(EU),作用:从指令对列中取出指令,对指令进行译码,发出相应的传送数据或算术的控制信号接受由总线接口部件传送来的数据或把数据传送到总线接口部件进行算术运算。
6.8086指令队列的作用是什么?答:作用是:在执行指令的同时从内存中取了一条指令或下几条指令,取来的指令放在指令队列中这样它就不需要象以往的计算机那样让CPU轮番进行取指和执行的工作,从而提高CPU的利用率。
7.8086的存储器空间最大可以为多少?怎样用16位寄存器实现对20位地址的寻址?完成逻辑地址到物理地址转换的部件是什么?答:8086的存储器空间最大可以为2^20(1MB);8086计算机引入了分段管理机制,当CPU寻址某个存储单元时,先将段寄存器内的内容左移4位,然后加上指令中提供的16位偏移地址形成20位物理地址。
8.段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少?指向这一物理地址的CS值和IP值是唯一的吗?答:指令的物理地址为21F00H;CS值和IP值不是唯一的,例如:CS=2100H,IP=0F00H。
C中断向量:#if defined(_ICC_A VR_) // "ICCA VR 编译器"条件编译开始/*==================================================================== ==================中断向量定义====================================================================== ================*/#define IT_RESET 1// 外部引脚、上电复位、掉电检测复位、看门狗复位、以及 JTAG A VR 复位中断向量#define IT_INT0 2 // 外部中断请求0中断向量#define IT_INT1 3 // 外部中断请求1中断向量#define IT_TIMER2_COMP 4 // 定时器/计数器2比较匹配中断向量#define IT_TIMER2_OVF 5 // 定时器/计数器2溢出中断向量#define IT_TIMER1_CAPT 6 // 定时器/计数器1输入捕获中断向量#define IT_TIMER1_COMPA 7 // 定时器/计数器1A比较匹配中断向量#define IT_TIMER1_COMPB 8 // 定时器/计数器1B比较匹配中断向量#define IT_TIMER1_OVF 9 // 定时器/计数器1溢出中断向量#define IT_TIMER0_OVF 10 // 定时器/计数器0溢出中断向量#define IT_SPI_STC 11 // SPI串行传输结束中断向量#define IT_USART_RXC 12 // USART接收结束中断向量#define IT_USART_UDRE 13 // USART数据寄存器空中断向量#define IT_USART_TXC 14 // USART传送结束中断向量#define IT_ADC 15 // ADC转换结束中断向量#define IT_EE_RDY 16 // EEPROM就绪中断向量#define IT_ANA_COMP 17 // 模拟比较器中断向量#define IT_TWI 18 // 两线串行接口中断向量#define IT_INT2 19 // 外部中断请求2中断向量#define IT_TIMER0_COMP 20 // 定时器/计数器0比较匹配中断向量#define IT_SPM_RDY 21 // 保存程序存储器内容就绪中断向量#endif // "_ICC_A VR_" 条件编译结束#if defined(_CodeVision_A VR_) // "CodeV ision A VR C 编译器"条件编译开始#define EXT_INT0 2 // 外部中断请求0中断向量#define EXT_INT1 3 // 外部中断请求1中断向量#define TIM2_COMP 4 // 定时器/计数器2比较匹配中断向量#define TIM2_OVF 5 // 定时器/计数器2溢出中断向量#define TIM1_CAPT 6 // 定时器/计数器1输入捕获中断向量#define TIM1_COMPA 7 // 定时器/计数器1A比较匹配中断向量#define TIM1_COMPB 8 // 定时器/计数器1B比较匹配中断向量#define TIM1_OVF 9 // 定时器/计数器1溢出中断向量#define TIM0_OVF 10 // 定时器/计数器0溢出中断向量#define SPI_STC 11 // SPI串行传输结束中断向量#define USART_RXC 12 // USART接收结束中断向量#define USART_DRE 13 // USART数据寄存器空中断向量#define USART_TXC 14 // USART传送结束中断向量#define ADC_INT 15 // ADC转换结束中断向量#define EE_RDY 16 // EEPROM就绪中断向量#define ANA_COMP 17 // 模拟比较器中断向量#define TWI 18 // 两线串行接口中断向量#define EXT_INT2 19 // 外部中断请求2中断向量#define TIM0_COMP 20 // 定时器/计数器0比较匹配中断向量#define SPM_READY 21 // 保存程序存储器内容就绪中断向量#endif // "defined(_CodeVision_A VR_)" 条件编译结束#if defined(_IAR_EW_A VR_) // "IAR Embedded Workbench A VR 编译器"条件编译开始#define RESET_vect (0x00)// 外部引脚、上电复位、掉电检测复位、看门狗复位、以及 JTAG A VR 复位中断向量#define INT0_vect (0x04) // 外部中断请求0中断向量#define INT1_vect (0x08) // 外部中断请求1中断向量#define TIMER2_COMP_vect (0x0C) // 定时器/计数器2比较匹配中断向量#define TIMER2_OVF_vect (0x10) // 定时器/计数器2溢出中断向量#define TIMER1_CAPT_vect (0x14) // 定时器/计数器1输入捕获中断向量#define TIMER1_COMPA_vect (0x18) // 定时器/计数器1A比较匹配中断向量#define TIMER1_COMPB_vect (0x1C) // 定时器/计数器1B比较匹配中断向量#define TIMER1_OVF_vect (0x20) // 定时器/计数器1溢出中断向量#define TIMER0_OVF_vect (0x24) // 定时器/计数器0溢出中断向量#define SPI_STC_vect (0x28) // SPI串行传输结束中断向量#define USART_RXC_vect (0x2C) // USART接收结束中断向量#define USART_UDRE_vect (0x30) // USART数据寄存器空中断向量#define USART_TXC_vect (0x34) // USART传送结束中断向量#define ADC_vect (0x38) // ADC转换结束中断向量#define EE_RDY_vect (0x3C) // EEPROM就绪中断向量#define ANA_COMP_vect (0x40) // 模拟比较器中断向量#define TWI_vect (0x44) // 两线串行接口中断向量#define INT2_vect (0x48) // 外部中断请求2向量#define TIMER0_COMP_vect (0x4C) // 定时器/计数器0比较匹配中断向量#define SPM_RDY_vect (0x50) // 保存程序存储器内容就绪中断向量#endif // "defined(_IAR_EW_A VR_)" 条件编译结束汇编语言中断向量:;************************************************************************* ;* 中断向量位置声明 *;************************************************************************* ;******** 中断向量地址定义:.equ INT0addr = 0x002 ;外部中断请求0向量地址.equ INT1addr = 0x004 ;外部中断请求1向量地址.equ OC2addr = 0x006 ;定时器/计数器2比较匹配中断向量地址.equ OVF2addr = 0x008 ;定时器/计数器2溢出中断向量地址.equ ICP1addr = 0x00a ;定时器/计数器1输入捕获中断向量地址.equ OC1Aaddr = 0x00c ;定时器/计数器1A比较匹配中断向量地址.equ OC1Baddr = 0x00e ;定时器/计数器1B比较匹配中断向量地址.equ OVF1addr = 0x010 ;定时器/计数器1溢出中断向量地址.equ OVF0addr = 0x012 ;定时器/计数器0溢出中断向量地址.equ SPIaddr = 0x014 ;SPI串行传输结束中断向量地址.equ URXCaddr = 0x016 ;USART接收结束中断向量地址.equ UDREaddr = 0x018 ;USART数据寄存器空中断向量地址.equ UTXCaddr = 0x01a ;USART传送结束中断向量地址.equ ADCCaddr = 0x01c ;ADC转换结束中断向量地址.equ ERDY addr = 0x01e ;EEPROM就绪中断向量地址.equ ACIaddr = 0x020 ;模拟比较器中断向量地址.equ TWIaddr = 0x022 ;两线串行接口中断向量地址.equ INT2addr = 0x024 ;外部中断请求2向量地址.equ OC0addr = 0x026 ;定时器/计数器0比较匹配中断向量地址.equ SPMRaddr = 0x028 ;保存程序存储器内容就绪中断向量地址。
c51语言处理单片机的中断是由专门的中断函数来处理的C51语言处理单片机的中断是由专门的中断函数来处理的。
中断是一种在程序执行过程中被外部事件触发的事件,它可以打断程序的正常执行,使得程序能够及时响应外部设备的请求。
C51语言中,中断函数是由程序员自定义的函数,用来处理中断事件。
当中断事件发生时,单片机会自动跳转到对应的中断函数进行处理。
中断函数通常包括以下几个部分:1.中断向量表:中断向量表是存储中断向量地址的表格。
每个中断向量对应一个中断类型,当中断事件发生时,单片机会根据中断类型找到对应的中断向量并跳转到相应的中断函数。
在C51语言中,中断向量表是通过设置中断向量地址的方式来定义的。
2.中断优先级:C51语言支持多级中断优先级,用来确定一些中断是否可以打断另一个中断的执行。
中断优先级可以通过设置特定的寄存器来实现,具体优先级的设置需要根据实际应用场景来确定。
3.中断服务程序:中断服务程序是中断函数的核心部分,用来处理中断事件。
在中断服务程序中,通常会进行以下几个步骤:a.保存现场:在进入中断服务程序之前,需要保存当前程序的执行状态,包括各个寄存器的值、堆栈指针等。
这样可以保证在中断处理完成后,程序能够正确地返回到中断发生前的执行状态。
b.清除中断标志:在进入中断服务程序之前,需要将中断标志位清除,以防止重复触发中断。
中断标志位通常是由硬件自动设置的,在中断服务程序中需要手动清除。
c.执行中断处理逻辑:在中断服务程序中,可以编写相应的逻辑代码来处理中断事件。
这可以包括读取外部设备的数据、进行数据处理、发送数据等。
中断服务程序中的代码需要尽量简洁高效,以确保及时响应外部事件。
d.恢复现场:在中断服务程序执行完成后,需要恢复之前保存的执行状态,包括恢复各个寄存器的值、堆栈指针等。
这样可以保证程序能够正确地返回到中断发生前的执行状态。
4.中断返回指令:在中断服务程序执行完成后,需要使用特定的指令来返回到主程序的执行位置。
STM32 学习记录12 中断向量表从stm32f10x.s 可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如:AREA RESET, DATA, READONLY ;定义只读数据段,实际上是在CODE 区(假设STM32 从FLASH 启动,则此中断向量表起始地址即为0x8000000)EXPORT__VectorsIMPORT OS_CPU_SysTickHandler IMPORTOS_CPU_PendSVHandler__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler这个向量表的编写是有讲究的,跟硬件一一对应不能乱写的,CPU 找入口地址就靠它了,bin 文件开头就是他们的地址,参考手册RM0008 的10.1.2 节可以看到排列。
我们再结合CORTEX-M3 的特性,他上电后根据boot 引脚来决定PC 位置,比如boot 设置为flash 启动,则启动后PC 跳到0x08000000。
此时CPU 会先取2 个地址,第一个是栈顶地址,第二个是复位异常地址,故有了上面的写法,这样就跳到reset_handler。
那么这个reset_handler 的实际地址是多少.?下面的一堆例如Nmi_handler 地址又是多少呢?发生中断是怎么跑到这个地址的呢?下面挨个讲解。
8.4 BIOS中断调用8.4.1 BIOS中断调用概述BIOS (BasicInput/OutputSystem)是IBM-PC机的监控程序,它固化在微型机主板的ROM中,其内容主要有系统测试程序 (Post)、初始化引导程序(Boot)、I/O设备的基本驱动程序和许多常用程序模块,它们一般以中断服务程序的形式存在。
例如,负责显示输出的显示 I/O程序为10H号中断服务程序;负责打印输出的打印I/O程序为17H中断服务程序等。
图8.5 是用户程序和操作系统关系示意图,由图可见BIOS程序直接建立在硬件基础上,磁盘操作系统(DOS)和其他操作系统建立在BIOS基础上,各种高级语言 则建立在操作系统基础上。
用户程序可以使用高级语言,也可以调用DOS 或其他操作系统,还可以调用BIOS,甚至直接指挥硬件设备。
通常应用程序调用DOS提供的系统功能,完成输入/输出或其他操作,这样做用户可以少考虑硬件,实现起来容易。
图8.5 用户程序和操作系统关系示意图应用程序直接对硬件编程的优点是程序的效率高,缺点是需要程序员对硬件性能有较深的了解。
总的来说,编程复杂,所以一般不直接对硬件编程。
BIOS中断程序处于DOS功能调用和硬件环境之间。
和DOS功能调用相比其优点是效率高,缺点是编程相对复杂;和直接对硬件编程相比,优点是实现相对容易,缺点是效率相对低。
在下列情况下可考虑使用BIOS中断:(1)有些功能DOS没有提供,但BIOS提供了;(2)有些场合无法使用DOS功能调用;(3)其他原因。
8.4.2BIOS中断调用方法BIOS的调用实际上是利用每一台计算机中BIOS固有的I/O操作程序来方便地解决自己的问题,由于这些已经在计算机中了,故使用时不必要再把它写入自己的程序,只要指明它的操作位置就可以了。
1.BIOS调用的基本操作由于BIOS中的每一种功能调用往往包含不同的几个操作细节,因此调用时需要说明三部分,基本步骤为:(1)设置分功能号。
中断向量表中断向量表是DSP程序的重要组成部分,当有中断发生并且处于允许状态时,程序指针跳转到中断向量表中对应的中断地址。
由于中断服务程序一般较长,通常中断向量表存放的是一个跳转指令,指向实际的中断服务程序。
下面是5402中断向量表的一个范例,可以作为模板,使用时稍作修改就行:******************************************************************5402Vectors.asm*完整的5402中断向量表示例*5402共有30个中断向量,每个向量占4个字的空间。
*使用向量一般用一条跳转指令转到相应中断服务子程序,其余空位用NOP填充*未使用的向量直接用RETE返回,是为了防止意外进入未用中断。
*****************************************************************.sect ".vectors" ;开始命名段.vecotrs.global CodeStart ;引用程序入口的全局符号定义…;引用其它中断程序入口的全局符号定义.align 0x80 ;中断向量表必须对齐128字的页边界RESET: B CodeStart; Reset中断向量,跳转到程序入口NOP ;用NOP填充表中其余空字NOP ;B指令占了两个字,所以要填两个NOPNMI: RETE ;不可屏蔽中断NOPNOPNOP; 软件中断SINT17 .space 4*16 ;软件中断使用较少,简单起见用0填充SINT18 .space 4*16SINT19 .space 4*16SINT20 .space 4*16SINT21 .space 4*16SINT22 .space 4*16SINT23 .space 4*16SINT24 .space 4*16SINT25 .space 4*16SINT26 .space 4*16SINT27 .space 4*16SINT28 .space 4*16SINT29 .space 4*16SINT30 .space 4*16INT0: RETE ;外部中断INT0NOPNOPINT1: RETE ;外部中断INT1NOPNOPNOPINT2: RETE ;外部中断INT2NOPNOPNOPTINT: RETE ;Timer0中断NOPNOPNOPBRINT0: RETE ;McBSP #0 接收中断NOPNOPNOPBXINT0: RETE ;McBSP #0 发送中断NOPNOPNOPDMAC0: RETE ;无定义(默认)DMA0中断NOPNOPNOPTINT1: RETE ;Timer1中断(默认)或DMA1中断. NOPNOPNOPINT3: RETE ;外部中断3NOPNOPNOPHPINT: RETE ;HPI中断NOPNOPBRINT1: RETE ;McBSP #1接收中断(默认)或DMA2中断NOPNOPNOPBXINT1: RETE ;McBSP #1发送中断(默认)或DMA3中断NOPNOPNOPDMAC4: RETE ;DMA4中断NOPNOPNOPDMAC5: RETE ;DMA5中断NOPNOPNOP.end*vectors.asm for 方波发生*在本实验中只要把在开头加上中断子程序标号的引用,并在中断表的TINT部分换成跳转指令就行了:.sect ".vectors" ;开始命名段.vecotrs.global CodeStart ;引用程序入口的全局符号定义.global TINT0_ISR ;引用Timer0中断子程序<节省篇幅,中间省略>TINT: B TINT0_ISR ;Timer0中断NOPNOPBRINT0: RETE ;McBSP #0 receive interrupt<节省篇幅,下略>技巧提示:只有第一个中断(Reset中断)是每个程序都应该有的,在不需要其它中断的情况下,可以只用这一部分,后面可以省略。
简述中断向量表及其作用
中断向量表简称IV,是计算机科学家用来提高安全性的一种工具。
例如,它可以在加密算法中起到重要作用,如Twofish、AES等,也可以应用于网络安全领域,如IPsec等。
IV表示一个有序的、可复制的、用于加密数据的“许可”,并且它是加密算法中不可或缺的一部分。
从定义上讲,中断向量表(IV)是一个特定大小的字符串,它是在特定的加密算法中用于装入加密轮的。
其作用是,在特定时刻,根据用于初始化加密轮的IV值确定每一轮加密的起始位置,从而阻止恢复秘密。
IV的大小一般为8个字节,也可以是16个字节或更多,取决于所采用的加密算法的复杂性。
对安全来说,IV的最重要作用是防止重放攻击(Replay attack),该攻击是指攻击者可以抓取加密后的数据,然后重复发送以实现一定的目的。
IV为被加密数据添加额外的随机性,从而使相同的明文加密后产生的不同的密文,从而防止重放攻击。
IV的另一种重要作用是它可以防止解密并重新加密的攻击(Decrypt and reencrypt attack),也就是攻击者可以解密用户的数据,然后重新加密,使用自己的密钥。
IV为加密轮提供了足够的随机性,使得攻击者无法确定哪一轮会加密和解密,从而影响重新加密的行为,因此可以有效防止此类攻击。
因此,中断向量表是计算机科学家最常用的工具之一,具有重要的安全作用,是防止重放攻击和解密重新加密攻击的重要组成部分。
它的大小一般在8-16个字节左右,根据不同的算法有所不同,但是IV都是加密算法的一部分,而且也是加密软件一般都会使用的安全技术。
中断向量表中断向量地址⼀览表⼀、8088中断向量0-3 4-7 8-B C-F 10-13 14-17 18-1F123456,7除以零单步(⽤于DEBUG)⾮屏蔽中断断点指令溢出打印屏幕保留⼆、8259中断向量20-23 24-27 28-2B 2C-2F 30-33 34-37 38-3B 3C-3F 89ABCDEF定时器键盘彩⾊/图形异步通讯(secondary)异步通讯(primary)硬磁盘软磁盘并⾏打印机三、BIOS中断40-43 44-47 48-4B 4C-4F 50-53 54-57 58-5B 5C-5F 60-63 64-67 68-6B 101112131415161718191A屏幕显⽰设备检验测定存储器容量磁盘I/O串⾏通讯⼝I/O盒式磁带I/O键盘输⼊打印机输出BASIC⼊⼝代码引导装⼊程序⽇时钟四、提供给⽤户的中断6C-6F 70-731B1CCtrl-Break控制的软中断定时器控制的软中断五、数据表指针74-77 78-7B 7C-7F 1D1E1F显⽰器参量表软盘参数表图形表六、中断80-83 84-87 88-8B 8C-8F 20212223程序结束系统功能调⽤结束退出Ctrl-Break退出90-93 94-97 98-9B 9C-9F A0-BB BC-BF C0-FF2425262728-2E2F30-3F严重错误处理绝对磁盘读功能绝对磁盘写驻留退出DOS保留打印机DOS保留七、BASIC中断100-17F 180-19F 1A0-1FF 200-217 218-3C3 3C4-3FF 40-5F60-6768-7F80-8586-F0F1-FF保留⽤户软中断保留由BASIC保留BASIC中断保留DOS功能调⽤* AH=0-2E适⽤DOS1.0以上版本;*AH=2F-57适⽤DOS2.0以上版本;*AH=58-62适⽤DOS3.0以上版本.BIOS中断INT AH功能调⽤参数返回参数100设置显⽰⽅式AL=00 40*25⿊⽩⽅式=01 40*25彩⾊⽅式=02 80*25⿊⽩⽅式=03 80*25彩⾊⽅式=04 320*200彩⾊图形⽅式=05 320*200⿊⽩图形⽅式=06 640*200⿊⽩图形⽅式=07 80*25单⾊⽂本⽅式=08 160*200 16⾊图形=09 320*200 16⾊图形=0A 640*200 16⾊图形=0B 保留(EGA)=0C 保留(EGA)=0D 320*200彩⾊图形(EGA)=0E 640*200彩⾊图形(EGA)=0F 640*350⿊⽩图形(EGA)=10 640*350彩⾊图形(EGA)=11 640*480单⾊图形(EGA)=12 640*480 16⾊图形(EGA)=13 320*200 256⾊图形(EGA)=40 80*30彩⾊⽂本(CGE400)=41 80*50彩⾊⽂本(CGE400)=42 640*400彩⾊⽂本(CGE400)101置光标类型(CH)0-3=光标起始⾏(CL)0-3=光标结束⾏102置光标位置BH=页号,DH,DL=⾏,列103读光标位置BH=页号CH=光标起始⾏,DH,DL=⾏,列104读光笔位置AH=0光笔未触发,=1光笔触发CH=象素⾏, BX=象素列,DH=字符⾏,DL=字符列105置显⽰页AL=页号106屏幕初始化或上卷AL=上卷⾏数,AL=0整个窗⼝空⽩BH=卷⼊⾏属性,CH=左上⾓⾏号,CL=左上⾓列号,CH=右下⾓⾏号,DL=右下⾓列号107屏幕初始化或下卷AL=下卷⾏数,AL=0整个窗⼝空⽩BH=卷⼊⾏属性,CH=左上⾓⾏号,CL=左上⾓列号,DH=右下⾓⾏号,DL=右下⾓列号108读光标位置的字符和属性BH=显⽰页AH=属性,AL=字符109在光标位置显⽰字符及其属性BH=显⽰页,AL=字符,BL=属性CX=字符重复次数10A在光标位置显⽰字符BH=显⽰页,AL=字符CX=字符重复次数10B置彩⾊调板(320*200图形)BH=彩⾊调板IDBL=和ID配套使⽤的颜⾊10C写象素DX=⾏(0-199) CX=列(0-639)AL=象素值10D读象素DX=⾏(0-199) CX=列(0-639)AL=象素值10E显⽰字符(光标前移)AL=字符,BL=前景⾊10F取当前显⽰⽅式AH=字符列数,AL=显⽰⽅式1013显⽰字符串(适⽤AT)ES:BP=串地址,CX=串长度DH,DL=起始⾏,列,BH=页号AL=0,BL=属性串:char,char...AL=1,BL=属性串:char,char...AL=2 光标返回起始位置 光标跟随移动光标返回起始位置AL=2串:char,attr,char, attr,... AL=3串:char,attr,char,attr,...光标返回起始位置 光标跟随移动11设备检验AX=返回值bit0=1,配有磁盘bit1=1,80287协处理器bit4,5=01,40*25BW(彩⾊板)=10,80*25BW(彩⾊板)=11,80*25BW(⿊⽩板)bit6,7=软盘驱动器号bit9,10,11= RS-232板号bit12=游戏适配器bit13=串⾏打印机bit14,15=打印机号12测定存储器容量AX=字节数(KB)130软盘系统复位131读软盘状态AL=状态字节132读磁盘AL=扇区数CH,CL=磁道号,扇区号DH,DL=磁头号,驱动器号ES:BX=数据缓冲区地址读成功:AH=0AL=读取的扇区数读失败:AH=出错代码133写磁盘同上写成功:AH=0 AL=写⼊的扇区数写失败: AH=出错代码134检验磁盘扇区同上(ES:BX不设置)成功:AH=0 AL=检验的扇区数失败:AH=出错代码135格式化盘磁道ES:BX=磁道地址成功:AH=0 失败:AH=出错代码140初始化串⾏通讯⼝AL= 初始化参数DX=通讯⼝号(0,1)AH = 通讯⼝状态AL = 调制解调器状态141向串⾏通讯⼝写字符AL=字符,DX=通讯⼝号(0,1)写成功:(AH)7=0写失败:(AH)7=1(AH)0-5=通讯⼝状态142从串⾏通讯⼝读字符DX=通讯⼝号(0,1)读成功:(AH)7=0,(AL)=字符读失败:(AH)7=1,(AH)0-6=通讯⼝状态143取通讯⼝状态DX=通讯⼝号(0,1)AH=通讯⼝状态AL=调制解调器状态150启动盒式磁带马达151停⽌盒式磁带马达152磁带分块读ES:BX=数据转输区地址AH=状态字节CX=字节数AH=00读成功,=01冗余检验错=02⽆数据传输,=04⽆引导,=80⾮法命令AH=状态字节(同上)153磁带分块写DS:BX=数据传输区地址CX=字节数160从键盘读字符AL=字符码,AH=扫描码161读键盘缓冲区字符ZF=0 AL=字符码,AH=扫描码ZF=1 缓冲区空162取键盘状态字节AL=键盘状态字节170打印字符,回送状态字节AL=字符,DX=打印机号AH=打印机状态字节DX=打印机号AH=打印机状态字节171初始化打印机,回送状态字节172取状态字节DX=打印机号AH=打印机状态字节1A0读时钟CH:CL=时:分DH:DL=秒:1/100秒1A1置时钟CH:CL=时:分,DH:DL=秒:1/100秒1A2读实时钟CH:CL=时:分(BCD)DH:DL=秒:1/100秒(BCD)1A6置报警时间CH:CL=时:分(BCD)DH:DL=秒:1/100秒(BCD)1A7清除报警。
软硬中断以及中断向量表概述中断(英语:Interrupt)是指处理器接收到来⾃硬件或软件的信号,提⽰发⽣了某个事件,应该被处理器注意,这种情况就称为中断。
通常,在接收到来⾃外围硬件(相对于中央处理器和内存)的异步信号,或来⾃软件的同步信号之后,处理器将会进⾏相应的硬件/软件处理。
发出这样的信号称为进⾏中断请求(interrupt request,IRQ)。
硬件中断导致处理器通过⼀个运⾏信息切换(context switch,也叫上下⽂切换)来保存执⾏状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的⼀个指令,以可编程的⽅式直接指⽰这种运⾏信息切换,并将处理导向⼀段中断处理代码。
中断在计算机多任务处理,尤其是即时系统中尤为有⽤。
这样的系统,包括运⾏于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
中断是⽤以提⾼计算机⼯作效率、增强计算机功能的⼀项重要技术。
最初引⼊硬件中断,只是出于性能上的考量。
如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进⾏忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。
这就造成了⼤量处理器周期被浪费。
引⼊中断以后,当处理器发出设备请求后就可以⽴即返回以处理其他任务,⽽当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。
这样,在设备进⾏处理的周期内,处理器可以执⾏其他⼀些有意义的⼯作,⽽只付出⼀些很⼩的切换所引发的时间代价。
后来被⽤于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个⽅⾯,并产⽣通过软件⽅式进⼊中断处理(软中断)的概念。
在硬件实现上,中断可以是⼀个包含控制线路的独⽴系统,也可以被集成进存储器⼦系统中。
对于前者,在IBM个⼈机上,⼴泛使⽤(Programmable Interrupt Controller,PIC)来负责中断响应和处理。
二级中断向量表的汇编指令在 x86 架构中,二级中断向量表(Secondary Interrupt Vector Table,SIVT)是一个特殊的中断向量表,它由一系列指令描述,用于处理某些高级别的硬件异常或操作系统异常。
以下是用汇编指令定义 SIVT 的示例:```assemblysivt_start: ; SIVT 的起始位置dw sivt_size - 1 ; SIVT 的长度 - 1dd sivt_entry0 ; SIVT 中断入口 0dd sivt_entry1 ; SIVT 中断入口 1dd sivt_entry2 ; SIVT 中断入口 2; 其他中断入口...sivt_entry0:push ax ; 保存寄存器状态push bxpush cx; 处理中断事件...pop cx ; 恢复寄存器状态pop bxpop axiret ; 返回中断处理前的状态sivt_entry1:; 处理中断事件...sivt_entry2:; 处理中断事件...; 其他中断入口...sivt_size equ ($ - sivt_start) ; 计算 SIVT 的长度```在这个示例中,SIVT 的起始地址是 `sivt_start`,长度是 `sivt_size`,其中每个中断入口对应一个数据段 `dd`,后面跟着实际的处理代码。
当硬件或操作系统触发一个 SIVT 中的中断时,CPU 会跳转到相应的中断入口,执行相应的处理代码。
注意,处理代码需要保存当前 CPU 的状态,并在处理完成后恢复状态,最后使用 `iret` 指令返回到中断处理前的状态。
中断向量表单片机的程序一般情况下上电之后是从0x0地址开始运行的,而0x0后面是关于硬件的一些对应的中断的入口地址。
所以中断向量表其实就是硬件查表跳转表,相当于C语言的switch 语句。
如:Switch(i){Case 0: goto reset;Case 1: goto int0 ;….}关于I的值就是硬件给出的中断向量。
2406中断向量表:.ref _bad_trap.ref _c_int0.sect "vectors" ;自定义段名_vector: ;向量表地址标识RSVECT B _c_int0 ;C项目初始化入口地址INT1 B _bad_trap ;没有用到的中断跳转到非法中断陷阱INT2 B _bad_trapINT3 B _PM6 ;有用到的中断,则写其实际中断的地址或标号INT4 B _bad_trap ; PM 8 Int level 4 7INT5 B _bad_trap ; PM A Int level 5 8INT6 B _bad_trap ; PM C Int level 6 9……..endPAGE 0 : /* program memory */VECS: origin = 00000h, length = 0007Fhvectors : > VECS PAGE = 0这样就可以把中断向量表写到正确的地址。
.ref _bad_trap 这个标号外部没有定义,为什么还用.ref,而不是用..global?因为_bad_trap在这里只是声明函数,它实际函数可能是.C文件里的bad_trap()函数。
CPU中断向量地址和外设中断向量PIV有什么不同?什么是外设中断向量PIV?一个CPU中断包括好几个外设中断,如INT1包括了PDPINTA、PDPINTB、ADCINT、XINT1、XINT2、SPIINT、RXINT、TXINT、CANMBINT、CANERINT。
本节主题中断向量表的结构这部分内容与操作系统高度重合,建议两块儿结合来看,选择、大题高频考点!北京大学·慕课计算机组成制作人:陆俊林中断和异常处理的起源第一个带有异常处理的系统:UNIVAC,1951年◦算术运算溢出时:转向地址0执行两条修复指令,或者停机◦1955年,UNIVAC1103增加了外部中断,用于风洞数据的实时收集UNIVAC:每秒10万次加法,主频2.25MHzIntel 8086(1978年)8086的主要特点①对外有16根数据线内部有四个16位通用寄存器既能处理16位数据,也能处理8位数据②对外有20根地址线可寻址的内存空间为1MB③物理地址的形成采用“段加偏移”的方式④存储器中保留两个专用区域•中断向量表区:00000H~003FFH(地址最低的1KB)•初始化程序区:FFFF0H~FFFFFH(地址最高的16B)实模式下的存储器地址空间地址范围:00000H~FFFFFH,共1M字节存储器地址存储器说明FFFFFH专用区(16字节):初始化代码区CPU复位后从地址FFFF0H取出第一条指令,通常是一条无条件转移指令,转移到系统程序的入口处FFFF0HFFFEFH通用区用来存储一般的程序指令和数据00400H003FFH专用区(1 K字节):中断向量表区存放256个中断服务程序的入口地址(也称中断向量),每个入口地址占4个字节单元00000H中断向量(interrupt vector )中断向量:中断服务程序的入口地址每个中断类型对应一个中断向量(4字节)◦前两个字节单元存放中断服务程序入口地址的偏移量(IP ),低字节在前,高字节在后◦后两个字节单元存放中断服务程序入口地址的段基值(CS ),低字节在前,高字节在后4000H CS 3006H IP 40H00H30H06H 中断向量牢记。
中断向量表中断向量表是DSP程序的重要组成部分,当有中断发生并且处于允许状态时,程序指针跳转到中断向量表中对应的中断地址。
由于中断服务程序一般较长,通常中断向量表存放的是一个跳转指令,指向实际的中断服务程序。
下面是5402中断向量表的一个范例,可以作为模板,使用时稍作修改就行:******************************************************************5402Vectors.asm*完整的5402中断向量表示例*5402共有30个中断向量,每个向量占4个字的空间。
*使用向量一般用一条跳转指令转到相应中断服务子程序,其余空位用NOP填充*未使用的向量直接用RETE返回,是为了防止意外进入未用中断。
***************************************************************** .sect ".vectors" ;开始命名段.vecotrs.global CodeStart ;引用程序入口的全局符号定义…;引用其它中断程序入口的全局符号定义.align 0x80 ;中断向量表必须对齐128字的页边界RESET: B CodeStart; Reset中断向量,跳转到程序入口NOP ;用NOP填充表中其余空字NOP ;B指令占了两个字,所以要填两个NOPNMI: RETE ;不可屏蔽中断NOPNOPNOP; 软件中断SINT17 .space 4*16 ;软件中断使用较少,简单起见用0填充SINT18 .space 4*16SINT19 .space 4*16SINT20 .space 4*16SINT21 .space 4*16SINT22 .space 4*16SINT23 .space 4*16SINT24 .space 4*16SINT25 .space 4*16SINT26 .space 4*16SINT27 .space 4*16SINT28 .space 4*16SINT29 .space 4*16SINT30 .space 4*16INT0: RETE ;外部中断INT0NOPNOPNOPINT1: RETE ;外部中断INT1NOPNOPNOPINT2: RETE ;外部中断INT2NOPNOPNOPTINT: RETE ;Timer0中断NOPNOPNOPBRINT0: RETE ;McBSP #0 接收中断NOPNOPNOPBXINT0: RETE ;McBSP #0 发送中断NOPNOPNOPDMAC0: RETE ;无定义(默认)DMA0中断NOPNOPNOPTINT1: RETE ;Timer1中断(默认)或DMA1中断. NOPNOPNOPINT3: RETE ;外部中断3NOPNOPNOPHPINT: RETE ;HPI中断NOPNOPNOPBRINT1: RETE ;McBSP #1接收中断(默认)或DMA2中断NOPNOPNOPBXINT1: RETE ;McBSP #1发送中断(默认)或DMA3中断NOPNOPNOPDMAC4: RETE ;DMA4中断NOPNOPNOPDMAC5: RETE ;DMA5中断NOPNOPNOP.end在本实验中只要把在开头加上中断子程序标号的引用,并在中断表的TINT部分换成跳转指令就行了:*vectors.asm for 方波发生.sect ".vectors" ;开始命名段.vecotrs.global CodeStart ;引用程序入口的全局符号定义.global TINT0_ISR ;引用Timer0中断子程序<节省篇幅,中间省略>TINT: B TINT0_ISR ;Timer0中断NOPNOPBRINT0: RETE ;McBSP #0 receive interrupt<节省篇幅,下略>技巧提示:只有第一个中断(Reset中断)是每个程序都应该有的,在不需要其它中断的情况下,可以只用这一部分,后面可以省略。
如果只需要部分中断也可以按需设置,但必须保证所用中断在中断向量表的位置不变。
不熟悉中断向量表的情况下最好还是用这个完整中断向量表样例。
另外C5400系列中不同型号DSP的中断向量数量和在中断向量表中的位置有所不同,程序移植时需要查相应datasheet确认。
2.中断向量指针中断向量表的位置并没有强制的位置,可以在内部存贮器,也可以在外部存贮器。
但有一个要求:中断量表必须放在80H字长存贮块的起始处,即中断向量表的首地址的低7位必须全为0。
DSP 的寄存器PMST的高9位是中断向量表的指针IPTR。
其上电时默认是在FF80H处,这是为了运行固化在内部ROM 的上电加载程序。
由于FF80H是只读的,加载用户自定义的中断向量表时会报错。
这样需要重新设置IPTR的值,本书一般把它重定义到0080H(也可以用自定义的地址),并在程序开头重新设置一下IPTR的值:改变中断向量表位置K_IPTR .set 0080h ;指向0080H,默认是FF80LDM PMST,AAND #7FH,A ;保留低7位,清掉高位OR #K_IPTR,A ;将新值传到高9位STLM A,PMST ;修改PMST寄存器技巧指示:由于这段代码几乎每个程序都需要,可以单独存成一个文件:IPTR0080H.asm,然后在程序需要的地方用.copy或.include指令:.copy “IPTR0080H.asm”或:.include “IPTR0080H.asm”编译时就会自动把这段代码嵌到相应位置。
稍微要注意的是由于这一小段代码要用到累加器A,所以最好保证执行这段代码之前不要使用累加器A。
其它还有一些经常重复的代码,如初始化SP、DP、IPTR的代码都可以写在一个文件里include/copy进来。
注1:.copy和.inlucde指令效果是一样的,只是在生成程序列表时,.copy会把代码复制过来,而.include不会。
注2:文件名可以用路径,如果不用,则编译器会按下面的循序搜索:当前目录、编译选项指定的目录、环境变量指定的目录。
更多参考:1.关于中断:SPRU131 TMS320C54x DSP Reference Set, V olume 1: CPU and Peripherals,6.10 Interrupts2.关于定时器:SPRU131 TMS320C54x DSP Reference Set, V olume 1: CPU and Peripherals,8.4 Timer外部中断:频率计DSP有4个外部中断INT0-INT3,下降沿触发,实验箱的频率计使用的是INT3。
频率计的设计原理是:在设定时间下计外部中断INT3的次数,除以定时器的定时周期(也就是乘以定时器中断的触发频率),就得到外部脉冲频率。
实验箱上配有1.024k-262.144k共8档频率源,也可以外接频率源。
用跳线冒选择频率源,并接到INT3上。
下面的例程是定时器定时1s,在INT3中断服务子程序中计脉冲个数,到时则关闭中断。
脉冲计数结果显示到数码管上,即为以单位为Hz的频率值***********************************************频率计**********************************************.mmregs.global CodeStart.global TINT1_ISR.global INT3_ISR.include "../DefineIO.asm".dataDATA_DP:PulseCounter: .word 0;脉冲计数器Display: .word 0FH,0FH,0FH,0FH,0FH,0FH;存放数据管显示值,值F在数码管上不显示DotData: .word 000000B ;数码管的dot pointNumber10: .word 10 ;十六进制转BCD所除的10.textCodeStart:.copy "../SP_DP_IPTR.asm" ;初始化SP、DP和IPTR的代码段STM #99,AR1 ;10ms计数后再100分频STM #Display,AR3 ;定义数据管显示存贮区指针LD #0,A ;A用来计脉冲数SSBX INTM ;关中断CALL Timer1Init ;初始化Timer1STM #110000000B,IMR ;允许Timer1和INT3中断STM #0FFH,IFR ;清除挂起的中断RSBX INTM ;开中断wait: B wait;****************************************外部中断子程序***************************************INT3_ISR:ADD #1,A ;计中断次数RETE****************************************定时器中断子程序***************************************TINT1_ISR:BANZ GoOnCount,*AR1- ;测量次数计数器减1,次数为0就中止计数STM #0,IMR ;取消所有中断HEX2BCD: ;把计数结果转成BCD码RPT #15SUBC Number10,ASTH A,*AR3+AND #0FFFFH,ABC HEX2BCD,ANEQ ;在数码管上显示结果STM #Display,AR3PORTW *AR3+,Digital0PORTW *AR3+,Digital1PORTW *AR3+,Digital2PORTW *AR3+,Digital3PORTW *AR3+,Digital4PORTW *AR3+,Digital5PORTW DotData,DotPointRETEGoOnCount: ;继续计数STM #1100001B,IFR ;清除挂起的中断RETE****************************************定时器初始化***************************************Timer1Init:;定时器1的寄存器地址TIM1 .set 0030h ;减1计数器PRD1 .set 0031h ;存放定时时间常数TCR1 .set 0032h ;定时器状态及控制寄存器****;F=50MHz, T=20ns*(1+15)*(1+3124)=20ns*16*31250=10ms****STM #010,TCR1 ;TSS置位停止TimerSTM #31249,PRD1STM #2FH,TCR1RET.end简单起见本例只能测一次,可以做一些改进,比如每隔1-2S自动重新测量,或者用按键来触发测量。