历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月16日 | STM32学习笔记-STM32堆栈区(二)

2020-01-16 来源:eefocus

STM32的分区


STM32的分区从0x2000 0000(0x2000 0000是SRAM的起始地址,由此可知,堆栈等都是在RAM中的)开始。静态区,堆,栈。所有的全局变量,包括静态变量之类的,全部存储在静态存储区。 紧跟静态存储区之后的,是堆区(如没用到malloc,则没有该区),之后是栈区,栈在程序中存储局部变量。


先看启动文件startup_stm32f10x_md.s的定义:

;

Amount of memory (in bytes) allocated for Stack 


; Tailor this value to your application needs 


; Stack Configuration 


; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> 


;


Stack_Size

EQU 0x00000400


AREA

STACK, NOINIT, READWRITE, ALIGN=3 


Stack_Mem SPACE Stack_Size 


__initial_sp


; Heap Configuration 


; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 


;


Heap_Size

EQU 0x00000200


AREA

HEAP, NOINIT, READWRITE, ALIGN=3 


__heap_base 


Heap_Mem SPACE Heap_Size 


__heap_limit


这里定义了堆栈各自大小,堆:512bytes 栈1k;

所以栈区大小有限制,我们在局部变量中不要定义大数组否则容易溢出。


再看下code ro rw zi


Code指存储到flash【Rom】中的程序代码。


ZI英语是zero initial,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。


RW是可读可写变量,就是初始化时候就已经赋值了的,RW + ZI就是你的程序总共使用的RAM字节数。


RO是程序中的指令和常量,这些值是被保存到Rom中的。


