STM32内存管理以及堆和栈的理解

2023-05-16

今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了,写下来,方便以后查看,也想大家看了能指出哪里不对,然后修改。    




首先,先看一下stm32的存储器结构。

Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。

FLASH存储下载的程序。

SRAM是存储运行程序中的数据。

所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。

这是一个前提!

 

 







堆栈的认知

1.     STM32中的堆栈

这个我产生过混淆,导致了很多逻辑上的混乱。首先要说明的是单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。Stm32有通用寄存器R0‐R15 以及一些特殊功能寄存器,其中包括了堆栈指针寄存器。当stm32正常运行程序的时候,来了一个中断,CPU就需要将寄存器中的值压栈到RAM里,然后将数据所在的地址存放在堆栈寄存器中。等中断处理完成退出时,再将数据出栈到之前的寄存器中,这个在C语言里是自动完成的。

2.     编程中的堆栈。

在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明:

(1) 程序中的所有内容最终只会出现在flash,ram里(不外扩)。

(2) 段的划分,是将类似数据种类存储在一个区域里,方便管理,但正如上面所说,不管什么段的数据,都是最终在flash和ram里面。

C语言上分为栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。

MDK下Code,RO-data,RW-data,ZI-data这几个段:

Code是存储程序代码的。

​RO-data是存储const常量和指令。

​RW-data是存储初始化值不为0的全局变量。

​ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。

Flash=Code + RO Data + RW Data;

RAM= RW-data+ZI-data;

这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。

堆:是编译器调用动态内存分配的内存区域。

栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。

堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了。。。不然就等着hardfault找你吧。

3.     OS中的堆栈及其内存管理。

嵌入式系统的堆栈,不管是用什么方法来得到内存,感觉他的方式都和编程中的堆差不多。目前我知道两种获得内存情况:

(1)用庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。这种情况下,堆栈占用的内存就是上面说的:如果没有初始化数组,或者数组的初始化值为0,堆栈就是占用的RAM的ZI-data部分;如果数组初始化值不为0,堆栈就占用的RAM的RW-data部分。这种方式的好处是容易从逻辑上知道数据的来由和去向。

(2)​就是把编译器没有用掉的RAM部分拿来做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩下的RAM内存中的一部分或者全部进行内存管理和分配。这样的情况下就只需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就用首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。内存管理的算法多种多样,不详说,这样的情况下:OS的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。

