什么是用于ARM的IAR Workbench中的程序条目标签_iar_program_start?

问题描述 投票:2回答:1

我正在使用IAR IDE(v6.50)在ARM CORTEX M3处理器上开发固件。我想知道用于程序输入的标签的有用性。我解释。

在ARM平台上,当芯片复位时,PC加载了向量表的一个条目(在我的例子中是第二个条目)。因此,程序将在电源时和每次下一次复位时从此地址开始。因此起始地址取决于此条目中声明的内容。但是在IAR选项中,可以将标签定义为程序条目。默认情况下,程序条目为__iar_program_start。可以覆盖它。

但是如果PC在重置时加载了向量表的第二个条目,那么IAR入口点是用来做什么的?

我想知道这个问题,因为我试图将CMSIS层集成到我现有的固件中,而且入口点不再是__iar_program_start,而是Reset_Handler。在IAR选项中,我首先尝试通过“Reset_Handler”覆盖默认入口点__iar_program_start但是我有一个ielftool错误(“ielftool错误:在字符串表中找不到字符串'__vector_table')。解决方案是让IAR链接器选项中的默认程序入口点,但我不明白为什么它不是Reset_Handler标签。

这是我的启动代码的一部分(它正在运行):

        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)
        SECTION PSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __cmain     
        EXTERN  SystemInit
        EXTERN  vPortSVCHandler                                 ; SVCall_Handler is renamed here
        EXTERN  xPortPendSVHandler                              ; PendsSV_Handler is renamed here
        EXTERN  xPortSysTickHandler                             ; SysTick_Handler is renamed here

        PUBLIC  __vector_table
        PUBLIC  __vector_table_0x1c
        PUBLIC  __Vectors
        PUBLIC  __Vectors_End
        PUBLIC  __Vectors_Size

        DATA

    __vector_table:
        DCD     sfe(CSTACK)                 ; Top of Stack
        DCD     Reset_Handler               ; Reset Handler

        DCD     NMI_Handler                 ; NMI Handler
        DCD     HardFault_Handler           ; Hard Fault Handler
        DCD     MemManage_Handler           ; MPU Fault Handler
        DCD     BusFault_Handler            ; Bus Fault Handler
        DCD     UsageFault_Handler          ; Usage Fault Handler
    __vector_table_0x1c:
            DCD     0                           ; Reserved
            DCD     0                           ; Reserved
            DCD     0                           ; Reserved
            DCD     0                           ; Reserved
            DCD     vPortSVCHandler             ; SVCall Handler
            DCD     DebugMon_Handler            ; Debug Monitor Handler
            DCD     0                           ; Reserved
            DCD     xPortPendSVHandler          ; PendSV Handler
            DCD     xPortSysTickHandler         ; SysTick Handler

        ; External Interrupts
        ...

__Vectors_End

__Vectors       EQU   __vector_table
__Vectors_Size  EQU   __Vectors_End - __Vectors

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;

       THUMB
       PUBWEAK Reset_Handler
       SECTION .text:CODE:REORDER(2)

Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0

        ... Other handlers....

__iar_program_start:    
        ;Process stack initialization 
        MRS     r0, CONTROL       ; Get PSR
        ORR     r0,r0,#0x00000002 ; Use Process Stack instead of Main Stack
        MSR     CONTROL, r0       ; 
        ISB                       ; flush pipeline
        LDR     sp, =SFE(PSTACK)  ; init Process Stack address

        ;Get back with Main Stack
        MRS     r0, CONTROL
        AND     r0,r0,#0xFFFFFFFD
        MSR     CONTROL, r0
        ISB

        BL  __cmain

        END
boot iar
1个回答
0
投票

这已经过时了,但无论如何我都会回答。

如果你看一下startup_.s,你应该看到这样的东西

Reset_Handler
    CPSID   I               ; Mask interrupts
    LDR     R0, =0xE000ED08
    LDR     R1, =__vector_table
    STR     R1, [R0]
    LDR     R2, [R1]
    MSR     MSP, R2
    LDR     R0, =SystemInit
    BLX     R0
    CPSIE   I               ; Unmask interrupts
    LDR     R0, =__iar_program_start
    BX      R0

如您所见,Reset_Handler分支到__iar_program_start

© www.soinside.com 2019 - 2024. All rights reserved.