写在前面:
2018年前的最后一天班,临时总结一下程序在整个嵌入式芯片的运行过程与所涉及到的堆栈问题
- 从头说起
普通的嵌入式芯片分为处理器cortex-m3、存储器Flash、内存RAM。其中我们编译成机器码的bin文件是直接烧写进Flash,(后续想要做OTA空中升级的朋友们,只需要修改Flash里面的二进制文件就可以对之前的固件进行升级)。
程序开始启动
- 当系统上电后根据BOOT的引导配置选择启动方式,默认是Flash启动,
这时系统开始把所有的代码段搬到RAM中去运行RAM中只包含ZI-data、RW-data和堆栈空间 CPU就从内存中(RAM)获取数据和指令,根据相关指令来控制系统运行CPU从FLASH取指令,从RAM取数据- 数据存放位置:除了特定IO操作存到EEPROM里面,其他变量的使用全在RAM区,其中就有堆和栈。堆是由用户手动分配malloc,在整个程序运行期间都有效除非手动释放free。而栈在一个函数体内存在,例如main方法由系统自动创建,如果出现递归创建则很容易导致栈溢出,当系统执行完该函数功能后,栈空间数据也由系统自动销毁。
ROM和RAM数据比较
堆和栈的实际定义大小可查看,在.map文件中
编译后程序的大小
Cortex-M3内核结构图
代码存储区既可以由指令总线(I-Code)访问(当从此区取指时),也可以被数据总线(D-Code)访问(当从此区访问数据时),需要在中间插入一个总线 开关,称为“总线矩阵”
总结
内存大小直接体现该系统所能同时运行的任务数,而所有系统运行中产生的数据存放位置全都在RAM区。除了读写磁盘