这两种方法我感觉没有谁更高明,因为只是一个内存的获取方式,高明的在于内存的管理和分配。​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32内存管理以及堆和栈的理解 的相关文章

  • 算法:最长公共子序列

    10 8算法实验报告 最长公共子序列 题目 输出两个字符串的最长公共子序列 要求1 不使用辅助数组 span class token comment 要求1 xff1a 不使用辅助数组 span span class token keywo
  • 呆呆和你谈谈入职CVTE一个月的感受

    呆呆和你谈谈入职CVTE一个月的感受 你盼世界 xff0c 我盼望你无bug Hello 大家好 xff01 我是霖呆呆 xff01 啊啊啊啊啊 至6 18日入职新公司CVTE已经一个多月了 xff0c 在 你盼世界 xff0c 我盼望你无
  • 编程就是调用API?如何成为造轮子的程序员

    是 xff0c 编程就是调用各种API 什么是API xff0c 就是别人把较复杂的代码封装成一个个函数 xff0c 你不用管函数怎么实现的 xff0c 直接用就好 从这个角度讲 xff0c 使用所有库 xff0c 框架 xff0c 模板
  • 【电赛】2019电子设计竞赛 纸张计数显示装置(F题)

    点击 Github项目地址 设计下载 内含 xff1a 电赛论文 程序设计 机械结构设计 硬件电路设计 综合测评相关设计 交互显示设计 设计详细说明 2019年全国大学生电子设计竞赛 纸张计数显示装置 xff08 F题 xff09 本科组
  • 【ARM裸板】LCD硬件原理、时序及初始化

    文章目录 1 LCD与OLED的区别2 LCD原理2 1 颜色如何确定 xff1f 2 2 LCD如何 行扫描 xff1f 2 3 如何跳到下一行进行 行扫描 xff1f 2 4 如何进行下一个 场扫描 xff1f 3 LCD时序4 LCD
  • 【电赛】2019电赛纸张计数显示装置Github仓库说明

    Github项目地址 设计下载 内含 xff1a 电赛论文 程序设计 机械结构设计 硬件电路设计 综合测评相关设计 交互显示设计 设计详细说明 纸张计数显示装置Github仓库说明 x1f604 个人主页 x1f57a 电赛论文 x1f4d
  • 【Linux】mjpg-streamer 源码分析

    文章目录 1 总体流程2 主进程的源码分析2 1 参数接收与解析2 2 获取参数2 3 调用输入函数2 3 1 程序手动中断信号2 3 2 strchr 函数2 3 3 strndup 函数2 3 4 分离参数 3 输入通道源码分析3 1
  • STM32之TIM 舵机控制PWM

    目录 大概步骤 定时器介绍 输入通道 输入滤波器和边沿检测器 捕获通道 定时器初始化结构体详解 1 TIM TimeBaseInitTypeDef 定时器基本初始化结构体 TIM OCInitTypeDef 定时器比较输出初始化结构体 3
  • 【树莓派】树莓派采用MJPG-Streamer双摄推流至上位机,实测延时低至200ms[CSI摄像头+USB摄像头]

    树莓派采用MJPG Streamer双摄推流至上位机 实测延时低至200ms CSI摄像头 43 USB摄像头 总体流程1 硬件连接与软件及驱动配置1 xff09 检测是否存在USB摄像头设备2 xff09 安装 MJPG Streamer
  • 【DIY】基于OpenMV的STM32追球小车

    目录 xff1a 总体设计1 基础硬件DIY设计1 xff09 整体原理图2 xff09 PCB电路 2 OpenMV简单识别程序设计 与 STM32控制程序设计1 xff09 OpenMV简单识别程序设计 microPython 2 xf
  • 【电赛】2017年电赛A题——三相逆变电源EG8030测试

    目录 xff1a 一 相关简介二 专用逆变芯片E8030控制板三 驱动板四 实物测试 xff1a Github项目地址 设计下载 注 xff1a 本文仅用于学习交流分享 xff0c 若有不妥之处 xff0c 请指正 xff0c 感谢 关键词
  • 【STM32】STM32 OLED打点划线画圆 OLED电子罗盘 程序

    目录 xff1a 一 画点函数二 动态划线效果演示 xff1a 三 画圆函数效果演示 四 实心圆函数 注 xff1a 本文仅用于学习分享 用到的工具 xff1a STM32 MCU Keil 5 用到的库函数为 正点原子 STM32F4 库
  • 【STM32】OV2640摄像头学习笔记

    目录 xff1a 一 OV2640 Camera二 读取OV2640模块图像数据过程 xff1a 三 DCMI xff08 Digital camera interface xff09 接口四 SCCB协议1 起始信号2 停止信号 五 OV
  • 【笔记】MS5837-30BA压力传感器调试笔记

    文章目录 一 MS5837 30BA相关介绍1 技术参数2 典型应用电路3 PROM中的标定参数 二 MS5837 30BA数据解算1 解算流程图2 初始化读取标定参数并进行CRC校验 MS5837复位 MS5837 CRC4 bit 校验
  • 【通信协议】1-Wire 单总线

    文章目录 一 1 Wire相关介绍1 典型命令序列 xff1a 2 典型电路图 xff1a 二 1 Wire通信过程1 初始化2 写操作3 读操作 三 1 Wire程序 xff08 以DS18B20为例 xff09 DS18B20功能命令
  • linux 安裝mitmproxy

    1 安装mitmproxy sudo apt install python3 pip amp amp sudo pip3 install U pip amp amp sudo pip3 install mitmproxy 接下来需要安装证书
  • C++ 多态性的一些个人总结

    关于继承 xff1a public继承 xff0c 和其它两种继承方式 xff0c 子类对象可以访问基类的Public成员 xff0c 保护成员和私有成员只能在子类中访问 xff0c 而不能由子类对象进行访问 关于虚函数 xff08 每个虚
  • ubuntu用Dockerfile配置ros+cuda+torch镜像及rviz可视化

    dockerfile配置ros 43 cuda 43 torch镜像及rviz可视化 Dockerfile创建容器 Dockerfile 因工作环境 xff0c 需要有深度学习的那一套环境 xff0c 还要用到一些可视化的东西 xff0c
  • 简单理解TCP/IP协议栈

    协议定义的是一系列的通信标准 xff0c 通信双方需要共同按照这一标准进行正常的数据收发 xff1b 信的双方需要共同按照这一个标准进行正常的数据收发 xff1b xff08 两人 xff0c 说共同的语言 xff0c 不然不能交流 xff
  • ubuntu查看系统版本和linux内核版本

    lsb release a No LSB modules are available Distributor ID Ubuntu Description Ubuntu span class token number 18 04 span 5

