stm8S-stvd中断向量及注释

stm8S-stvd中断向量及注释
stm8S-stvd中断向量及注释

struct interrupt_vector const UserISR_IRQ[32] = {

{0x8200,(interrupt_handler_t)_stext}, // reset

{0x8200, (interrupt_handler_t)TRAP_IRQHandler}, // trap - Software interrupt

{0x8200, (interrupt_handler_t)TLI_IRQHandler}, // irq0 - External Top Level interrupt (TLI)

{0x8200, (interrupt_handler_t)AWU_IRQHandler}, // irq1 - Auto Wake Up from Halt interrupt

{0x8200, (interrupt_handler_t)CLK_IRQHandler}, // irq2 - Clock Controller interrupt

{0x8200, (interrupt_handler_t)EXTI_PORTA_IRQHandler}, // irq3 - External interrupt 0 (GPIOA)

{0x8200, (interrupt_handler_t)EXTI_PORTB_IRQHandler}, // irq4 - External interrupt 1 (GPIOB)

{0x8200, (interrupt_handler_t)EXTI_PORTC_IRQHandler}, // irq5 - External interrupt 2 (GPIOC)

{0x8200, (interrupt_handler_t)EXTI_PORTD_IRQHandler}, // irq6 - External interrupt 3 (GPIOD)

{0x8200, (interrupt_handler_t)EXTI_PORTE_IRQHandler},// irq7 - External interrupt 4 (GPIOE)

{0x8200, (interrupt_handler_t)CAN_RX_IRQHandler}, // irq8 - CAN Rx interrupt

{0x8200, (interrupt_handler_t)CAN_TX_IRQHandler}, // irq9 - CAN Tx/ER/SC interrupt

{0x8200, (interrupt_handler_t)SPI_IRQHandler}, // irq10 - SPI End of transfer interrupt

{0x8200, (interrupt_handler_t)TIM1_UPD_OVF_TRG_BRK_IRQHandler}, // irq11 - TIM1 Update/Overflow/Trigger/Break interrupt {0x8200, (interrupt_handler_t)TIM1_CAP_COM_IRQHandler}, // irq12 - TIM1 Capture/Compare interrupt

{0x8200, (interrupt_handler_t)TIM2_UPD_OVF_BRK_IRQHandler}, // irq13 - TIM2 Update/Overflow/Break interrupt

{0x8200, (interrupt_handler_t)TIM2_CAP_COM_IRQHandler}, // irq14 - TIM2 Capture/Compare interrupt

{0x8200, (interrupt_handler_t)TIM3_UPD_OVF_BRK_IRQHandler}, // irq15 - TIM3 Update/Overflow/Break interrupt

{0x8200, (interrupt_handler_t)TIM3_CAP_COM_IRQHandler}, // irq16 - TIM3 Capture/Compare interrupt

{0x8200, (interrupt_handler_t)USART_TX_IRQHandler}, // irq17 - USART Tx complete interrupt

{0x8200, (interrupt_handler_t)USART_RX_IRQHandler}, // irq18 - USART Rx interrupt

{0x8200, (interrupt_handler_t)I2C_IRQHandler}, // irq19 - I2C interrupt

{0x8200, (interrupt_handler_t)LINUART_TX_IRQHandler}, // irq20 - LINUART Tx interrupt

{0x8200, (interrupt_handler_t)LINUART_RX_IRQHandler}, // irq21 - LINUART Rx interrupt

{0x8200, (interrupt_handler_t)ADC_IRQHandler}, // irq22 - ADC end of conversion interrupt

{0x8200, (interrupt_handler_t)TIM4_UPD_OVF_IRQHandler}, // irq23 - TIM4 Update/Overflow interrupt

{0x8200, (interrupt_handler_t)FLASH_IRQHandler}, // irq24 - FLASH interrupt

{0x8200, (interrupt_handler_t)NonHandledInterrupt}, // irq25 - Reserved

{0x8200, (interrupt_handler_t)NonHandledInterrupt}, // irq26 - Reserved

{0x8200, (interrupt_handler_t)NonHandledInterrupt}, // irq27 - Reserved

{0x8200, (interrupt_handler_t)NonHandledInterrupt}, // irq28 - Reserved

{0x8200, (interrupt_handler_t)NonHandledInterrupt}, // irq29 - Reserved

};

