STM32内存知识你真的了解吗?

发布者:HeavenlyClouds最新更新时间:2022-04-28 来源: eefocus关键字:STM32  RAM 手机看文章 扫描二维码
随时随地手机看文章

1.内存图注释

STM32内存被总分为flash(ROM)和sram(RAM),然后分别又包含这几个部分。

在这里插入图片描述

在这里插入图片描述

1、code代码存储区:存放函数体的二进制代码。

2、Ro-data:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放

3、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。

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

5、static:初始化的全局变量和静态变量放在一块区域.

6、Zi-data:未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。

7、栈向下生长,内存地址由高至低;堆向上,内存地址由低至高

2.计算代码量大小

大家先看下STM32编译后的这张图,然后对照着上图分析下。

在这里插入图片描述

这个程序的大小:


Flash(ROM)=Code+Ro-data

Sram(RAM)=Rw-data+ZI-data


我们的程序断电后不运行,重新上电后继续运行,为什么会这样呢??因为flash(ROM)里面的数据掉电可保存。


3.静态存储与动态存储的区别

3.1 静态存储

1.静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。


2.程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会


3.自动释放所占用的内存空间。


4.变量的分配与释放,都无须程序员自行考虑。


5.基本类型,数组


3.2 动态存储

1.用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配

2.函数形式参数

3.函数中定义的没有用关键字static声明的变量

4.函数调用时的现场保护和返回地址等存放在动态存储区,函数调用开始时分配,函数结束时释放。在程序执行过程中,这种分配和释放是动态的


3.3 区别

1.静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。

2. 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。

3. 动态内存分配需要指针和引用类型支持,静态不需要。

4. 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。


4. 举例

int a = 0;          // RW-data 全局初始化区 

char *p1;           // ZI-data 全局未初始化区 bss 

const int b = 0;    // RO-data 只读变量区

volatile const int b = 0;  // RW-data 全局初始化区

main(void)

{

  int b;            // RW-data 栈区 

  char s[] = "abc"; // RW-data 栈区

  char *p2;         // RW-data 栈区

  char *p3 = "123456";     // "123456" 在Ro-data 常量区,p3在RW-data 栈区

  static int c =0;         // 全局(静态)初始化区 RW-data static区

 

  p1 = (char *)malloc(10);

  p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在Rw-data 堆区

 

  strcpy(p1, "123456");    // "123456" 放在常量区,编译器可能会将它

                           // 与p3所指向的"123456"优化成一个地方

}


5. 程序莫名死机问题

猜想因为申请了很多临时变量,可能需要调整Stack_Size的大小 在STM32F10x.s文件中

修改Stack_Size EQU 0x00000200

成Stack_Size EQU 0x00000800

情况会好很多。


关键字:STM32  RAM 引用地址:STM32内存知识你真的了解吗?

上一篇:不得不说的USART中的重定向问题
下一篇:我也是醉了,KEIL5程序下载后不自动运行?

推荐阅读最新更新时间:2024-11-09 11:50

