【发布时间】: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
【问题讨论】: