浅谈C语言内存分区和STM32存储器分配

发布者:RainbowJoy最新更新时间:2024-05-08 来源: elecfans关键字:C语言  STM32  存储器分配 手机看文章 扫描二维码
随时随地手机看文章

一、C语言内存分区

C语言内存分区示意图如下:

b9cbd4b6-f03b-11ee-a297-92fbcf53809c.png?imageView2/2/w/1000

1. 栈区

栈区介绍

栈区由编译器自动分配释放,由操作系统自动管理,无须手动管理。

栈区上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。

栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。

栈区是先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。

存放内容

临时创建的局部变量和const定义的局部变量存放在栈区。

函数调用和返回时,其入口参数和返回值存放在栈区。

2. 堆区

堆区介绍

堆区由程序员分配内存和释放。

堆区按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。

调用函数

用malloc等函数实现动态分布内存。

void *malloc(size_t);

参数size_t是分配的字节大小。
返回值是一个void*型的指针,该指针指向分配空间的首地址。
(void *型指针可以任意转换为其他类型的指针)

用free函数进行内存释放,否则会造成内存泄漏

void free(void * /*ptr*/);

参数是开辟的内存的首地址。

3. 全局(静态)区

全局(静态)区介绍

通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。

全局区有.bss段和.data段组成,可读可写。

.bss段

未初始化的全局变量和未初始化的静态变量存放在.bss段。

初始化为0的全局变量和初始化为0的静态变量存放在.bss段。

.bss段不占用可执行文件空间,其内容由操作系统初始化。

.data段

已初始化的全局变量存放在.data段。

已初始化的静态变量存放在.data段。

.data段占用可执行文件空间,其内容有程序初始化。

4. 常量区

字符串、数字等常量存放在常量区。

const修饰的全局变量存放在常量区。

程序运行期间,常量区的内容不可以被修改。

5. 代码区

程序执行代码存放在代码区,其值不能修改(若修改则会出现错误)。

字符串常量和define定义的常量也有可能存放在代码区。

二、STM32存储器分配

1. 随机存储器—RAM

RAM是与CPU直接交换数据的内部存储器,也叫主存(内存)。

它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。

当电源关闭时RAM不能保留数据(掉电数据消失哦)如果需要保存数据,就必须把它们写入一个长期的存储设备中(例如硬盘)。

2. 只读存储器—ROM

ROM所存数据,一般是装入整机前事先写好的,整机工作过程中只能读出,而不像随机存储器那样能快速地、方便地加以改写。

ROM所存数据稳定,断电后所存数据也不会改变。

本文使用是STM32F103芯片,keil V5环境下默认的内存配置见下图:

b9d0b364-f03b-11ee-a297-92fbcf53809c.png?imageView2/2/w/1000

ROM区域是0x8000000开始,大小是0x10000,这片区域是只读区域,不可修改,存放代码区和常量区。

RAM区域是0x20000000开始,大小是0x5000,这片区域是可读写区域,存放的是全局(静态)区、堆区和栈区。

该芯片的内部分区如下图所示:

b9e701e6-f03b-11ee-a297-92fbcf53809c.png?imageView2/2/w/1000


关键字:C语言  STM32  存储器分配 引用地址:浅谈C语言内存分区和STM32存储器分配

上一篇:STM32VCT6FSMC驱动3.5寸IPS全视角液晶屏
下一篇:基于STM32H7 UART空闲事件及DMA传输示例

推荐阅读最新更新时间:2026-03-24 23:39

