【简介】
在S32K3XX 芯片中链接文件中对全局变量的处理的如下,从以下的处理可以看出初始化的全局变量会被放到__sram_data_rom 的ROM空间存放。
.sram_data : AT(__sram_data_rom) { . = ALIGN(4); __sram_data_begin__ = .; . = ALIGN(4); *(.ramcode) . = ALIGN(4); *(.data) *(.data*) . = ALIGN(4); *(.mcal_data) . = ALIGN(4); __sram_data_end__ = .; } > int_sram __sram_data_rom_end = __sram_data_rom + (__sram_data_end__ - __sram_data_begin__);
从 GCC 的链接脚本的中的说明AT语法指定全局变量的LMA 地址放到plash 中。
对应语法说明如下
以下是编译后的map 文件
.sram_data 0x20406648 0x108 0x20406648 . = ALIGN (0x4) 0x20406648 __sram_data_begin__ = . 0x20406648 . = ALIGN (0x4) *(.ramcode) .ramcode 0x20406648 0x88 ./RTD/src/Clock_Ip_Specific.o 0x204066d0 . = ALIGN (0x4) *(.data) .data 0x204066d0 0x0 ./FreeRTOS/Source/croutine.o .data 0x204066d0 0x0 ./FreeRTOS/Source/event_groups.o .data 0x204066d0 0x0 ./FreeRTOS/Source/list.o .data 0x204066d0 0x0 ./FreeRTOS/Source/queue.o .data 0x204066d0 0x0 ./FreeRTOS/Source/stream_buffer.o .data 0x204066d0 0x4 ./FreeRTOS/Source/tasks.o 0x204066d0 uxTopUsedPriority .data 0x204066d4 0x0 ./FreeRTOS/Source/timers.o .data 0x204066d4 0x4 ./FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1/port.o .data 0x204066d8 0x0 ./FreeRTOS/Source/portable/MemMang/heap_4.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/Vector_Table.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/exceptions.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/nvic.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/startup.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/startup_cm7.o .data 0x204066d8 0x0 ./Project_Settings/Startup_Code/system.o .data 0x204066d8 0x0 ./RTD/src/C40_Ip.o .data 0x204066d8 0x0 ./RTD/src/C40_Ip_Ac.o .data 0x204066d8 0x0 ./RTD/src/Cache_Ip.o .data 0x204066d8 0x0 ./RTD/src/Cache_Ip_HwAcc_ArmCoreMx.o .data 0x204066d8 0x4 ./RTD/src/Clock_Ip.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Data.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Divider.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_DividerTrigger.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_ExtOsc.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_FracDiv.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Frequency.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Gate.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_IntOsc.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Irq.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Monitor.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Pll.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_ProgFreqSwitch.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Selector.o .data 0x204066dc 0x0 ./RTD/src/Clock_Ip_Specific.o .data 0x204066dc 0x0 ./RTD/src/Det.o .data 0x204066dc 0x0 ./RTD/src/Det_stub.o .data 0x204066dc 0x0 ./RTD/src/Hse_Ip.o .data 0x204066dc 0x0 ./RTD/src/Igf_Port_Ip.o .data 0x204066dc 0x0 ./RTD/src/IntCtrl_Ip.o .data 0x204066dc 0x0 ./RTD/src/Lpuart_Uart_Ip.o .data 0x204066dc 0x0 ./RTD/src/Lpuart_Uart_Ip_Irq.o .data 0x204066dc 0x0 ./RTD/src/Mu_Ip_Irq.o .data 0x204066dc 0x0 ./RTD/src/OsIf_Interrupts.o .data 0x204066dc 0x0 ./RTD/src/OsIf_Timer.o .data 0x204066dc 0x0 ./RTD/src/OsIf_Timer_System.o .data 0x204066dc 0x0 ./RTD/src/OsIf_Timer_System_Internal_Systick.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_AEC.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_CortexM7.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_DCM_GPR.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_FLASH.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_MC_ME.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_MC_RGM.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_MC_RGM_Irq.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_PMC.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_PMC_Irq.o .data 0x204066dc 0x0 ./RTD/src/Power_Ip_Private.o .data 0x204066dc 0x0 ./RTD/src/SchM_Crypto_43_HSE.o .data 0x204066dc 0x0 ./RTD/src/SchM_Dio.o .data 0x204066dc 0x0 ./RTD/src/SchM_Mcl.o .data 0x204066dc 0x0 ./RTD/src/SchM_Mcu.o .data 0x204066dc 0x0 ./RTD/src/SchM_Port.o .data 0x204066dc 0x0 ./RTD/src/SchM_Uart.o .data 0x204066dc 0x0 ./RTD/src/Siul2_Dio_Ip.o .data 0x204066dc 0x0 ./RTD/src/Siul2_Port_Ip.o .data 0x204066dc 0x0 ./RTD/src/Tspc_Port_Ip.o .data 0x204066dc 0x0 ./board/Siul2_Port_Ip_Cfg.o .data 0x204066dc 0x0 ./board/Tspc_Port_Ip_Cfg.o .data 0x204066dc 0x0 ./common/debug.o .data 0x204066dc 0x0 ./common/hardfault_test.o .data 0x204066dc 0x0 ./common/hardfault_track.o .data 0x204066dc 0x0 ./common/hexdump.o .data 0x204066dc 0x0 ./common/mini_printf.o .data 0x204066dc 0x0 ./common/ringbuffer.o .data 0x204066dc 0x0 ./common/utilities.o .data 0x204066dc 0x0 ./generate/src/C40_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/Clock_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/Hse_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/Igf_Port_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/IntCtrl_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/Lpuart_Uart_Ip_Sa_PBcfg.o .data 0x204066dc 0x0 ./generate/src/OsIf_Cfg.o .data 0x204066dc 0x0 ./generate/src/Power_Ip_Cfg.o .data 0x204066dc 0x0 ./generate/src/Power_Ip_PBcfg.o .data 0x204066dc 0x0 ./littleshell/littleshell.o .data 0x204066dc 0x0 ./misc/reset_reason.o .data 0x204066dc 0x0 ./src/hse_service.o .data 0x204066dc 0x0 ./src/main.o .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-atoi.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcmp.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memmove.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-sprintf.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strcat.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strcmp.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strcpy.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strlen.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strncmp.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strncpy.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-strtol.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-ctype_.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-svfprintf.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-vfprintf_i.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memchr.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-freer.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-mallocr.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-reallocr.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-sbrkr.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-mlock.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-nano-msizer.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-reent.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/thumb/v7e-m+fp/hard\libgcc.a(_arm_truncdfsf2.o) .data 0x204066dc 0x0 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libnosys.a(sbrk.o) *(.data*) .data._impure_ptr 0x204066dc 0x4 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) 0x204066dc _impure_ptr .data.impure_data 0x204066e0 0x60 c:/nxp/s32ds.3.6.1/s32ds/build_tools/gcc_v10.2/gcc-10.2-arm32-eabi/bin/../lib/gcc/arm-none-eabi/10.2.0/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) 0x20406740 . = ALIGN (0x4) *(.mcal_data) .mcal_data 0x20406740 0x8 ./RTD/src/C40_Ip.o .mcal_data 0x20406748 0x4 ./RTD/src/Power_Ip.o 0x20406748 Power_Ip_pfReportErrorsCallback .mcal_data 0x2040674c 0x4 ./RTD/src/Siul2_Dio_Ip.o 0x2040674c Siul2_Dio_Ip_au32BaseAdresses 0x20406750 . = ALIGN (0x4) 0x20406750 __sram_data_end__ = .
从map 文件的__sram_data_rom/__sram_data_rom_end 的值可以知道全局变量的LVM(load address)。
上述代码为初始化的全局变量的数据拷贝过程,将ROM 中的数据加载到RAM中。