ARM处理器架构异常/中断处理
时间:11-09
来源:互联网
点击:
此,可以推断,对于中断函数在ADS中有特殊的声明方式,如:static void __irq Uart_DMA_ISR(void)。像这种声明方式,在编译的时候,编译器会自动在函数的末尾添加恢复cpsr和pc的语句。另外, 寄存器r0-r12也是需要保护的,因为在中断函数和原来的上下文中都会用到,所以,我认为 编译器在中断处理函数中对r0-r12也进行了保护和恢复。
另外,在ucosII中,对IsrIRQ函数进行了修改,我们后面再进行分析。
另外,我们用软件实现了一套中断向量表:
ALIGNAREA RamData, DATA, READWRITE^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00HandleReset # 4HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4;Dont use the label IntVectorTable,;The value of IntVectorTable is different with the address you think it may be.;IntVectorTable;@0x33FF_FF20HandleEINT0 # 4HandleEINT1 # 4HandleEINT2 # 4HandleEINT3 # 4HandleEINT4_7 # 4HandleEINT8_23 # 4HandleCAM # 4 ; Added for 2440.HandleBATFLT # 4HandleTICK # 4HandleWDT # 4HandleTIMER0 # 4HandleTIMER1 # 4HandleTIMER2 # 4HandleTIMER3 # 4HandleTIMER4 # 4HandleUART2 # 4;@0x33FF_FF60HandleLCD # 4HandleDMA0 # 4HandleDMA1 # 4HandleDMA2 # 4HandleDMA3 # 4HandleMMC # 4HandleSPI0 # 4HandleUART1 # 4HandleNFCON # 4 ; Added for 2440.HandleUSBD # 4HandleUSBH # 4HandleIIC # 4HandleUART0 # 4HandleSPI1 # 4HandleRTC # 4HandleADC # 4;@0x33FF_FFA0之前,我们在发生中断时,pc指针就跳转到了 HandleIRQ地址中所存储的数 出执行。也就是说在HandleIRQ中存的是异常处理函数的入口地址。这就是异常处理向量表的作用。
所以,我们可以看出,对于2440init.s实现的异常处理,采用的是两级向量表机制。 第一级向量表是arm核自己实现的,发生相应的异常时,pc指针跳转到0x18地址中存的数,作为入口地址。 第二级向量表是由Handler宏实现的,继续跳转到 HandleIRQ地址中存的数,继续执行。
而对于IRQ来讲,还有第三级的向量表,在IsrIRQ中,又会根据中断号,比如uart2的中断,跳转到 HandleUart2地址中 存的数,继续执行。
在2440init.s中,并没有给HandleUndef等这些地址处赋值,因此,一旦执行到,程序就会跑飞。
ARM处理器架构异常中断处 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)