一文读懂51单片机的RAM分区
51单片机RAM分为四个区域 1.工作寄存器区(00H~1FH) 2.位寻址区(20H~2FH) 3.用户RAM区(30H~7FH) 4.特殊功能寄存器(80H~FFH) 其中1.2.3处于RAM低128单元,4处于高128单元 也就是声明变量时data与idata位置 而栈就是在用户RAM区内人为开辟的一段空间,用于存放数据,而单片机也相应的为这段空间提供了硬件也就是SP寄存器 SP是一个8位寄存器用于存放栈顶位置
[单片机]
一文读懂51单片机的<font color='red'>RAM</font><font color='red'>分区</font>
嵌入式多媒体应用中的片上数据存储器分配方法
前 言 随着CPU速度的迅速提高,CPU与片外 存储器 的速度差异越来越大,匹配CPU与外部存储器的方法通常是采用Cache或者片上存储器。 微处理器 中片上存储器结构通常包含指令Cache ,数据Cache 或者片上存储器。对于嵌入式设备上的数据密集的应用,数据Cache 与片上存储器相比存在以下缺陷:(1) 片上存储器是固定的单 周期 访问,可在设计时而不是运行时研究数据访问模式;而Cache还要考虑击不中的情况,因而有可变的数据访问时间,执行时间的预测更加困难。(2) 使用Cache 执行时间的不可预测性影响编译器的优化;(3) 细颗粒的Cache 对于图像 编码 等的规则数据访问并不合适,因而使用Cache 对于嵌
[单片机]
嵌入式多媒体应用中的片上存储器分配
引 言 随着CPU速度的迅速提高,CPU与片外存储器的速度差异越来越大,匹配CPU与外部存储器的方法通常是采用Cache或者片上存储器。微处理器中片上存储器结构通常包含指令Cache ,数据Cache 或者片上存储器。对于嵌入式设备上的数据密集的应用,数据Cache 与片上存储器相比存在以下缺陷:(1) 片上存储器是固定的单周期访问,可在设计时而不是运行时研究数据访问模式;而Cache还要考虑击不中的情况,因而有可变的数据访问时间,执行时间的预测更加困难。(2) 使用Cache 执行时间的不可预测性影响编译器的优化;(3) 细颗粒的Cache 对于图像编码等的规则数据访问并不合适,因而使用Cache 对于嵌入式设备可能不是最优
[单片机]
STM32中的C语言知识点
下面就列出了一些STM32中重要的C语言知识点,初学的小伙伴可以多读几遍,其中大多知识点之前都有写过,这里重新整理一下,更详细地分析解释可以阅读附带的链接。 assert_param 断言(assert)就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 注意assert()是一个宏,而不是函数。 在STM32中,常常会看到类似代码: assert_param(IS_ADC_ALL_INSTANCE(
[单片机]
<font color='red'>STM32</font>中的<font color='red'>C语言</font>知识点
STM32——C语言知识点:指针、结构体
1 /* 2 ============================================================================ 3 Name : Cyuyanfuxi.c 4 Author : 5 Version : 6 Copyright : Your copyright notice 7 Description : Hello World in C, Ansi-style 8 ============================================================================ 9 */ 10 11
[单片机]
<font color='red'>STM32</font>——<font color='red'>C语言</font>知识点:指针、结构体
STM32开发中使用C语言实现IIC驱动
简述 IIC(Inter-Integrated Circuit)其实是IICBus简称,它是一种串行通信总线,使用多主从架构,在STM32开发中经常见到。 使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发,仍使用面向对象的思想封装AT24C64驱动。 IIC驱动面向对象封装 iic.h头文件主要是类模板的定义,具体如下: //定义IIC类typedef struct IIC_Typ
[单片机]
stm32 编程的收获,有关C语言(在stm32 公交报站中的收获)
1. char * msg = { //以下内容请自行修改 { 乘客您好,欢迎乘坐 }, { 2 路 }, //车次,采用单个数字变读(1读作幺)模式,读后恢复正常模式 { 公交车,本路车由 }, { 开往 }, { ,前门上车,后门下车,本车无人售票,请自备零钱 }, { 车辆起动,请站稳扶好 }, { 车辆转弯,请注意安全 }, { 前方到站 }, { 下车的乘客后门请 }, { 车站到了,请您带好随身物品,从后门下车,谢谢您的乘坐,再见 }, { 始发站 }, { 终点站 }, { soundk }, { 到了 } }; 指针数组:指针的数组。 在字符串定义的时候使用指针; 调用的时候 v
[单片机]
STM32单片机解码NEC红外控制器C语言程序
简介:红外遥控器发射码值的协议有很多种,在百度文库里搜“史上最全的红外遥控器编码协议”,可以看到是有43种,但是我们今天是解码NEC红外协议的,几乎所有的开发板带的小遥控器都是这个协议的,我是用的定时器配合外部中断写的解码程序。 #include ir_exti.h //利用外部中断和定时器进行红外解码 //在51上学习的 u8 irtime;//定时器时间累加 u8 irflag;//接收到第一个下降沿的标志 u8 irdate;//接收下降沿次数的累加 u8 irtable ;//装每一次下降沿的时间 //u8 irdateok; u8 irtable2 ;//解码出地址和数据 地址 地址反码
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved