单片机的内存这样划分?


单片机的内存

程序存储器

通常称为FLASH(即ROM),主要用于存放程序的代码段、data段、bss段和rodata段等。当单片机上电后,初始化汇编代码会将data段和bss段复制到RAM中,并建立好堆栈,开始调用程序的main函数。

数据存储器

则主要由读写存储器RAM组成,即SRAM。单片机运行时从FLASH中读取指令,而从RAM中读取与写入数据。RAM存在的意义在于其读写速度较快,有助于提升单片机的运行效率。

此外,从另一个角度,单片机的内存也可按照区域来分类:

内存的分区

栈区(stack)

栈区(stack):由编译器自动分配释放,用于存放函数的参数值、局部变量的值等。

堆区(heap)

堆区(heap):程序员可以在运行时根据需要申请和释放堆内存。若程序员不释放,程序结束时可能由操作系统回收。

全局区(静态区)

全局区(静态区):全局变量和静态变量的存储区域,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。

文字常量区

文字常量区:常量字符串就是放在这里的。这些数据是只读的,通常分配在RO-data(只读数据存储区),被包含在flash中。

这些内存区域与代码段、data段、bss段和rodata段共同构成了程序的内存布局。以下是对代码段、data段、bss段和rodata段的详细解释:

代码段(Code Segment):

代码段也被称为文本段或指令段,它包含了程序的可执行代码,即CPU执行的机器指令。编译器在编译程序时,会将源代码转换为机器语言,并将这些机器指令存储在代码段中。代码段是只读的,这意味着在程序执行期间,代码段的内容不能被修改。CPU通过程序计数器(Program Counter)来跟踪代码段中的当前执行位置,逐条执行指令。

data段:

data段用于存储程序中已初始化的全局变量和静态变量的值。这些变量在程序运行前已经被赋予了初始值,并在程序执行期间可以被修改。data段是可读写的,它位于程序的静态内存区域中,通常与代码段和bss段相邻。在程序加载到内存时,data段的内容会被加载到相应的内存地址中,以供程序在运行时访问和修改。

bss段:

bss段用于存储程序中未初始化的全局变量和静态变量。与data段不同,bss段中的变量在程序开始执行前没有被赋予任何值。这些变量在程序加载到内存时,会由操作系统或链接器自动初始化为0。bss段的存在主要是为了记录这些未初始化变量所占用的内存大小,并不真正占用可执行文件的空间。当程序运行时,操作系统会负责为bss段分配内存,并将其初始化为0。

rodata段:

rodata段用于存储程序中的只读数据,如字符串常量、const修饰的变量等,标定量一般就是放在这里。这些数据在程序执行期间是不可变的,即程序不能修改rodata段中的内容。将常量数据存储在rodata段中有助于保护数据不被意外修改,从而提高程序的稳定性和安全性。rodata段通常与代码段一起存储在只读内存区域中,以防止程序对其进行写操作。
需要注意的是,不同的编译器、操作系统和架构可能对内存段的命名和划分方式有所不同。

本文来源微信公众号:汽车电子研发者星球

本公众号致力于汽车电子相关知识分享,作为汽车电子研发者学习交流平台。
本公众号提供汽车行业各种资料,协议,相关书籍电子版下载。发布各种技术博文以及汽车行业新闻分享。感兴趣的朋友可以关注一波。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jory&W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值