中断向量表

中断向量表 中断向量表是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指令占了两个字,所以要填两个NOP NMI: RETE ;不可屏蔽中断 NOP NOP NOP ; 软件中断 SINT17 .space 4*16 ;软件中断使用较少,简单起见用0填充 SINT18 .space 4*16 SINT19 .space 4*16 SINT20 .space 4*16 SINT21 .space 4*16 SINT22 .space 4*16 SINT23 .space 4*16 SINT24 .space 4*16 SINT25 .space 4*16 SINT26 .space 4*16 SINT27 .space 4*16 SINT28 .space 4*16 SINT29 .space 4*16 SINT30 .space 4*16 INT0: RETE ;外部中断INT0 NOP NOP NOP

DSP中断向量表和中断子向量表(精)

DSP中断向量表和中断子向量表 DSP中断向量表和中断子向量表 类别:单片机/DSP 本案例在介绍数字PID控制器和模糊Pl控制器的DSP应用程序设计的同时,还介绍TI公司C2000系列DSP芯片开发时,中断向量表和中断子向量表的编写和配置方法。一个实用DSP程序除包括主程序和系统初始化程序以及存储器配置文件之外,还需要有中断向量表和中断子向量表程序,对于一个DSP控制器来说,中断的使用和管理是不可缺少的。在系统中,控制器的作用就是控制整个系统实时、有序地按照程序的要求运行,而DSP只有一个CPU,所以只有L个进程,当外部设各要求DSP控制时,就采用中断的方式,DSP根据中断的优先级,通过响应中断并执行中断服务子程序(ISR)来对外部设各进行控制。一个正确的中断向量表和中断子向量表程序能够使系统正常运行,并能保证在系统不正常时自动恢复到程序初始化的状态,防止系统崩溃,提高工业控制的鲁棒性。DSP LF2407有两级中断,第一级中断是CPU中断,共6个;第二级中断是外围设各中断,共46个。由外设中断扩展控制器(PIE)和中断子向量表把外围设备中断映射到CPU中断,然后等待CPU的响应。此外CPU中断向量表还包括19个软件中断和硬件复位中断(Reset)以及一个不可屏蔽申断(NMI)。这种两级中断是采用集中化的中断扩展设计方法,特别适合有大量外设中断的工业控制系统。以下就是采用通用定时器GPTI的比较操作来产生中断时,LF2407的中断向量表和申断子向量表程序。当需要采用其他中断时,可以直接在此程序中根据需要修改。该程序对LF2407来说是通用的,只是发生中断时,CPU要跳转的地址不一样而已。 对于一个实际的DSP系统来说,系统的中断管理是不可缺少的,因为目前任何DSP实时系统都具有中断,中断是DSP系统和外部世界发生实时联系的一个重要手段。作为TI公司的C2000系列DSP,它是偏向于控制的DSP 芯片,因此它的中断管理更丰富和先进,读者理解起来也较困难。LF2407支持6个一级可屏蔽中断,采用集中化的中断扩展设计来满足大量的外设中断请求,所以每一级中断又有多个中断源,例如一级中断INT2包含的中断源有比较器1、2、3、4、5、6中断,定时器1、3的周期、比较、下溢、上溢中断等。为了正确地响应外设中断,应该分两步来完成中断服务子程序。在本案例的程序中,采用通用定时器1的比较匹配中断,当CPU响应该中断时,首先转移到一级中断INT2中,也即GISR2处执行,在一级中断INT2中读取外设中断向量寄存器(PIVR)的值,它是个偏移量,再加上中断子向量的首地址,程序就可以转移到二级中断子向量T1CINT_ISR(定时器1比较中断)子程序中,执行相应的操作后即完成了一次中断调用。LF2407通过外设中断扩展控制器(PIE)来实现集中化的中断扩展管理,这可以实现在占用极少资源的情况下,大大扩展可用的中断源。因此在实际的DSP程序中,中断向量表和中断子向量表程序是不可缺少的,读者在自行编写程序时一定要在主程序中用。include 汇编伪指令把本实例介绍的向量表文件PID_generate_vec.asm包括进来。

