ZacharyGuo 发表于 2011-3-7 13:28:36

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真得很辛苦啊。。呵呵 。难道我理解错了吗??
谢谢~~

ZacharyGuo 发表于 2011-3-7 13:52:44

哪位大哥,解答一下。。。

yifengzhineng 发表于 2011-3-7 15:41:31

启动的任务之一,就是把中断向量向量表在内存分配好了吧。

yu308 发表于 2011-3-7 20:01:57

RO段指的是程序文件中的只读段,RW是文件中的可读写的段,一般我们将下载代码文件至Flash中,上电复位后,除了进行配置时钟,建立中断向量表这些外,还有一个重要的步骤,进行内存重映射,说的简单电,就是将程序文件从Flash中拷贝出来并将文件中的各段放在内存中对应的位置上,至于为什么这么做,可以在网上查找“bootloader的分析”,有几个文档讲的很详细。void InitInterrupts函数中的 *((volatile unsigned *)temp)=0xEA000000+0x1FFE这句的意思是先给所有的中断一个通用的中断服务函数。至于“ARM的中断后,不是跳到flash的中断向量表中吗?在那里得到放在_ISR_STARTADDRESS 中断服务程序的地址,再跳回到SDRAM中执行吗? ”这个问题,应该在调用InitInterrupts函数后调用了MMU的初始化函数,将0xc000000映射至地址0,在启用MMU后,中断后跳转的地址是0,这个0是虚拟地址

ZacharyGuo 发表于 2011-3-8 09:57:26

回复【3楼】yu308
-----------------------------------------------------------------------

但是我的ARM是44B0,它不支持中断地址重映射吧~~也肯定没有MMU

ZacharyGuo 发表于 2011-3-8 10:08:58

但是为什么程序中还加了这么 一段代码: 注:_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中。
不知道,我这样理解对不对?
请各位指正。。
谢谢~~

flagyan 发表于 2011-3-8 21:51:17

都是跳到0开始的那段地址,因为你的flash上有代码所以可以执行,你可以把flash0地址附近的几条指令改一下试试在sdram中能不能中断。
页: [1]
查看完整版本: ARM中断跳转问题