ARM中断跳转问题
我在用一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真得很辛苦啊。。呵呵 。难道我理解错了吗??
谢谢~~ 哪位大哥,解答一下。。。 启动的任务之一,就是把中断向量向量表在内存分配好了吧。 RO段指的是程序文件中的只读段,RW是文件中的可读写的段,一般我们将下载代码文件至Flash中,上电复位后,除了进行配置时钟,建立中断向量表这些外,还有一个重要的步骤,进行内存重映射,说的简单电,就是将程序文件从Flash中拷贝出来并将文件中的各段放在内存中对应的位置上,至于为什么这么做,可以在网上查找“bootloader的分析”,有几个文档讲的很详细。void InitInterrupts函数中的 *((volatile unsigned *)temp)=0xEA000000+0x1FFE这句的意思是先给所有的中断一个通用的中断服务函数。至于“ARM的中断后,不是跳到flash的中断向量表中吗?在那里得到放在_ISR_STARTADDRESS 中断服务程序的地址,再跳回到SDRAM中执行吗? ”这个问题,应该在调用InitInterrupts函数后调用了MMU的初始化函数,将0xc000000映射至地址0,在启用MMU后,中断后跳转的地址是0,这个0是虚拟地址 回复【3楼】yu308
-----------------------------------------------------------------------
但是我的ARM是44B0,它不支持中断地址重映射吧~~也肯定没有MMU 但是为什么程序中还加了这么 一段代码: 注:_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; //屏蔽所有的中断
}
看了网上的一些资料,是不是这段代码只是为了在AXD做调试时使用的?
如果不是调试的话,发生中断后程序会跳到flash的0地址中,然后在那边得到位于SDRAM的中断服务程序的地址。
如果是调试的话,因为境像文件是下载到SDRAM中,在发生中断时,程序应该会跳到SDRAM的0地址 ,即0x0c000000中。
不知道,我这样理解对不对?
请各位指正。。
谢谢~~ 都是跳到0开始的那段地址,因为你的flash上有代码所以可以执行,你可以把flash0地址附近的几条指令改一下试试在sdram中能不能中断。
页:
[1]