【简介】
S32K3XX 系列系列有着丰富的RAM资源,本地使用的S32K328片内有三块SRAM,每块大小为256KB
对应的RAM 范围为0x20400000~204bffff,此地址范围和link file 中的定义的范围也是匹配的。
从芯片手册中可以看出SRAM0 的64KB支持standby 模式保存的属性,从说明可知RAM 支持ECC ,每64bit ram 数据对应 8bit 的ECC校验码,采用的ECC算法为SECDEC
对于64KB的Standby RAM link file 中有如下配置弱国超出64KB 会触发异常的断言。
__STANDBY_RAM_LIMIT_END = 0x2040FFFF; /* 64Kbyte for standby ram */ .sram_bss (NOLOAD) : { . = ALIGN(8); __standby_ram_begin__ = .; *(.standby_data) . = ALIGN(8); __standby_ram_end__ = .; . = ALIGN(16); __sram_bss_start = .; *(.bss) *(.bss*) . = ALIGN(16); *(.mcal_bss) . = ALIGN(4); __sram_bss_end = .; } > int_sram ASSERT(__standby_ram_end__ <= __STANDBY_RAM_LIMIT_END, "Memory for standby ram overflow")
S32K3 系列芯片是支持ECC特性的,ECC 默认为开启状态,使用RAM资源前需要对RAM 进行ECC初始化处理,启动代码中有如下的初始化处理。
/******************************************************************/ /* Autosar Guidance - The start-up code shall initialize a */ /* minimum amount of RAM in order to allow proper execution of */ /* the MCU driver services and the caller of these services. */ /******************************************************************/ RamInit: /* Initialize SRAM ECC */ ldr r0, =__RAM_INIT cmp r0, 0 /* Skip if __RAM_INIT is not set */ beq SRAM_LOOP_END ldr r0, =MCRGM_DES ldr r1, [r0] ldr r2, =MCRGM_DES_F_POR and r1, r1, r2 cmp r1, 0 beq NO_INIT_STANDBY_REGION ldr r2, =__INT_SRAM_START ldr r3, =__INT_SRAM_END b ZERO_64B_RAM NO_INIT_STANDBY_REGION: #ifdef EXTEND_LOWRAM_DERIVATIVES #if defined(S32K310)||defined(S32K311)||defined(S32M276)||defined(S32M274) ldr r2, =__BSS_SRAM_NC_START #else ldr r2, =__BSS_SRAM_START #endif #else ldr r2, =__BSS_SRAM_START #endif ldr r3, =__INT_SRAM_END ZERO_64B_RAM: cmp r2, r3 bge SRAM_LOOP_END movs r0, 0 movs r1, 0 SRAM_LOOP: strd r0, r1, [r2], #8 cmp r2, r3 blt SRAM_LOOP SRAM_LOOP_END:
以上代码 RAM 的ECC 的初始化是否执行是根据__RAM_INIT flag 来决定是否进行初始化,此符号是在link file中进行的定义,默认值为1,对应代码如下:
我们可以修改__RAM_INIT = 0 来关闭RAM ECC 初始化处理。
上述初始化代码会根据当前启动是否为POR 重启,如果是POR 重启则对整片的SRAM进行初始化,如果为非POR重启则跳过standby 的RAM区域进行初始化。以下的代码根据是否初始化standby RAM 来配置初始化RAM 的开始结束地址。
上述的符号的定义也是在link file 中进行定义。