中断向量表详解

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)设置分功能号。按实现的操作功能的要求,给指定寄存器(通常为AH)送入分功能号。 (2)设置入口参数。按操作要求,给寄存器填写相应参数的内容(某些调用无参数)。 (3)使用中断语句INTn。执行调用的功能,其中n为中断号。

中断向量的使用

如何输出HEX文件? 在配置文件后面加入以下代码,便可输出HEX文件,A90文件与HEX文件一样,SLISP都能识别. // Output File -Ointel-extended,(XDA TA)=.eep //产生eeprom文件 -Ointel-extended,(CODE)=.A90 //产生烧写文件 -Ointel-extended,(CODE)=.hex //产生烧写文件 中断向量的使用 IAR中定义中断函数的格式是 ///////////////////////////////// #pragma vector=中断向量 __interrupt void 中断服务程序(void) { //中断处理程序 } ///////////////////////////////////// 中断的初始化要另外加入代码,可在主程序内加入。如下是各个中断函数的定义。 //中断定义 #include #pragma vector=INT0_vect __interrupt void INT0_Server(void) { } #pragma vector=INT1_vect __interrupt void INT1_Server(void) { } #pragma vector=TIMER2_COMP_vect __interrupt void TIMER2_COMP_Server(void) { } #pragma vector=TIMER2_OVF_vect __interrupt void TIMER2_OVF_Server(void) { } #pragma vector=TIMER1_CAPT_vect __interrupt void TIMER1_CAPT_Server(void) { }

中断向量表笔记

中断向量笔记 大头小脑 1、中断向量表(Interrupt Vector Table是ISR(Interrupt Service Routine) 进入点的数组) 2、当CPU开始处理一个中断的时候(从优先级号开始),根据优先级计算中 断向量表中和这个中断相关的地址。这个地址被载入到程序计数器。CPU 开始执行这个地址存储的指令(在中断向量表中),这个地址的代码是所 选择的ISR的开始。由于ISR的大小关系,中断向量表可能仅仅存储ISR 的初始化部分,比如:一个跳转指令,这个跳转指令把CPU引导到ISR 的在存储区域的剩余程序部分。 3、中断向量表存储在代码存储区域。BIV寄存器指定了中断向量表的具体地 址。中断向量在中断向量表中是按照优先级增长的方式递增的。 4、BIV寄存器存储着中断向量表的基地址。其可以分配到任何一个可用的代 码存储区域。 5、在系统初始化中可以改变BIV的值。在这种方法下,可以有多个中断向量 表,通过改变BIV的值它们之间可以切换。 6、中断向量表是根据中断优先级而组织的。 7、TC1728提供附加的选项:允许跨过几个没有被用的中断向量进入点。 8、使用BIV寄存器和优先级号来计算(P1013) (P1014)

PIPN左移5bits和BIV寄存器的值“或”运算,得到指向中断向量表的指针。CCPN现在的CPU优先级号,PIPN,正在等待的CPU优先级号。 总结:1、TriCore是以中断的优先级来定义中断向量表,每一个服务请求可以分配一个独立的优先级 2、Power PC是以中断的属性来定义中断向量表,只有16个优先级。 3、中断向量表是在startup中初始化的,一般在库中,不可见。

STM32中断向量表