随机推荐

  • 电路设计——教你如何阅读数据手册

    我们为什么要看数据手册 xff0c 数据手册又有什么作用呢 xff1f 我们能够从中得到哪些东西呢 xff1f 哪些是我们所需要的呢 xff1f 下面我们以AD847芯片为例来说一说我们在工作中以及设计中需要注意哪些方面 下面是芯片的数据手
  • ORB-SLAM3笔记(编译、踩坑、论文、看代码)

    目前基于orb slam想做的方向 提升动态建图精度 xff08 东西Map就是上不去 KITTI有几个groundtruth官网下架了找不到而且 红外相机退化环境下的点线融合 数据集https sites google com view
  • 【树莓派】Ubuntu-mate安装及ROS安装

    树莓派使用之Ubuntu mate 烧录镜像至SD卡下载镜像烧录SD卡 将SD插入树莓派实物GIF安装流程 树莓派开机sudo reboot换源下载SSH首先得下载net tools下载openssh 电脑远程操作下载 Xshell设置远程
  • 【SLAM】ORB_SLAM3 初步调试运行详细记录

    前言 相关解析及参考 xff1a 超详细解读ORB SLAM3单目初始化 xff08 下篇 xff09 ORB SLAM3和之前版本有什么不同 xff1f 小白学视觉的技术博客 51CTO博客 orbslam3 官方源码地址 xff1a h
  • 如何实现一个简单的Ubuntu远程虚拟桌面

    文章目录 前言一 什么是noVNC xff1f 二 如何部署1 安装VNC服务端1 1 安装tigervnc standalone server1 2 安装tigervnc standalone server1 3 安装xserver xo
  • 软件开发经验总结 读源代码的艺术

    读取源代码是每一个开发人员成长的必经之路 xff0c 一份优秀的源代码 xff0c 是作者多年开发技术的心血结晶 xff0c 研究一份优秀的源代码 xff0c 总是能够让你的技术得到一定程度的提升 然后 xff0c 读别人的源代码并不是拿着
  • vsCode用户设置vue.js、保存格式化代码

    34 window zoomLevel 34 0 34 workbench iconTheme 34 34 vscode icons 34 34 editor wordWrap 34 34 on 34 vscode默认启用了根据文件类型自动
  • PX4姿态控制算法分析

    PX4姿态控制流程图 图片来源 Px4的姿态控制分为角度环 外环 和角速度环 内环 xff0c 角度环使用P控制 xff0c 角速度环使用PID控制 xff0c 由于偏航通道响应较慢 多旋翼飞行器的俯仰和滚转运动由旋翼的升力力矩产生 xff
  • 滤波器的设计(一)

    滤波器的设计 引言 对实际的控制系统而言 xff0c 采集到的原始信号往往是有噪声的 xff0c 而噪声往往会对系统的稳定性能产生隐患 xff1b 或为了提取有用的控制信号 xff0c 滤除不必要的频域成分 xff0c 数字滤波技术必不可少
  • 算法

    算法 xff08 Algorithm xff09 xff1a 计算机解题的基本思想方法和步骤 算法的描述 xff1a 是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述 xff0c 包括需要什么数据 xff08 输入什么数据 输出什
  • 延迟环节对控制系统的影响

    本文内容来自知乎浅谈控制器的增益大小 xff08 下 xff09 区分惯性环节与延迟环节 惯性环节 1 T s 43
  • 控制系统中"带宽"的理解

    本文来自对知乎文章如何入门自动控制的一些理解 首先来看几个概念 xff1a 带宽频率也称为闭环截止频率 xff0c 是指当闭环幅频特性下降到频率为零时的分贝值以下3dB时 xff0c 对应的频率 xff0c 记作 w b w b w b 开
  • 多旋翼无人机建模-牛顿欧拉法

    多旋翼无人机建模 建模之前我们先分析一下多旋翼无人机有哪些状态量 xff1a 用于表示线运动的三轴位置 速度和加速度 xff1b 用于表示角运动的三轴姿态角和姿态角速度 xff1b 这一共是15个状态量 首先来看线运动方程的建立过程 xff
  • 基于最小二乘法的磁力计椭球拟合方法

    基于最小二乘法的磁力计椭球拟合方法 在写飞控代码时 xff0c 必然要对磁力计的测量数据进行校正 xff0c 本文将介绍一种简单实用的校正方法 基于最小二乘法的椭球拟合方法 本文椭球拟合部分来自博文IMU加速度 磁力计校正 xff0d xf
  • 多旋翼无人机飞控系统设计之详细设计方案

    在进行多旋翼无人机飞控系统设计之前 xff0c 有必要列写一份详细的设计方案书 xff1b 这是飞控系统设计的基石 xff0c 并且在一定程度上指导了后续的研发工作 本篇博文列写了之前笔者在进行无人机飞控开发过程中所撰写的精简版本的设计方案
  • 梅森公式确定系统的传递函数

    梅森增益公式 xff1a 对于一些比较复杂的系统 xff0c 采用结构图等效简化的方法求系统的传递函数是比较麻烦的 而使用梅森公式 xff0c 则可以不用做任何变换 xff0c 只要通过对信号流图进行相应的分析就能直接写出系统的传递函数 下
  • 多旋翼无人机控制之完整闭环控制设计

    本文主要讲解了多旋翼无人机整个闭环系统的设计流程 xff0c 对各个控制器的控制输入与输出 xff0c 控制器的设计要点进行了详细描述 控制逻辑 Q 要让多旋翼无人机按照预设的航线进行飞行 xff0c 需要设计哪些控制器呢 xff1f A
  • 频域分析之超前校正

    本文将主要介绍使用频域响应法进行控制器设计时一种常用且重要的方法 超前校正 超前校正能使系统的瞬态响应得到显著改善 xff0c 而对系统稳态精度的影响则很小 首先来看超前校正的一般形式 K c T
  • 飞控中的一些知识点总结

    本文主要总结了飞控研发过中一些比较重要的知识点 xff0c 部分为本人的实际经验 xff0c 部分为知乎转载 影响飞控性能的一些因素 xff1a 飞控姿态控制算法比较固定 xff0c 基本上都是角度环和角速度环组成的串级PID算法 xff0
  • STM32内存管理以及堆和栈的理解

    今天仔细读了一下内存管理的代码 xff0c 然后还有看了堆栈的相关知识 xff0c 把以前不太明白的一些东西想通了 xff0c 写下来 xff0c 方便以后查看 xff0c 也想大家看了能指出哪里不对 xff0c 然后修改 首先 xff0c