CortexM架构,典型的是STM32系列,比如STM32F103(CortexM3)。CortexA架构可细分为CortexA7、CortexA8、CortexA9、CortexA15等,如NXP的IMX6系列、TI的AM335X系列等。CortexM主要用于微控制器领域,CortexR主要用于在实时性要求比较高的领域,CortexA主要用于高端应用。CortexM架构在CortexM架构中,比如STM32F103,中断向量表是写在启动文件中的,一般是startup_stm32f10x_hd.s或者startup_stm32f10x_md.s,.s结尾是汇编文件,写的启动文件的作用在汇编语言中,就是为板子上电后C语言代码的运行做一些初始化工作,比如设置堆栈大小,设置中断向量表等,然后跳转到main函数执行你的C代码。文件内容如下(部分省略):SetthestacksizeStack_SizeEQU0x00000400SettheheapsizeHeap_SizeEQU0x00000200;VectorTableMappedtoAddress0atReset复位后的很多DCD都是STM32的中断向量表。系统中所有可用的中断都写在这里,包括外部中断、Timer中断、DMA中断、IIC中断、串口中断等。Stack_SizeEQU0x00000400AREASTACK,NOINIT,READWRITE,ALIGN=3Stack_MemSPACEStack_Size__initial_sp;HeapConfiguration;HeapSize(inBytes)<0x0-0xFFFFFFFF:8>;Heap_SizeEQU0x00000200AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_baseHeap_MemSPACEHeap_Size__heap_limitPRESERVE8THUMB;VectorTableMappedtoAddress0atResetAREARESET,DATA,READONLYEXPORT__VectorsEXPORT__Vectors_EndEXPORT__Vectors_Size__VectorsDCD__initial_sp;TopofStackDCDReset_Handler;ResetHandlerDCDNMI_Handler;NMIHandlerDCDHardFault_Handler;HardFaultHandlerDCDMemManage_Handler;MPUFaultHandlerDCDBusFault_Handler;BusFaultHandlerDCDUsageFault_Handler;UsageFaultHandlerDCD0;ReservedDCD0;ReservedDCD0;ReservedDCD0;ReservedDCDSVC_Handler;SVCallHandlerDCDDebugMon_Handler;DebugMonitorHandlerDCD0;ReservedDCDPendSV_Handler;PendSVHandlerDCDSysTick_Handler;SysTickHandler;ExternalInterruptsDCDWWDG_IRQHandler;WindowWatchdogDCDPVD_IRQHandler;PVDthroughEXTILinedetectDCDTAMPER_IRQHandler;TamperDCDRTC_IRQHandler;RTCDCDFLASH_IRQHandler;FlashDCDRCC_IRQHandler;RCCDCDEXTI0_IRQHandler;EXTILine0DCDEXTI1_IRQHandler;EXTILine1DCDEXTI2_IRQHandler;EXTILine2DCDEXTI3_IRQHandler;EXTILine3DCDEXTI4_IRQHandler;EXTILine4DCDDMA1_Channel1_IRQHandler;DMA1Channel1DCDDMA1_Channel2_IRQHandler;DMA1Channel2DCDDMA1_Channel3_IRQHandler;DMA1Channel3DCDDMA1_Channel4_IRQHandler;DMA1Channel4DCDDMA1_Channel5_IRQHandler;DMA1Channel5DCDDMA1_Channel6_IRQHandler;DMA1Channel6DCDDMA1_Channel7_IRQHandler;DMA1Channel7DCDADC1_2_IRQHandler;ADC1&ADC2DCDUSB_HP_CAN1_TX_IRQHandler;USBHighPriorityorCAN1TXDCDUSB_LP_CAN1_RX0_IRQHandler;USBLowPriorityorCAN1RX0DCDCAN1_RX1_IRQHandler;CAN1RX1DCDCAN1_SCE_IRQHandler;CAN1SCEDCDEXTI9_5_IRQHandler;EXTILine9..5DCDTIM1_BRK_IRQHandler;TIM1BreakDCDTIM1_UP_IRQHandler;TIM1UpdateDCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutationDCDTIM1_CC_IRQHandler;TIM1CaptureCompareDCDTIM2_IRQHandler;TIM2DCDTIM3_IRQHandler;TIM3DCDTIM4_IRQHandler;TIM4DCDI2C1_EV_IRQHandler;I2C1EventDCDI2C1_ER_IRQHandler;I2C1ErrorDCDI2C2_EV_IRQHandler;I2C2EventDCDI2C2_ER_IRQHandler;I2C2ErrorDCDSPI1_IRQHandler;SPI1DCDSPI2_IRQHandler;SPI2DCDUSART1_IRQHandler;USART1DCDUSART2_IRQHandler;USART2DCDUSART3_IRQHandler;USART3DCDEXTI15_10_IRQHandler;EXTILine15..10DCDRTCAlarm_IRQHandler;RTCAlarmthroughEXTILineDCDUSBWakeUp_IRQHandler;USBWakeupfromsuspendDCDTIM8_BRK_IRQHandler;TIM8BreakDCDTIM8_UP_IRQHandler;TIM8UpdateDCDTIM8_TRG_COM_IRQHandler;TIM8TriggerandCommutationDCDTIM8_CC_IRQHandler;TIM8CaptureCompareDCDADC3_IRQHandler;ADC3DCDFSMC_IRQHandler;FSMCDCDSDIO_IRQHandler;SDIODCDTIM5_IRQHandler;TIM5DCDSPI3_IRQHandler;SPI3DCDUART4_IRQHandler;UART4DCDUART5_IRQHandler;UART5DCDTIM6_IRQHandler;TIM6DCDTIM7_IRQHandler;TIM7DCDDMA2_Channel1_IRQHandler;DMA2Channel1DCDDMA2_Channel2_IRQHandler;DMA2Channel2DCDDMA2_Channel3_IRQHandler;DMA2Channel3DCDDMA2_Channel4_5_IRQHandler;DMA2Channel4&Channel5__Vectors_Vectors___Endize__Vectors__Vectors_Vectors_EnctorVectors__VectorsctorsAREA|.text|,CODE,READONLY其中“__initial_sp”为第一个中断向量,存放栈顶指针,后面是第二行reset中断复位函数Reset_Handler的入口地址,依此类推直到最后一个中断service函数DMA2_Channel4_5_IRQHandler的入口地址,从而构建STM32F103的中断向量表。如何使用中断:1.配置中断向量表(ST提供)。2.配置NVIC(嵌入式向量中断控制器)。3.中断使能。4.中断服务功能。先配置中断向量表(自动),再配置IO口,配置NVIC管理中断,使能中断,最后编写中断服务函数。中断服务函数才是我们真正想做的。这种思路也适用于CortexA架构,只是中断系统不同,中断管理器也不同。STM32中的中断管理器是NVIC,CortexA架构的中断管理器是GIC控制器。GIC是ARM为Cortex-A/R内核提供的中断控制器。CortexA架构下表是CortexA架构的中断向量表。这个表也写在以.s结尾的启动文件中,为C语言代码的运行提供初始的初始化工作。只有初始化完成后,你的C语言代码才能开始。它会运行,在启动文件中初始化后,会跳转到你的main函数。可以发现中断比STM32少很多,只有8个中断,还有1个未使用。其中,我们最常用的中断是复位中断和IRQ中断。事实上,CortexA架构不可能有这么少的中断。Cortex-A核心CPU的所有外部中断都是IQR中断。当任何外部中断发生时,IRQ中断将被触发。在IRQ中断服务函数中,可以通过读取指定的寄存器来判断发生了具体的中断,然后根据具体的中断进行相应的处理,如下图所示:中断说明:1.复位中断(Rest),CPU复位后会进入复位中断,我们可以在复位中断服务函数中做一些初始化工作,比如初始化SP指针,DDR等。2.未定义指令中断(UndefinedInstruction),如果指令不能被识别,就会产生这个中断。3、软中断(SoftwareInterrupt,SWI),由SWI指令引起的中断,Linux系统调用会使用SWI指令引起软中断,并通过软中断落入内核空间。4.指令预取中止中断(PrefetchAbort),当预取指令失败时会产生该中断。5、数据访问中止中断(DataAbort),当访问数据出错时会产生该中断。6.IRQ中断(IRQInterrupt)、外部中断、芯片内部的外设中断都会导致这个中断的发生。7.FIQ中断(FIQInterrupt),快速中断,如果需要快速处理中断,可以使用这个。存储地址中断向量表链接到代码前面。比如一般的ARM处理器是从地址0X00000000开始执行指令的,所以中断向量表是从0X00000000开始存储的。在STM32中,一般的代码是下载到0X08000000开始的存储区的。因此,中断向量表表存储在地址0X08000000而不是0X00000000。这是通过偏移中断向量表来实现的。