【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可编程,一次性的,也就是软件灌入后,就无法修改了,这种是早期的产品,现在已经不可能使用了
EPROMEPROM是通过紫外光的照射擦出原先的程序,是一种通用的存储器
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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值