【简介】
在此贴中对S32K3 系列MCU 的全局变量的初始化过程有介绍(【S32K3XX】全局变量(.data)初始化过程),但对代码的实现过程并没有进一步描述,我们在此基础上进一步了解代码实现的过程。NXP 的data 段和bss 段数据的处理是在启动文件中完成的,和之前接触的一些芯片的处理方法上存在些差别,以下是S32K1X系列芯片的data 段和bss 段的数据处理流的代码,S32K1 系列的芯片处理流程是依赖编译器的来完成的,编译器会.data_init 的段存放在falsh 中,启动后将 data_init 区域的数据拷贝到 .data 段,bss 段是根据bss 段的起始地址和结束地址进行清零。
/* Data */
data_ram = __section_begin(".data");
data_rom = __section_begin(".data_init");
data_rom_end = __section_end(".data_init");
/* CODE RAM */
#pragma section = "__CODE_ROM"
#pragma section = "__CODE_RAM"
code_ram = __section_begin("__CODE_RAM");
code_rom = __section_begin("__CODE_ROM");
code_rom_end = __section_end("__CODE_ROM");
/* BSS */
bss_start = __section_begin(".bss");
bss_end = __section_end(".bss");S32K3 系列芯片相比S32K1 芯片对data 段和 bss 段分区分的更细,对于data 段按照属性划分为了RAM_CACHE/RAM_NO_CACHE/RAM_SHAREABLE/RAM_INTERRUPT, bss 按照属性分为了BSS_SHARE/BSS_NO_CACHE/BSS S32K3 系列芯片的处理方式本质上和S32K1 是一样的link文件中可以看到在flash 的末放置l了两张表 .init_table 和 .zero_table

对应的 table 数据如下
代码中对上述 table 对应的数据定义的数据结构如下:
/*!
* @brief Defines the init table layout
*/
typedef struct
{
uint8 * ram_start; /*!< Start address of section in RAM */
uint8 * rom_start; /*!< Start address of section in ROM */
uint8 * rom_end; /*!< End address of section in ROM */
} Sys_CopyLayoutType;
/*!
* @brief Defines the zero table layout
*/
typedef struct
{
uint8 * ram_start; /*!< Start address of section in RAM */
uint8 * ram_end; /*!< End address of section in RAM */
} Sys_ZeroLayoutType;上述 init table 中定义了要拷贝至 的 RAM 的地址(ram_start),从rom 拷贝的起始地址 rom_start 结束地址 rom_end, zero table 中的 ram_start /ram_end 定义了bss 的起始地址 和 结束地址。上述两个表的定义在启动文件中进行定义。对应定义如下:
.syntax unified .arch armv7-m /* Table for copying and zeroing */ /* Copy table: - Table entries count - entry one ram start - entry one rom start - entry one rom end ... - entry n ram start - entry n rom start - entry n rom end Zero Table: - Table entries count - entry one ram start - entry one ram end */ .section ".init_table", "a" .long 4 .long __RAM_CACHEABLE_START .long __ROM_CACHEABLE_START .long __ROM_CACHEABLE_END .long __RAM_NO_CACHEABLE_START .long __ROM_NO_CACHEABLE_START .long __ROM_NO_CACHEABLE_END .long __RAM_SHAREABLE_START .long __ROM_SHAREABLE_START .long __ROM_SHAREABLE_END .long __RAM_INTERRUPT_START .long __ROM_INTERRUPT_START .long __ROM_INTERRUPT_END .section ".zero_table", "a" .long 3 .long __BSS_SRAM_SH_START .long __BSS_SRAM_SH_END .long __BSS_SRAM_NC_START .long __BSS_SRAM_NC_END .long __BSS_SRAM_START .long __BSS_SRAM_END
上述的表中第一个成员是对应的table 的counter,代码中会读取该counter 来处理table.

以下代码段解析init_table 和 zero_table 根据这两个表的信息完成data bss 段的数据处理

我要赚赏金
