我正在为STM32F3Discovery板上运行的裸机应用程序构建链接程序脚本。它使用位于STM32Cube_FW_F3包中的CMSIS驱动程序中的启动代码,精确地是stm32f303xc.s文件。

上面的文件的一部分粘贴在下面,并引用了_sidata

/* start address for the initialization values of the .data section.
defined in linker script */
.word   _sidata
/* start address for the .data section. defined in linker script */
.word   _sdata
/* end address for the .data section. defined in linker script */
.word   _edata
/* start address for the .bss section. defined in linker script */
.word   _sbss
/* end address for the .bss section. defined in linker script */
.word   _ebss


对data和bss部分的开始和结束的引用是不言自明的,另一方面,我无法找到有关数据段初始化程序的任何信息。 SP在复位后设置后直接使用。

stm32f303xc.s

    .section    .text.Reset_Handler
    .weak   Reset_Handler
    .type   Reset_Handler, %function
Reset_Handler:
  ldr   sp, =_estack    /* Atollic update: set stack pointer */

/* Copy the data segment initializers from flash to SRAM */
  movs  r1, #0
  b LoopCopyDataInit

CopyDataInit:
    ldr r3, =_sidata
    ldr r3, [r3, r1]
    str r3, [r0, r1]
    adds    r1, r1, #4

LoopCopyDataInit:
    ldr r0, =_sdata
    ldr r3, =_edata
    adds    r2, r0, r1
    cmp r2, r3
    bcc CopyDataInit
    ldr r2, =_sbss
    b   LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
    movs    r3, #0
    str r3, [r2], #4

LoopFillZerobss:
    ldr r3, = _ebss
    cmp r2, r3
    bcc FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
    bl  main


_sidata应该指向哪个内存片段,它与数据段有什么关系?

最佳答案

数据段将位于RAM中。由于RAM不会因断电而保留其内容,因此启动时必须从闪存中复制数据段的初始值。为此,.data段的初始内容的副本位于_sidata标签上。启动代码将其复制到实际数据段中。

08-05 17:22