【问题标题】:what is the program entry label _iar_program_start use for in IAR Workbench for ARM?IAR Workbench for ARM 中的程序条目标签 _iar_program_start 用于什么?
【发布时间】:2015-02-20 08:06:08
【问题描述】:

我正在使用 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】:

    这是旧的,但无论如何我都会回答。

    如果您查看 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 2012-06-09
      • 2022-12-13
      • 2010-10-16
      • 2016-10-05
      • 2015-02-01
      • 2022-12-14
      • 2013-06-21
      相关资源
      最近更新 更多