打印

启动代码定位问题

[复制链接]
2124|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
herowa|  楼主 | 2009-3-30 13:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用IAR5.2的环境,想让编译的代码整个放到不是0x00地址处(例如0x2000),设置完相应的.icf文件,可是编译后发现发现,真正的代码段是放到了0x2000处,但是cstartup.s的中断向量表还是从0x00处开始的,请问怎么样才能使cstartup.s的中断向量表从0x2000处开始。
以下为cstartup.s源文件:

;********************************************************************************************************
;                                           MACROS AND DEFINIITIONS
;********************************************************************************************************

                                ; Mode, correspords to bits 0-5 in CPSR
MODE_BITS    DEFINE    0x1F        ; Bit mask for mode bits in CPSR
USR_MODE    DEFINE    0x10        ; User mode
FIQ_MODE    DEFINE    0x11        ; Fast Interrupt Request mode
IRQ_MODE    DEFINE    0x12        ; Interrupt Request mode
SVC_MODE    DEFINE    0x13        ; Supervisor mode
ABT_MODE    DEFINE    0x17        ; Abort mode
UND_MODE    DEFINE    0x1B        ; Undefined Instruction mode
SYS_MODE    DEFINE    0x1F        ; System mode
    

;********************************************************************************************************
;                                            ARM EXCEPTION VECTORS
;********************************************************************************************************

    SECTION .intvec:CODE:NOROOT(2)
    PUBLIC  __vector
    PUBLIC  __iar_program_start

    IMPORT  OS_CPU_ARM_ExceptUndefInstrHndlr
    IMPORT  OS_CPU_ARM_ExceptSwiHndlr
    IMPORT  OS_CPU_ARM_ExceptPrefetchAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptDataAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptIrqHndlr
    IMPORT  OS_CPU_ARM_ExceptFiqHndlr

    ARM

__vector:
    LDR        PC, [PC,#24]    ; Absolute jump can reach 4 GByte
    LDR     PC, [PC,#24]    ; Branch to undef_handler
    LDR     PC, [PC,#24]    ; Branch to swi_handler
    LDR     PC, [PC,#24]    ; Branch to prefetch_handler
    LDR     PC, [PC,#24]    ; Branch to data_handler
__vector_0x14:
    DC32    0               ; Reserved
    LDR        PC, [PC,#24]    ; Branch to irq_handler
    LDR        PC, [PC,#24]    ; Branch to fiq_handler


    DC32    __iar_program_start
    DC32    OS_CPU_ARM_ExceptUndefInstrHndlr
    DC32    OS_CPU_ARM_ExceptSwiHndlr
    DC32    OS_CPU_ARM_ExceptPrefetchAbortHndlr
    DC32    OS_CPU_ARM_ExceptDataAbortHndlr
    DC32    0
    DC32    OS_CPU_ARM_ExceptIrqHndlr
    DC32    OS_CPU_ARM_ExceptFiqHndlr


;********************************************************************************************************
;                                   LOW-LEVEL INITIALIZATION
;********************************************************************************************************

    SECTION FIQ_STACK:DATA:NOROOT(3)
    SECTION IRQ_STACK:DATA:NOROOT(3)
    SECTION SVC_STACK:DATA:NOROOT(3)
    SECTION ABT_STACK:DATA:NOROOT(3)
    SECTION UND_STACK:DATA:NOROOT(3)
    SECTION CSTACK:DATA:NOROOT(3)
    SECTION text:CODE:NOROOT(2)
    REQUIRE __vector
    EXTERN  ?main
    PUBLIC  __iar_program_start
    EXTERN  lowlevel_init

__iar_program_start:

;********************************************************************************************************
;                                    STACK POINTER INITIALIZATION
;********************************************************************************************************

    MRS     r0,cpsr                             ; Original PSR value
    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#SVC_MODE                     ; Set SVC mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(SVC_STACK)                  ; End of SVC_STACK

    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#UND_MODE                     ; Set UND mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(UND_STACK)                  ; End of UND_STACK

    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#ABT_MODE                     ; Set ABT mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(ABT_STACK)                  ; End of ABT_STACK

    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#FIQ_MODE                     ; Set FIQ mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(FIQ_STACK)                  ; End of FIQ_STACK

    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#IRQ_MODE                     ; Set IRQ mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(IRQ_STACK)                  ; End of IRQ_STACK

    BIC     r0,r0,#MODE_BITS                    ; Clear the mode bits
    ORR     r0,r0,#SYS_MODE                     ; Set System mode bits
    MSR     cpsr_c,r0                           ; Change the mode
    LDR     sp,=SFE(CSTACK)                     ; End of CSTACK


;********************************************************************************************************
;                                   ADDITIONAL INITIALIZATION
;********************************************************************************************************


;********************************************************************************************************
;                           CONTINUE TO ?main FOR ADDITIONAL INITIALIZATION
;********************************************************************************************************

    LDR     r0,=?main
    BX      r0

    END

相关帖子

沙发
herowa|  楼主 | 2009-3-30 13:33 | 只看该作者

这个问题解决了,新问题又出现了

如果0x00处放了一个别的程序(例如Boot)的中断向量表,但是现在用程序的中断向量表被放到0x2000处。程序的运行流程为:先从Boot启动,然后跳至0x2000处运行应用程序代码,如果此时有中断产生,那么会跑到哪个地方的中断向量表呢?

使用特权

评论回复
板凳
herowa|  楼主 | 2009-4-1 16:25 | 只看该作者

自己顶吧

调试的时候发现是回到Boot的中断向量表中。
现在想问:AT91SAM7X系列的ARM难道产生中断后必须先去找中断向量表?而不是像LPC系统的ARM,如果定义了向量中断,产生中断时就不需要去找中断向量表。

使用特权

评论回复
地板
sepnic| | 2009-4-7 10:53 | 只看该作者

是通过boot处的向量表再跳转到应用程序处吧

使用特权

评论回复
5
js_wawayu| | 2009-4-12 13:19 | 只看该作者

ARM的异常产生时都会跑到0地址开始的地方的。

使用特权

评论回复
6
kkgoing| | 2009-4-13 11:05 | 只看该作者

一般情况下中断向量表都是从0起始

一般情况下中断向量表都是从0起始。
如果一定要在0x2000,可以二次跳转中断。

使用特权

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

本版积分规则

24

主题

52

帖子

0

粉丝