/** *@brief STM32F10x Interrupt Number Definition,according to the selected device *in@ref Library_configuration_section */ typedef enum IRQn { /******Cortex-M3Processor Exceptions Numbers***************************************************/ NonMaskableInt_IRQn=-14,/*!<2Non Maskable Interrupt*/ MemoryManagement_IRQn=-12,/*!<4Cortex-M3Memory Management Interrupt*/ BusFault_IRQn=-11,/*!<5Cortex-M3Bus Fault Interrupt*/ UsageFault_IRQn=-10,/*!<6Cortex-M3Usage Fault Interrupt*/ SVCall_IRQn=-5,/*!<11Cortex-M3SV Call Interrupt*/ DebugMonitor_IRQn=-4,/*!<12Cortex-M3Debug Monitor Interrupt*/ PendSV_IRQn=-2,/*!<14Cortex-M3Pend SV Interrupt*/ SysTick_IRQn=-1,/*!<15Cortex-M3System Tick Interrupt*/ /******STM32specific Interrupt Numbers*********************************************************/ WWDG_IRQn=0,/*!

中断向量表

******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_cl.s ;* Author : MCD Application Team ;* Version : V3.1.0 ;* Date : 06/19/2009 ;* Description : STM32F10x Connectivity line devices vector table for RVMDK ;* toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> ;******************************************************************************* ; THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS ; WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR TH EM TO SAVE TIME. ; AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DI RECT, ; INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARIS ING FROM THE ; CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF TH E CODING ; INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. ;******************************************************************************* ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; Stack Configuration ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; ; 首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈; 顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转C/C++标; 准实时库的__main函数。假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000, ; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇 ; 到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序, ; 然后跳转__main函数,最后来到C的世界。

中断向量表

中断向量表 1、8088/8086中断向量表的作用是什么? 【答】中断向量是中断服务程序的入口地址。将所有中断向量集中放在一起,形成中断向量表。8086系统有256个类型的中断源。每个类型对应一个中断向量,一个中断向量由四个字节组成:2个高地址字节:存放中断服务程序的代码段的段值;2个低地址字节:存放中断服务程序的偏移地址。中断向量表放在内存的地段地址0单元开始的单元:00000H~03FFFH。 2、什么叫中断向量?它放在哪里?对应于1CH的中断向量在哪里?如1CH中断程序从5110H:2030H开始,则中断向量应怎样存放? 【答】中断向量是中断处理子程序的入口地址,它放在中断向量表中,由1ch*4=70h知中断向量存放在0000:0070处。由于中断处理入口地址为5110:2030所以0070H,0071H,0072H,0073H这四个单元的值分别为30H,20H,10H,51H。 3、叙述可屏蔽中断的响应过程,一个可屏蔽中断或者非屏蔽中断响应后,堆栈顶部四个单元中是什么内容? 【答】当CPU在INTR引脚上接受一个高电平的中断请求信号并且当前的中断允许标志为1,CPU就会在当前指令执行完后开始响应外部的中断请求,具体如下: 1、从数据总线上读取外设送来的中断类型码,将其存入内部暂存器中; 2、将标志寄存器的值推入堆栈; 3、将标志寄存器中IF和TF清零; 4、将断点保护到堆栈中; 5、根据中断类型获取中断向量转入中断处理子程序; 6、处理完后恢复现场。 响应后堆栈的顶部4个单元是IP,CS。 4、从8086/8088的中断向量表中可以看到,如果一个用户想定义某个中断,应该选择在什么范围? 【答】从8086/8088的中断向量表中可以看出,由于系统占用了部分中断类型码,主要包括: (1)专用中断:0~4,占中断向量表000~013H。 (2)系统备用中断:5~31H

S12单片机中断向量---完整版

2010-01-23 | S12单片机中断系统 S12的技术手册里没有介绍中断向量,找的时候颇费了一番功夫,现在分享下给像我一样的初学者。 中断向量表可以在头文件中找到: /**************** interrupt vector table ****************/ #define VReserved63 0x0000FF80 #define VReserved62 0x0000FF82 #define VReserved61 0x0000FF84 #define VReserved60 0x0000FF86 #define VReserved59 0x0000FF88 #define VReserved58 0x0000FF8A #define Vpwmesdn 0x0000FF8C #define Vportp 0x0000FF8E #define Vcan4tx 0x0000FF90 #define Vcan4rx 0x0000FF92 #define Vcan4err 0x0000FF94 #define Vcan4wkup 0x0000FF96 #define Vcan3tx 0x0000FF98 #define Vcan3rx 0x0000FF9A #define Vcan3err 0x0000FF9C #define Vcan3wkup 0x0000FF9E #define Vcan2tx 0x0000FFA0 #define Vcan2rx 0x0000FFA2 #define Vcan2err 0x0000FFA4 #define Vcan2wkup 0x0000FFA6 #define Vcan1tx 0x0000FFA8 #define Vcan1rx 0x0000FFAA

中断向量

习题八中断控制器 8.1 8088/8086CPU管理有哪些中断源?各种中断的产生条件是什么? 【答】NMI中断和INTR中断。INTR中断产生的条件是:无总线请求、FR.IF=1、CPU执行完当前指令。 8.2 8088/8086中断向量表的作用是什么? 【答】中断向量是中断服务程序的入口地址。将所有中断向量集中放在一起,形成中断向量表。 8086系统有256个类型的中断源。每个类型对应一个中断向量,一个中断向量由四个字节组成:2个高地址字节:存放中断服务程序的代码段的段值;2个低地址字节:存放中断服务程序的偏移地址。中断向量表放在内存的地段地址0单元开始的单 元:00000H~03FFFH。 8.3 什么叫中断向量?它放在哪里?对应于1CH的中断向量在哪里?如1CH中断程序从 5110H:2030H开始,则中断向量应怎样存放? 【答】中断向量是中断处理子程序的入口地址,它放在中断向量表中,由1ch*4=70h知中断向量存放在0000:0070处。由于中断处理入口地址为5110:2030所以0070H,0071H,0072H,0073H 这四个单元的值分别为30H,20H,10H,51H。 8.4 叙述可屏蔽中断的响应过程,一个可屏蔽中断或者非屏蔽中断响应后,堆栈顶部四个单元 中是什么内容? 【答】当CPU在INTR引脚上接受一个高电平的中断请求信号并且当前的中断允许标志为1,CPU 就会在当前指令执行完后开始响应外部的中断请求,具体如下: 1、从数据总线上读取外设送来的中断类型码,将其存入内部暂存器中; 2、将标志寄存器的值推入堆栈; 3、将标志寄存器中IF和TF清零; 4、将断点保护到堆栈中; 5、根据中断类型获取中断向量转入中断处理子程序; 6、处理完后恢复现场。 响应后堆栈的顶部4个单元是IP,CS。 8.5 从8086/8088的中断向量表中可以看到,如果一个用户想定义某个中断,应该选择在什么 范围? 【答】从8086/8088的中断向量表中可以看出,由于系统占用了部分中断类型码,主要包括:(1)专用中断:0~4,占中断向量表000~013H。 (2)系统备用中断:5~31H (3)用户使用中断:32H~0FFH 如果一个用户想定义一个中断,可以选择中断类型码32H-FFH,其中断向量在中断向量表的0C8H-01BFH。 8.6 非屏蔽中断处理程序的入口地址怎样寻找? 【答】非屏蔽对应类型2,它位于中断向量表0000:0008H-0000:000BH处,4个单元的值即为非屏蔽中断处理程序的入口地址:08H、09H放偏移量,0AH、0BH放段地址。 8.7 类型号为20H的中断服务程序入口符号地址为INT-5,试写出中断向量的装入程序片断。【答】中断向量的地址:20H×4=001 0 00 0000=80H 中断向量的装入参考程序: CLI PUSH DS XOR AX,AX MOV DS,AX MOV AX,OFFSET INT-5 MOV WORD PTR [080H],AX MOV AX,SEG INT-5 MOV WORD PTR [082H],AX POP DS STI…… INT-5 PROC NEAR ……. IRET INT-5 ENDP 8.8 8259A中 IRR、IMR和 ISR三个寄存器的作用是什么? 【答】中断请求寄存器IRR:保存对应位的中断请求

ARM中断系统_百度文库.

该文章介绍了 ARM 处理器的中断系统,以周立功公司的 LPC2000为例。希望对大家有用! 1.1中断源 LPC2000系列的向量中断控制器(VIC支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为 VIC 通道0,VIC 通道1, …, VIC 通道31。 每一个 VIC 通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生, 软件中断与对应通道上的硬件中断是逻辑“或” 的关系。软件中断可通过置位 VICSoftInt 寄存器相应位来产生, 也可通过置位 VICSoftIntClear 寄存器相应位来清除。 表5.1外设功能的中断源 1.2三种中断类型 LPC2000具有3类中断:FIQ、向量 IRQ 和非向量 IRQ。LPC2000系列可通过对 VICIntSelect 和VICVectCntlx(x=0,1,…,15这两类寄存器的设置,将以上的32个中断源设置为这三类中断的任何一种。其中, 快速中断请求 FIQ 具有最高优先级。建议只分配一个中断请求给 FIQ 以减少中塅处理程序的延迟。当然,VIC 支持多个FIQ 中断。向量 IRQ 具有中等优先级。该级别最多可分配32个请求中的16个。32个请求中的任何一个都可以分配到16个向量 IRQslot 中的任意一个。其 中,slot0具有最高优先级, 而 slot15则为最低优先级。非向量 IRQ 具有最低优先级。 1.3如何初始化某个中断源为三类中断中的一类 通过 VICIntSelect 中断选择寄存器将32个中断请求分配为 FIQ 或 IRQ (包括向量 IRQ 与非向量 IRQ ;通过VICVectCntlx(x=0,1,…,15来选择32个中断请求中的某个为向量 IRQ 并设定此中断请求为 IRQ slotx(x对应于 VICVectCntlx 中的 x 。若

ARM中断向量表与响应流程

一首先中断向量表定义在哪里?如何加载? 二中断向量表与中断服务程序 三处理流程 //////////////////////////////////////////////////////////////////////////////////////////////////// 一首先中断向量表定义在哪里?__vectors_start 首先中断向量表定义的是什么?定义的就是中断服务程序的跳转指令,因为每个中断向量在向量表中只有一个字节的存储空间,只能存放一条指令,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。这里cpu就可以找中断服务程序,跳转指令如例如: LDR PC, =ISR_HANDLER; 或者 指令与不同的cpu平台有关系。 1.1 vector表定义的方式:往往是变量地址: 如. .globl __vectors_start定义__vectors_start符号,这样外部程序可以访问到。entry-armv.S __vectors_start: swi SYS_ERROR0 b vector_und + stubs_offset ldr pc, .LCvswi + stubs_offset b vector_pabt + stubs_offset b vector_dabt + stubs_offset b vector_addrexcptn + stubs_offset b vector_irq + stubs_offset b vector_fiq + stubs_offset ARM的异常处理向量表在entry-armv.S文件中:

如何理解ARM异常、中断和向量表

如何理解ARM异常、中断和向量表 以前,我一直很疑惑这个ARM异常、中断以及他们的向量表是怎么回事,他们到底是怎么实现的,没有想到今天偶然看到(ARM System Developers Guide: Designing and OpTImizing System Software的ARM异常、中断以及他们的向量表的章节,豁然开朗。ARM嵌入式系统开发:软件设计与优化的英文原版我个人感觉这是国内翻译ARM书籍最好的一本之一,比杜XX的ARM体系结构与编程好千倍。本书虽然说软件设计与优化,但是讲的硬件也很多,比如MMU和cache等,讲的精彩纷呈:我刚才想写关于MMU和cache的博客,发现太庞大,看来这段时间要重新看看这本书才能写。下载地址:) 下面来看看 2.4 ExcepTIons, Interrupts, and the Vector Table When an excepTIon or interrupt occurs, the processor sets the pc to a speci?c memoryaddress. The address is within a special address range called the vector table. The entriesin the vector table are instrucTIons that branch to speci?c routines designed to handle aparticular exception or interrupt. 当异常或者中断发生的时候,处理器设置PC为一个特殊的内存地址。这个地址叫做中断向量表。中断向量表入口是中断、异常的分支入ffff0000). Operating systems such as Linux andMicrosofts embedded products can take advantage of this feature. 内存映射地址0x00000000 是为中断向量表保留的。在某些处理器中断向量表地址为0xffff0000。某些操作系统如linux可以利用这个特征(其实wince就是采用0xffff0000作为中断向量表的地址,但是令人奇怪的是优龙的ADS bootloader的中断向量表地址是0x00000000 ,估计这是编译器决定了)。 When an exception or interrupt occurs, the processor suspends normal execution andstarts loading instructions fromthe exception vector table (see Table 2.6). Each vector tableentry contains a form of branch instruction pointing to the start of a speci?c routine: 当异常或者中断发生的时候,处理器挂起正常执行的程序并开始加载中断向量表,每个中断入口包含一个指向speci?c routine(这个不知道怎么翻译)的分支指令。

armIRQ中断之向量中断非向量中断.

arm中断向量表中,只有一个IRQ向量地址,占4字节(另外还有一个FIQ向量地址),可是arm支持多个外部中断源,一个中断发生后,arm如何根据这一个向量地址找到相应的中断服务程序?这里要区分中断是向量中断还是非向量中断。 一个中断源对应一个中断号,对于不同的外部中断源根据处理方式不同分为向量中断和非向量中断。 向量中断:当中断为向量中断时,arm直接跳转到预先提供的中断服务程序执行,这种处理方式响应速度快。 非向量中断:当中断为非向量中断时,无论是什么外部中断源发出的中断,arm将跳到指定的一段程序执行(称为中断解析程序),在解析程序里,通过判断相应的中断状态寄存器找到对应的中断源,跳转到相应的中断执行程序。有点类似软件中断的处理方式,但是软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。进入软中断后,系统变为管理模式。而非向量中断入口是0x0000,0018。它引导系统进入fiq/irq模式。这种处理方式简单,但是要通过软件查询来判断具体的中断服务程序,所有延迟时间较长。 如何设置: 系统在初始化的时候需要进行中断初始化,设置中断源是向量中断还是非向量中断。设置方式举例如下: VICIntSelect = 0x00000000; //所有中断都是IRQ VICVectCntl0 = 0x20 | 15; //将15号中断EINT1设置为向量中断,并且使用优先级0 VICVectAddr0 = (uint32)EINT1_Exception; //EINT1中断服务程序地址 VICDefVectAddr = (uint32)Default_Entry; //其他的非向量中断默认的处理地址,其他非向量中断都会进入Default_Entry进行处理,在Default_Entry中获得具体的中断号再进行具体处理 VICIntEnable = 0x00018000; //使能EINT1和EINT2 由于在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry。 系统处理过程

DSP中断向量表和中断子向量表

DSP中断向量表和中断子向量表 本案例在介绍数字PID控制器和模糊Pl控制器的DSP应用程序设计的同时,还介绍TI公司C2000系列DSP芯片开发时,中断向量表和中断子向量表的编写和配置方法。 一个实用DSP程序除包括主程序和系统初始化程序以及存储器配置文件之外,还需要有中断向量表和中断子向量表程序,对于一个DSP控制器来说,中断的使用和管理是不可缺少的。在系统中,控制器的作用就是控制整个系统实时、有序地按照程序的要求运行,而DSP只有一个CPU,所以只有L个进程,当外部设各要求DSP控制时,就采用中断的方式,DSP根据中断的优先级,通过响应中断并执行中断服务子程序(ISR)来对外部设各进行控制。一个正确的中断向量表和中断子向量表程序能够使系统正常运行,并能保证在系统不正常时自动恢复到程序初始化的状态,防止系统崩溃,提高工业控制的鲁棒性。 DSP LF2407有两级中断,第一级中断是CPU中断,共6个;第二级中断是外围设各中断,共46个。由外设中断扩展控制器(PIE)和中断子向量表把外围设备中断映射到CPU中断,然后等待CPU的响应。此外CPU中断向量表还包括19个软件中断和硬件复位中断(Reset)以及一个不可屏蔽申断(NMI)。这种两级中断是采用集中化的中断扩展设计方法,特别适合有大量外设中断的工业控制系统。 以下就是采用通用定时器GPTI的比较操作来产生中断时,LF2407的中断向量表和申断子向量表程序。当需要采用其他中断时,可以直接在此程序中根据需要修改。该程序对LF2407来说是通用的,只是发生中断时,CPU要跳转的地址不一样而已。

对于一个实际的DSP系统来说,系统的中断管理是不可缺少的,因为目前任何DSP实时系统都具有中断,中断是DSP系统和外部世界发生实时联系的一个重要手段。作为TI公司的C2000系列DSP,它是偏向于控制的DSP芯片,因此它的中断管理更丰富和先进,读者理解起来也较困难。LF2407支持6个一级可屏蔽中断,采用集中化的中断扩展设计来满足大量的外设中断请求,所以每一级中断又有多个中断源,例如一级中断INT2包含的中断源有比较器1、2、3、4、5、6中断,定时器1、3的周期、比较、下溢、上溢中断等。为了正确地响应外设中断,应该分两步来完成中断服务子程序。在本案例的程序中,采用通用定时器1的比较匹配中断,当CPU响应该中断时,首先转移到一级中断INT2中,也即GISR2处执行,在一级中断INT2中读取外设中断向量寄存器(PIVR)的值,它是个偏移量,再加上中断子向量的首地址,程序就可以转移到二级中断子向量T1CINT_ISR(定时器1比较中断)子程序中,执行相应的操作后即完成了一次中断调用。 LF2407通过外设中断扩展控制器(PIE)来实现集中化的中断扩展管理,这可以实现在占用极少资源的情况下,大大扩展可用的中断源。因此在实际的DSP程序中,中断向量表和中断子向量表程序是不可缺少的,读者在自行编写程序时一定要在主程序中用。include汇编伪指令把本实例介绍的向量表文件PID_generate_vec.asm包括进来。 另外,假中断向量是LF2407的一个特有的概念,它是保持中断系统完整性的一个特性。在向量表文件PID generate_voc.asm中可以发现,中断子向量表的地址是从00h到42h,而中断源却没有那么多,并且其入口地址叉是固定的,所以在中断子向量表的没有中断源的地方就要插人假中断向量以保证中断系统的完整性。当一个中断已经被响应,但却没有外设将中断向量的地址偏移量装入中断向量寄存器(PIVR)中时,假中断向量的地址就被装人PIVR中,这种缺省保证了系统按照可以控制的方式进行处理。假中断向量的子程序如下所示,一股都是复位看门狗电路。

中断向量表

中断向量:向量就是确定确切位置的含义,中断向量的含义就是可以确定中断服务程序位置,也就是中断向量就是中断服务程序的首地址。中断服务程序的首地址,需要4个内存空间存储。 中断类型码:我们把每个中断服务程序进行编号,这个号就代表一个中断服务程序,这个号就是终端类型码。这个中断类型码是计算机用来查找中断向量用的。 中断向量表:存放所有的中断向量的地址空间。也就说中断向量表是一片内存空间,是一片专门用来存放中断向量的内存空间。中断向量表在内存单元的最低处,地址空间为00000H----003FFH(0-1024B),这个正好可以和终端类型码有一种对应的关系,也就是说终端类型码*4就等于这个中断向量的首地址。 下面讲重点: 中断向量表属于内存中的RAM类型,就是说断电就没有内容了,那么再次开机的时候,它是怎么形成的呢?开机的时候,BIOS程序控制的电脑,BIOS程序将基本的中断程序的首地址填写到相应的中断向量表中,当DOS得到系统控制权的时候,它又向中断向量表中填写一些中断向量,同时,还会修改BIOS填写的一些中断向量(驱动程序的升级,这也是为什么

我把这篇文章写在这的原因),当然,用户也可以更改和完善系统已有的中断向量。 中断向量表 1、8088/8086中断向量表的作用是什么? 【答】中断向量是中断服务程序的入口地址。将所有中断向量集中放在一起,形成中断向量表。8086系统有256个类型的中断源。每个类型对应一个中断向量,一个中断向量由四个字节组成:2个高地址字节:存放中断服务程序的代码段的段值;2个低地址字节:存放中断服务程序的偏移地址。中断向量表放在内存的地段地址0单元开始的单元:00000H~03FFFH。 2、什么叫中断向量?它放在哪里?对应于1CH的中断向量在哪里?如1CH中断程序从5110H:2030H开始,则中断向量应怎样存放? 【答】中断向量是中断处理子程序的入口地址,它放在中断向量表中,由1ch*4=70h知中断向量存放在0000:0070处。由于中断处理入口地址为5110:2030所以0070H,0071H,0072H,0073H这四个单元的值分别为30H,20H,10H,51H。 3、叙述可屏蔽中断的响应过程,一个可屏蔽中断或者非屏蔽中断响应后,堆栈顶部四个单元中是什么内容? 【答】当CPU在INTR引脚上接受一个高电平的中断请求信号并且当前的中断允许标志为1,CPU就会在当前指令执行完后开始响应外部的中断请求,具体如下: 1、从数据总线上读取外设送来的中断类型码,将其存入内部暂存器中; 2、将标志寄存器的值推入堆栈; 3、将标志寄存器中IF和TF清零; 4、将断点保护到堆栈中; 5、根据中断类型获取中断向量转入中断处理子程序; 6、处理完后恢复现场。 响应后堆栈的顶部4个单元是IP,CS。 4、从8086/8088的中断向量表中可以看到,如果一个用户想定义某个中断,应该选择在什么范围?

相关主题
相关文档
最新文档