打印

ARM中断后,中断地址是从flash开始,还是SDRAM?

[复制链接]
3596|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zacharyguo|  楼主 | 2011-3-7 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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真得很辛苦啊。。呵呵 。难道我理解错了吗??
谢谢~~

相关帖子

沙发
zacharyguo|  楼主 | 2011-3-7 14:22 | 只看该作者
:'(

使用特权

评论回复
板凳
xinzha| | 2011-3-7 16:44 | 只看该作者
arm内核的异常向量表是从0(或者0xffff0000)开始,而中断向量表就要根据不同厂商的不同实现来做,甚至有的厂商就没实现向量中断机制,不能一概而论。
如果你想深究这些机制问题,那还是找本arm架构的书看看,如果只是看着玩,知道怎么用就算了。

使用特权

评论回复
地板
lanmanck| | 2011-3-7 17:06 | 只看该作者
中断向量可以重定向的,一般都放到ram,这样速度快!

使用特权

评论回复
5
zacharyguo|  楼主 | 2011-3-7 17:09 | 只看该作者
4# lanmanck

中断向量的重定向是如何实现呢?

使用特权

评论回复
6
chinaye1| | 2011-3-8 08:39 | 只看该作者
4# lanmanck  

中断向量的重定向是如何实现呢?
zacharyguo 发表于 2011-3-7 17:09
看启动代码,多百度google

使用特权

评论回复
7
zacharyguo|  楼主 | 2011-3-8 09:55 | 只看该作者
但是为什么程序中还加了这么 一段代码: 注:_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;    //屏蔽所有的中断
}
我是奇怪这个,,因为我用是44B0,它不支持中断重映射。但是为什么要在0X0C000000这个地址加上跳转指令呢?44B0又不会跳到这个地址啊。。。如果有中断,它应该是跳到0地址上吧

使用特权

评论回复
8
zacharyguo|  楼主 | 2011-3-8 10:09 | 只看该作者
但是为什么程序中还加了这么 一段代码: 注:_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中。
不知道,我这样理解对不对?
请各位指正。。
谢谢~~

使用特权

评论回复
9
bnyuli| | 2011-3-8 11:30 | 只看该作者
楼主理解的对,就这样来吧  没问题的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

24

帖子

1

粉丝