本帖最后由 zacharyguo 于 2011-3-7 14:42 编辑
我在用一ARM开发板,看它的示例程序有个问题很是奇怪,怎么想不想不通,特来请教各位。
我的开发板的FLASH的地址是0,SDRAM的地址:0x0c000000. RW的入口设置为0x0c008000.
在Bootloader中,已经将RO拷贝到RW.
中断已经定义了二级中断向量表:
^ _ISR_STARTADDRESS ;0xc7fff00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;Don't use the label 'IntVectorTable',
;because armasm.exe cann't recognize this label correctly.
;the value is different with an address you think it may be.
;IntVectorTable
HandleADC # 4
HandleRTC # 4
HandleUTXD1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4 ;0xc1(c7)fff84
在中断程序的初始化过程中,已经将中断服务程序的地址写入二级中断向量表中了
void ISR_Timer(void)
{
pISR_TIMER0= (unsigned)Timer0_Exception;
}
但是为什么程序中还加了这么 一段代码: 注:_RAM_STARTADDRESS 为 0xc000000
//初始化中断
void InitInterrupts(void)
{
unsigned int temp;
for(temp=_RAM_STARTADDRESS;temp<(_RAM_STARTADDRESS+0x20);temp+=4)
{
*((volatile unsigned *)temp)=0xEA000000+0x1FFE;//中断向量加载到了0X0C008000处
}
rINTCON=0x5; //非向量中断 IRQ中断使能
rINTMOD=0x0; //IRQ中断
rINTMSK=0X7FFFFFF; //屏蔽所有的中断
}
在SDRAM的0地址,即0xc000000中,写入了跳转到 0xc008000的中断向量表的指令。
在这里,我很是不明白。ARM的中断后,不是跳到flash的中断向量表中吗?在那里得到放在_ISR_STARTADDRESS 中断服务程序的地址,再跳回到SDRAM中执行吗?
难道将程序从RO拷贝到RW后,ARM的中断后,是直接跳到SDRAM的0地址吗??
非常不明白。。
请谁能否解答下。。自学ARM真得很辛苦啊。。呵呵 。难道我理解错了吗??
谢谢~~ |