问题
芯片通常会有一段rom flash映射到cpu的0地址,当芯片复位时,直接运行rom flash的代码,既然是rom flash,那么肯定不能往flash写数据。但是我们代码里难免会用到堆和栈,以及一些全局可读写变量,那这些内容该放到哪里呢,在什么时候放的?
放到哪里
- 堆栈:可以分配一块sram空间,设置堆和栈指向这块区域
- 全局变量:同样是把rom flash中的可读写段搬移到sram中
- bss:放到全局变量后面的sram
什么时候放
在最初的启动汇编中,就要执行把这些堆栈、bss、全局变量准备好,然后才能跳转到c函数中
从哪里搬到哪里
可能我们还会有一个疑问,启动汇编怎么知道rom flash的哪些段要搬到sram中?
那这就要看看arm的链接规范了。
ARM® Compiler toolchain Linker
这份文档讲了以下内容
- 链接命令及使用
- 镜像结构
- 链接符号
- scatter文件使用
下面这张图说明了rom flash分为ro段和rw段,rw段需要再rom startup阶段copy到ram中。
arm链接器为image中的每个段生成以下类型相关符号,需要通过特殊指令来使load和image地址相同,否则它俩是不一致的。
- image$$ :代表图中execution的地址
- Load$$:代表图中load的地址
Reference
https://developer.arm.com/documentation/dui0474/latest/
标签:rom,sram,读写,flash,romcode,image,arm From: https://www.cnblogs.com/lvzh/p/16719589.html