FLASH、SRAM、编译文件 相关记录
前言
文章内容参考借鉴flag的小鱼塘的“STM32:堆和栈(Heap & Stack)及SRAM存储使用”文章
https://blog.csdn.net/qq_34810707/article/details/87942328
1、ROM、RAM、SRAM和FLASH的区别
RAM可以分为静态RAM(SRAM)、动态RAM(DRAM)
静态RAM(SRAM) | 读写速度最快,价格贵 | cpu一级二级缓冲,不需要动态刷新,掉电数据丢失 |
---|---|---|
动态RAM(DRAM) | 比SRAM读写慢,比ROM快,价格比SRAM便宜 | cpu内存,电路动态刷新,否者丢失数据;常见有FPRAM/FastPage、EDORAM、SDRAM、DDR RAM、RDRAM、SGRAM以及WRAM等, |
ROM可以区分为
PROM | 可编程,一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了 |
---|---|
EPROM | EPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器 |
EEPROM | 通过电子擦除,价格很高,写入时间很长,写入很慢 |
flash
flash | 具备电子可擦除可编程,掉电不丢失数据,代替ROM用作系统和程序代码存储 |
---|
2、SRAM存放内容
1、各个文件中声明和定义的全局变量、静态数据和常量(没有加const修饰);
2、HEAP区;
3、STACK区。
堆区(heap):一般由程序员使用malloc或new来进行分配,在适当的时候用free或delete来进行释放。若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。
栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。程序的中断,函数的形式参数传递等都需要STACK来实现。
注意:
1、堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。
2、所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。所以,如果栈大小为2K,一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!
3、 STM32的栈,是向下生长的。事实上,一般CPU的栈增长方向,都是向下的。而堆的生长方向,都是向上的。堆和栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。
4、程序中的常量,如果没加const也会编译到SRAM里,加了const会被编译到flash中。
3、编译文件中的Code、RO-data、RW-data、ZI-data含义
Code:表示程序所占用FLASH 的大小(FLASH)。
RO-data:即Read Only-data,表示程序定义的常量,如const 类型(FLASH)。
RW-data:即Read Write-data,表示已被初始化的全局变量(SRAM)
ZI-data:即Zero Init-data,表示未被初始化的全局变量(SRAM)