我正在使用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
答案 0 :(得分: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