当前位置: 首页 > news >正文

S32K3启动RAM数据初始化

想要搞清这个问题,需要重点研究startup_cm.s文件。

启动时,RAM数据的初始化主要包括两个过程:

  1. RAM区域初始化(数据清0);
  2. 有初始值的变量需要从flash中加载到ram中。

RAM区域初始化

这一段代码由汇编实现,在startup_cm.s中,主要由DTCM_Init和RamInit实现的,贴一段DTCM_Init的代码:

DTCM_Init:
/* Initialize DTCM ECC */
LDR R0, =__DTCM_INIT
CMP R0, #0
/* Skip if __DTCM_INIT is not set */
beq DTCM_LOOP_END

LDR R1, =__INT_DTCM_START
LDR R2, =__INT_DTCM_END

SUBS R2, R1
SUBS R2, #1
BLE DTCM_LOOP_END

MOVS R0, #0
MOVS R3, #0
DTCM_LOOP:
STM R1!, {R0, R3}
SUBS R2, #8
BGE DTCM_LOOP
DTCM_LOOP_END:

加载变量

在startup_cm.s中有个函数_DATA_INIT,通过该函数跳转到C代码startup.c,由init_data_bss这个函数实现。分析init_data_bss的代码,可以发现__INIT_TABLE作为.init_table起始地址的标签,会被强转为Sys_CopyLayoutType *结构体指针,

typedef struct

{

uint32 * ram_start; /*!< Start address of section in RAM */

uint32 * rom_start; /*!< Start address of section in ROM */

uint32 * rom_end; /*!< End address of section in ROM */

} Sys_CopyLayoutType;

然后访问该结构体的成员,就得到了相应区域的ram起始地址,rom起始地址,rom结束地址,从而实现数据从flash加载到ram中。

最后贴一下__INIT_TABLE,可以发现每三行正好对应结构体的3个成员:
__INIT_TABLE
DCD 9
DCD rwBlock$$Base
DCD cacheable_data_init$$Base
DCD cacheable_data_init$$Limit
DCD rwMcalDataBlock$$Base
DCD cacheable_mcal_data_init$$Base
DCD cacheable_mcal_data_init$$Limit
DCD ramCodeBlock$$Base
DCD cacheable_code_init$$Base
DCD cacheable_code_init$$Limit
DCD dataNcBlock$$Base
DCD non_cacheable_data_init$$Base
DCD non_cacheable_data_init$$Limit
DCD constNcBlock$$Base
DCD non_cacheable_const_init$$Base
DCD non_cacheable_const_init$$Limit
DCD dataShBlock$$Base
#if (!defined(CORE0) && defined(MULTIPLE_IMAGE))
DCD 0
DCD 0
#else
DCD shareable_data_init$$Base
DCD shareable_data_init$$Limit
#endif
DCD intcVectorBlock$$Base
DCD interrupt_vector_init$$Base
DCD interrupt_vector_init$$Limit

DCD dataDtcmBlock$$Base
DCD dtcmDataBlock_init$$Base
DCD dtcmDataBlock_init$$Limit
DCD textItcmBlock$$Base
DCD itcmCodeBlock_init$$Base
DCD itcmCodeBlock_init$$Limit
__INIT_TABLE_END

http://www.cnnetsun.cn/news/136582.html

相关文章:

  • 基于单片机的多功能万年历
  • AI搜索时代:技术演进、产业分化与深度变革
  • SGMICRO圣邦微 SGM2019-2.5YC5G/TR SC70-5 线性稳压器(LDO)
  • 一文搞懂 低功耗蓝牙BLE 中的 ATT、GATT、MTU 与 20 字节限制
  • 别让“大锅饭”逼走你的Top Sales:揭秘薪酬误差的副作用
  • 27827828
  • 12.17 vue递归组件
  • QtScrcpy高刷投屏优化指南:告别卡顿,享受流畅体验
  • 终极移动端Windows应用运行指南:从零到流畅体验
  • 大学里的网络安全专业为什么没多少人就读?
  • 信息安全和网络空间安全这2个专业怎么选?老网安告诉你答案!
  • 英语发音MP3音频库:119,376个单词标准发音完整解决方案
  • 瞄准2026:AI安全、数据隐私与云原生——网络安全趋势预测与挑战分析
  • 重磅收藏!Java程序员转AI大模型:从代码高手到AI架构师的进阶指南
  • 2026网络安全进阶路线:盘点撬动高薪的四大关键证书
  • LangGraph实战教程:构建智能旅游规划助手,深入理解AI工作流架构【值得收藏】
  • 淘宝直播弹幕采集完整指南:5分钟快速上手数据分析
  • 文本驱动可视化:5分钟掌握专业级图表制作
  • Clipper2多边形处理技术深度解析与实战应用
  • 错过再等十年:AI驱动的生物制药Agent智能实验设计新范式
  • 造纸车间的“信号指挥官”:耐达讯自动化Profinet六路集线器,让变频器“步调一致”
  • MaterialDesignInXamlToolkit实战指南:5步打造现代化WPF界面
  • 中东电商市场,正在成为中国卖家的必争之地!
  • 为什么你的边缘Agent总是部署失败?深度剖析常见陷阱与对策
  • 一文搞定前端CSS常用布局
  • Kotaemon用户行为分析插件开发教程
  • 额温枪PCBA方案开发全流程规划
  • Kotaemon针灸穴位查询:图文结合精准定位
  • 二极管钳位三电平VSG仿真模型 1.加入中点电位平衡 2.仿真有视频教程 3.THD均<5%
  • 通达信轻松买卖点副图,源码分享