Total ROM Size (Code +RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。


实际上,ROM中的指令至少应该有这样的功能:


将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。

将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。

例子:


1,首先来看:栈(STACK)的问题.


函数的局部变量,都是存放在“栈”里面,栈的英文是:STACK。STACK的大小,我们可以在stm32的启动文件里面设置,在startup_stm32f10x_hd.s里面,开头就有:


Stack_Size     EQU     0x00000800


表示栈大小是0X800,也就是2048字节,这样,CPU处理任务的时候,函数局部变量过多可占用的大小就是:2048字节。注意:是所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。


所以,如果一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault…


这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!


对于栈区,一般栈顶,也就是MSP,在程序刚运行的时候,指向程序所占用内存的最高地址。比如附件里面的这个程序序,内存占用如下图:

在这里插入图片描述

图中,我们可以看到,程序总共占用内存:20+2348字节=2368=0X940


那么程序刚开始运行的时候:MSP=0X2000 0000+0X940=0X2000 0940.

事实上,也是如此,如图:

在这里插入图片描述

图中,MSP就是:0X2000 0940,程序运行后,MSP就是从这个地址开始,往下给函数的局部变量分配地址。


2,再来说说,堆(HEAP)的问题.

全局变量,静态变量,以及内存管理所用的内存,都是属于“堆"区”,英文名:“HEAP”,与栈区不同,堆区,则从内存区域的起始地址开始分配给各个全局变量和静态变量。

堆的生长方向,都是向上的。在程序里面,所有的内存分为:堆+栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。

3,再说说,大小端的问题


大端模式:低位字节存在高地址上,高位字节存在低地址上

小端模式:高位字节存在高地址上,低位字节存在低地址上

STM32属于小端模式,简单的说,比如u32 temp=0X12345678;

假设temp地址在0X2000 0010.

那么在内存里面,存放就变成了:

地址

| HEX |


0X2000 0010 | 78 56 43 12 |

推荐阅读

史海拾趣

Dantona Industries公司的发展小趣事

作为一家有社会责任感的企业,Dantona Industries始终关注环境保护和社会公益。他们积极推广绿色生产理念,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与社会公益活动,为贫困地区的教育、医疗等事业提供援助。这些举措不仅展现了公司的社会担当精神,也为公司赢得了良好的社会声誉和品牌形象。

Formosa MS公司的发展小趣事

随着公司实力的增强,Dantona Industries开始寻求市场扩张的机会。他们首先将目光投向了海外市场,通过参加国际展会、建立海外销售网络等方式,逐步打开了国际市场的大门。然而,市场扩张也带来了新的挑战。不同国家和地区的市场需求、文化差异、法律法规等因素都需要公司去适应和应对。在这个过程中,Dantona Industries展现了出色的市场洞察力和应变能力,成功克服了各种困难,实现了市场的稳步扩张。

Ford Aerospace & Communications Corp公司的发展小趣事

在汽车制造领域,福特一直是技术创新的领导者。20世纪60年代,福特开始将电子设备集成到汽车中,包括车载电话、导航系统以及早期的娱乐系统。这些创新不仅提升了驾驶的便捷性和舒适性,也预示着未来汽车电子化、智能化的趋势。虽然这些技术并不直接属于航空通信范畴,但它们展示了福特在电子技术应用方面的前瞻性和实力。

Cellergy公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Cellergy公司深知这一点,始终将品质放在首位。公司建立了严格的质量管理体系,从原材料采购到生产加工再到产品出厂,每一个环节都严格把关。这种对品质的执着追求使得Cellergy公司的电容器产品在市场中获得了良好的口碑,赢得了客户的信赖和支持。

芯源半导体(CW)公司的发展小趣事

作为一家有社会责任感的企业,芯源半导体(CW)公司始终关注环境保护和可持续发展。公司积极推广绿色生产和循环经济理念,采用环保材料和节能技术,减少生产过程中的污染和浪费。同时,公司还积极参与社会公益事业,为当地社区和弱势群体提供帮助和支持。这些举措使芯源半导体(CW)公司赢得了社会的广泛赞誉和尊重。

AXTAL公司的发展小趣事

随着业务的不断发展,AXTAL公司开始在全球范围内进行布局和扩展。公司的设施位于德国南部的“水晶谷”地区,靠近海德堡。这一地区以其丰富的石英资源和技术优势而闻名,为AXTAL提供了得天独厚的条件。此外,公司还积极拓展海外市场,与全球多家知名企业建立了紧密的合作关系,进一步提升了公司的国际影响力。

问答坊 | AI 解惑

E-Studio ProHDL是一种不存在的东西,是骗人的。

E-Studio ProHDL是一种不存在的东西,是骗人的。有人发表评论,该软件尚无做出。做该软件的卵子还没受精。…

查看全部问答>

哪位有LATTICE 编译软件

各位大哥,谁有LATTICE编译软件,恭喜一下啊,谢谢!…

查看全部问答>

老电子工程师十年职场感悟

当电子工程师也是十余年了,不算有出息,环顾四周,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强! [1]职业规划很重要,好好规划自己的路,不要跟着感觉走!根据 ...…

查看全部问答>

编译过程出现这个错误什么原因??如何修改??吃饭不下

  <汇编器提示> COPYRIGHT MANLEY ELECTRONICS CO., LTD. 2001-2006    <汇编器提示> ASSEMBLY COMPLETE.  0 WARNING(S), 1 ERROR(S)       ERROR #14 IN 560 (VCJPDH.ASM, LINE 560): TAR ...…

查看全部问答>

wince设备 MASS STORAGE问题

我们的设备上采用的是2G的NAND FLASH外加一个SD卡,三星提供的BSP和相关文档上说设备作为MASS STORAGE时,同时只能将其中一个作为MASS STORAGE连接到PC上,我们想连接PC的时候同时显示这两个存储空间,目前的候选方案是在应用程序上进行一些设置, ...…

查看全部问答>

超高亮度LED的应用示例

replyreload += \',\' + 768280;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

流量计的参数远程控制

流量计的参数远程控制…

查看全部问答>

创新工作室寻找国产嵌入式开发创业团队合作

是有意从事各种嵌入式软硬件开发,方案、产品设计的创业学生、个人或团队有好消息了,本公司现在面向以上人士提供《创新工作室》的合作。      本公司是致力于采用国产嵌入式SOC芯片开发的高科技公司,主营SOC芯片开发销售。 ...…

查看全部问答>

程序问题

大家帮忙看下这个程序有些什么问题啊? 我想用这个程序测量占空比为百分之五十的方波 问什么液晶总是显示65535,而且frequency=1000000/period;这一句不管我把1000000换成多少他都显示的65535 不知道什么原因,请高手指点先谢了。   &nbs ...…

查看全部问答>

【IC人才招聘】有意回安徽合肥发展的同学请关注

我司(安徽某科技股份公司)欲招聘以下人员:一、产品经理岗位职责:  1、针对客户需求制定解决方案并进行推广;2、配合销售人员拓展相关市场,与客户进行沟通交流;3、分析研究集成电路的发展趋势和技术进展,为公司战略决策提供建议;4、参 ...…

查看全部问答>