这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3】data 段 bss段数据初始化流程

共2条 1/1 1 跳转至

【S32K3】data 段 bss段数据初始化流程

高工
2025-10-31 19:55:18     打赏

【简介】

在此贴中对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 

image.png

对应的 table  数据如下image.png

代码中对上述 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.

image.png

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

image.png



院士
2025-11-03 10:30:07     打赏
2楼

催更,催更


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]