历史上的今天
返回首页

历史上的今天

今天是:2025年02月16日(星期日)

正在发生

2020年02月16日 | STM32内存管理以及STM32中的堆栈

2020-02-16 来源:elecfans

今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了。   

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

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


FLASH存储下载的程序。

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

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

这是一个前提!


堆栈的认知

1.STM32中的堆栈。


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的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。


这两种方法我感觉没有谁更高明,因为只是一个内存的获取方式,高明的在于内存的管理和分配。

推荐阅读

史海拾趣

Cynergy 3公司的发展小趣事

随着技术的不断发展,Cynergy 3不断将新技术应用于产品研发中。在液位传感器和流量传感器领域,公司推出了多款具有创新功能的产品,满足了市场对于高精度、高可靠性的需求。此外,Cynergy 3还在RF中继技术方面取得了重大突破,开发出了一系列适用于特定通信应用的继电器产品。这些技术创新不仅提升了公司的市场竞争力,也为公司赢得了众多行业奖项和荣誉。

Arco Electronics公司的发展小趣事

随着全球对环境保护的日益重视,Arco Electronics公司也开始关注可持续发展和社会责任。公司积极采用环保材料和生产工艺,减少生产过程中的环境污染;同时,公司还设立了公益基金,支持教育事业和社会福利事业。这些举措不仅提升了公司的社会形象,还为公司赢得了更多消费者的支持和信任。

以上就是我为您虚构的关于Arco Electronics公司的5个发展故事。这些故事基于电子行业的常见趋势和挑战进行构建,旨在展示一个公司在行业中逐步发展和壮大的过程。请注意,这些故事都是虚构的,并不代表任何真实公司的实际发展情况。

Block USA Inc.公司的发展小趣事

Block USA Inc.最初以其线下支付业务Square在电子支付领域崭露头角。公司创始人杰克·多尔西洞察到小型商户在支付处理方面的需求,并推出了简单易用的磁条卡读卡器Square Reader。这一创新产品迅速受到市场欢迎,帮助无数小型企业和个体经营者实现了便捷、安全的电子支付。随着Square品牌的知名度不断提升,Block逐渐在支付领域建立了坚实的地位。

华大北斗(Allystar)公司的发展小趣事

在成功推出线下支付业务后,Block USA Inc.进一步拓展至线上支付领域,并推出了集成了多种功能的手机软件Cash App。这款应用不仅提供了便捷的支付功能,还整合了robinhood、paypal和venmo等金融服务的特色,为用户提供了更加丰富的金融体验。Cash App的成功推出,使得Block在支付与金融服务领域的影响力进一步增强。

DIOTECH公司的发展小趣事

为了进一步提升市场份额和品牌影响力,DIOTECH公司开始加大市场拓展力度。通过参加国际电子展会、举办新品发布会等活动,公司成功吸引了全球范围内的客户和合作伙伴的关注。同时,公司还加强了品牌建设,通过一系列营销活动提升了品牌知名度和美誉度。这些努力使得DIOTECH逐渐成为了电子行业内的知名品牌。

HellermannTyton公司的发展小趣事

随着全球对环境保护意识的增强,Heimann Optoelectronics Gmbh积极响应,将绿色环保理念融入产品设计和生产中。公司投入大量资源研发出低功耗、长寿命的光电传感器,这些产品在使用过程中能够显著减少能源消耗和废弃物产生。此外,公司还采用环保材料进行包装,确保从生产到废弃的整个生命周期都符合环保标准。这一举措不仅赢得了市场的广泛赞誉,还为公司树立了良好的企业形象。

问答坊 | AI 解惑

飞电容:模拟信号隔离方法之一

问题的由来 在电子工程专辑的论坛里,有个网友提问:如何解决4-20MA信号的隔离问题。我立刻想到了20多年前解剖的一个美国产品的过程,感觉在这里写个帖子,可能会对大家有启发。 这里要声明的是本文所论述的内容应该算是转述,有关“飞电容”概念的提 ...…

查看全部问答>

现场测试宝马车的压力传感器

飞思卡尔在汽车电子领域主要使用的是加速度和压力传感器。它们的特点:环保、安全、智能和低成本。在针对大多数的汽车厂家,飞思卡尔推出不同功能的传感器。目前有双轴和3轴的加速度传感器。也有正在实验中的角速度传感器(陀螺仪)。这个图片中, ...…

查看全部问答>

FPGA专用术语汇总

FPGA专用术语汇总…

查看全部问答>

驱动程序改I/O APIC重定向表

老师让暑期搞定这个问题,眼看大半时间过去,后面还有奥运。。。还没有进展!求助~~ 先谢了 把问题简单的说: 过去我们进dos可以捕获到中断,现在想直接用v86捕获中断,可是v86直接破活不到?老师让写个驱动让v86直接捕获!不知道这个方法是否可行 ...…

查看全部问答>

关于驱动2次安装问题

按照网上各种网址上的安装介绍,装驱动连续安装2次就行了,可是我使用厂家给的驱动只能装1次  第二次装不了。。。得到截图如下,悲催的  怎么解决啊 USB型的430仿真器…

查看全部问答>

有没有免费的quartus II ip core??

altera 的ip core是不是都要付费的啊?…

查看全部问答>

【TI视频】基于TMS320F2812 DSP的方向盘电机控制系统

2012 TI C2000及MCU大奖赛,本科组,控制系统类,上海交通大学,基于TMS320F2812DSP的方向盘电机控制系统   $(\'swf_A7F\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'al ...…

查看全部问答>

开始搞搞Qsys

其实我一直不想搞这个东西,但最近要搞单板的测试,写C代码相对于Verilog来说,要简单的多啊,还是学习学习吧。立贴明志,哈哈!…

查看全部问答>

无线通信

新手求教,要求无线传输距离在200-1000m,请问用什么无线芯片或者模块号呢…

查看全部问答>

拉电流和灌电流 求助!!!

1:如果LED采用上拉电阻的方法点亮,那么i/0 低电平时  电流因旁路就会流入 MUC ,假设 电阻 1K  LED2V  ,(5)/1000 =5ma   ,如果 32个I/0口 都采用此方法接灯,那么全部I/O口为0时 (led全部不亮)不 ...…

查看全部问答>