STM32 MCU的工作原理、基本结构及优缺点
STM32 MCU是STMicroelectronics公司生产的一款基于ARM Cortex-M内核的32位微控制器,广泛应用于汽车电子、工业控制、消费电子等领域。本文将介绍STM32 MCU的工作原理、基本结构以及优缺点。 一、STM32 MCU的工作原理 STM32 MCU采用基于ARM Cortex-M内核的32位RISC处理器,具有高性能、低功耗等特点。其工作原理如下: 1.启动过程:当STM32 MCU上电时,首先进行启动过程,包括复位电路和系统时钟初始化。 2.中断处理:在运行过程中,STM32 MCU会响应外部中断请求,进入中断处理程序进行处理。 3.外设驱动:STM32 MCU需要与各种外部设备进行通信,因此
[单片机]
STM32硬件错误的调试技巧
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。 这说明STM32出现了硬件错误。 硬件错误中断 STM32出现硬件错误可能有以下原因: 数组越界操作; 内存溢出,访问越界; 堆栈溢出,程序跑飞; 中断处理错误; 遇到这种情况,可以通过以下2种方式来定位到出错代码段。 方法1: 在硬件中断函数HardFault_Handler里的while(1)处打调试断点,程序执行到断点处时点击STOP停止仿真。 示例 1.2 在Keil菜单栏点击View——Registers Window,在寄存器查看窗口查找R14(LR)的值。 如果R
[单片机]
<font color='red'>STM32</font>硬件错误的调试技巧
STM32串口蓝牙实验--蓝牙控制小灯
用的正点原子的串口模板 V3接线 效果,可以控制PB5开关 #include led.h #include delay.h #include key.h #include sys.h #include usart.h int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为115200 LED_Init(); //LED端口初始化 KE
[单片机]
<font color='red'>STM32</font>串口蓝牙实验--蓝牙控制小灯
智能小车运行及测速原理
光电码盘测速原理 如何求解小车速度参数(大小与方向)? 测量速度方向的方法 根据A、B两相脉冲的超前滞后关系确定电机旋转方向: 假定A相超前于B相时,为电机正方向;则当A相滞后于B相,当前电机为反向旋转。 普通测量速度大小的方法 单位时间内采集的脉冲数就是转速大小的表征值,可以根据它转换为各种单位下的转速大小。 四倍频测量速度的大小 下面我们说一下编码器倍频的原理。为了提高大家下面学习的兴趣,我们先明确,这是一项实用的技术,可以真正地把编码器的精度提升 4 倍。作用可类比 于单反相机的光学变焦,而并非牺牲清晰度来放大图像的数码变焦。OK,先看看下面编码器输出的波形图。 这里,我们是通过软件的方法实现四倍频。首先
[单片机]
智能小车运行及测速原理
cw32和stm32的区别
cw32和stm32的区别 CW32和STM32是两种常见的单片机,分别由芯源半导体和STMicroelectronics公司生产。单片机是一种嵌入式系统,它集成了处理器、内存、输入/输出接口和其他组件,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机性能的一个重要因素。CW32使用ARM Cortex-M0内核,最高主频为48MHz,内置64KB闪存和12KB SRAM,可扩展至256KB闪存和32KB SRAM。而STM32则使用更强大的Cortex-M3/M4内核,最高主频可达200MHz,内置至少64KB闪存和20KB SRAM,同时支持高达
[单片机]
结构体对齐在STM32中的具体体现和如何进行不同对齐方式的设置
引言 在嵌入式系统开发中,结构体作为一种常见的数据组织方式,在内存中的布局方式对于程序性能和内存占用具有重要影响。本文将深入探讨单片机C语言中的结构体对齐原理、重要性以及不同的对齐方式,并通过示例演示结构体对齐如何影响内存占用、访问性能以及传输与存储。同时,我们将关注STM32这样的嵌入式系统,讨论结构体对齐在STM32中的具体体现和如何进行不同对齐方式的设置。 结构体对齐原理 1、为什么需要对齐? 在计算机内存中,数据的存储通常需要按照一定规则进行,这被称为内存对齐。内存对齐的目的是为了提高访问数据的效率,特别是对于硬件平台而言。不同的处理器架构可能有不同的对齐要求。 2、不同的对齐方式 单字节对齐(By
[单片机]
结构体对齐在<font color='red'>STM32</font>中的具体体现和如何进行不同对齐方式的设置
详解STM32最小系统电路
STM32最小系统硬件组成 最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是STM32入门的基础。 组成: · 电源 · 复位 · 时钟 · 调试/下载接口 · 启动 电源 3.3V的电源从这里接入,其中电容起到滤波的作用。 复位电路 当RESET引脚被拉低产生外部复位时,产生复位脉冲,从而使系统复位。 有三种复位方式: · 上电复位 · 手动复位 · 程序自动复位 上电复位 ,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,需求的复位信号持续时间约在1ms左右,计算方式如下: t = 1.1RC(固定计算公式) 1.1*10K*0.1uF
[单片机]
STM32——高级定时器、通用定时器、基本定时器 的区别
TIM1和TIM8定时器的功能包括【增强型】: ● 16位向上、向下、向上/下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ● 多达4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 死区时间可编程的互补输出 ● 使用外部信号控制定时器和定时器互联的同步电路 ● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 ● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 ● 如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发
[单片机]

推荐帖子

工作机会来啦
hi我是一家国内知名软件外包公司的HR。现有一外派在日本工作的职位,要求:4年左右嵌入式C\\C++开发经验,日语流利。如对这个职位有意向,可与我祥谈。MSN:jill_xu@MSN.com谢谢!工作机会来啦没遇到过这种情况.
vanlin1012 嵌入式系统
晒WEBENCH设计的过程+设计TMS320F2812的供电电源
TMS320F2812供电系统由有一个3.3V@1A的外设模块电源和1.8V@0.5A的内核电源构成。因此属于多负载电源。第一步:打开TI官网就能看到WEBENCH,在TI的WEBENCH里,点PowerArchitect,即进入多负载电源设计第二步:添加负载电源。如下图所示,LOAD_1和LOAD_2为2路负载电源。修改电源电压输入范围及2路负载输出电压、电流。在本设计中考虑输入选用DC8V~DC16V之间,LOAD_1输出3.3V@1A,LOAD_2输出1.8V@0.5A
ltbytyn 模拟与混合信号
stm32ADC转换输出波动大的问题
我是用stm32f103c8t6最小系统板发现的,在ADC转换时不插传感器读取数值正常,但是插上传感器数据就有巨大的波动,请问这个问题该怎么解决?希望大佬解答一下,感谢!!stm32ADC转换输出波动大的问题先检查传感器的输出变化情况,如果传感器输出本身就变化很大,ADC输出变化大才是应该的。检查传感器输出另外STM32的ADC还需要加放大器缓冲开启ADC校准没? 开启了 我插的是水位传感器,如果不在水里显示应该是0,但是就算滤波之后也还是1000多,换了像
新手滴滴滴 stm32/stm8
如何使用Verilog HDL语言实现在8*8LED点阵显示器上显示一个“北”字
如何使用VerilogHDL语言实现在8*8LED点阵显示器上显示一个“北”字~~~实在急需~~若有相似程序,可否借鉴一下~~多谢了~~~如何使用VerilogHDL语言实现在8*8LED点阵显示器上显示一个“北”字
bpt888 嵌入式系统
温度对变压器的影响
变压器的指标主要有温升,调整率,功率,输入电压范围,空载电流,抗电强度六项。各项指标之间相互关联又相互制约。为了描述它们之间的关系,可以把每一项指标作为一个轴,越向外该指标越好,越靠近原点越差。这样就可以围成一个六边形。当变压器的体积,磁通密度,电流密度确定后,六边形的面积也就是确定的。通常设计时都采取了折中的方案,图形接近于正六边形。当拔高某项指标时,就会出现右图的情况,功率增大了,但是要牺牲其他的指标作为代价。并且六边形越偏离原点,制作成本越高,性价比越低。温度是决定变压器寿命的
bjyhdc 工控电子
cpld与fpga的区别
系统的比较,与大家共享:尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但由于CPLD和FPGA结构上的差异,具有各自的特点:①CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。③在编程上FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连
glorey FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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