我正在用IDE (v6.50)在ARM皮层M3处理器上开发一个固件。我想知道用于程序条目的标签是否有用。我来解释。
在ARM平台上,当芯片复位时,PC会装载向量表的一个条目(在我的例子中是第二个条目)。因此,程序将从这个进位,在权力时间和每一个下一次重置。因此,开始地址取决于在这个条目中声明了什么。但是在IAR选项中,可以将标签定义为程序条目。默认情况下,程序条目是__iar_program_start。这是有可能的覆盖它。
但是如果PC在重置时加载了向量表的第二个条目,那么IAR入口点是用来做什么的?
我想知道这个问题,因为我试图在我现有的固件中集成CMSIS层,入口点不再是__iar_program_start,而是Reset_Handler。在IAR选项中,我首先尝试用"Reset_Handler“覆盖默认的入口点Reset_Handler,但是我有一个ielftool错误("ielftool错误:字符串'__vector_table‘没有在string表中找到")。解决方案是让默认的程序入口点在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发布于 2017-12-21 17:39:56
这是旧的但无论如何我都会回答的。
如果你看看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
https://stackoverflow.com/questions/27599051
复制相似问题