历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2020年01月11日 | STM32堆栈整理

2020-01-11 来源:eefocus

STM32的堆栈大小在官方文件已经定义好了,分别是: 

Heap_Size EQU 0x00000200 一共512字节 

Stack_Size EQU 0x00000400 一共1K字节 

/***********************************************************************************/ 

但是STM32在keil环境下每次编译后的堆栈起始地址并不是固定的(就算事先已经定义好了堆栈的大小),因为栈的起始地址是由用户程序中事先定义好的变量数目决定的(实测是如此)。但欣慰的是,一旦这次编译之后,堆栈的首地址就不会再发生改变了,换言之,就是在烧完程序之后,堆栈的地址就永远不变了。 

/***********************************************************************************/ 

要关心STM32的堆栈关系,首先无法避免的就是下面这两幅图片了: 

 这里写图片描述 
这里写图片描述

图一:MDK环境下,STM32 Bulid Output窗口部分截图 

图二:MDK环境下,STM32的.map文件中关于堆栈地址的说明(绿色高亮部位) 

/***********************************************************************************/ 

STM32的内部sram的首地址为0x20000000,图二中的__initial_sp既为栈的高地址(也就是栈的首地址)(STM32的堆栈地址在MDK下的配置默认是连续的,栈的地址高于堆的地址,栈的生长方向为从高地址向低地址生长,栈的地址为从低地址向高地址生长,最后两者生长到了一起,也就是“头碰头”)图二中的HEAP既为堆的低地址,STACK既为最后头碰头的地址(注意并不是栈的起始地址而是结束地址,因为栈相对于堆是逆向生长的) 

/***********************************************************************************/ 

那么问题来了,__initial_sp的值是怎么来的呢?这就要看图一了。 

首先抛出结论:__initial_sp = 0x20000000+RW+ZI 

RW:Read/Write 可读可写的数据段。就是那些在任务初始化时就已经被赋值了的变量,MDK一般将这种类型的数据保存在STM32的SRAM中。(“全局变量”存在“普通意义上的”SRAM 中)(“局部变量”存储在“栈”中)(“局部的static变量”在存储上等价于全局变量) 

ZI:Zero Initial 初始化为0的变量,也就是直接初始化并没有赋值的变量


可以这么认为:在STM32的片内SRAM中,__initial_sp-0x20000000为用户已经使用了的SRAM空间,从高地址到低地址依次为“栈Stack”“堆Heap”“全局变量” 

/***********************************************************************************/ 

至此,图二中绿色高亮部分的STACK和HEAP的数值也就不难理解了 

STACK = __initial_sp - 0x400(栈的大小) 

HEAP = STACK - 0x200(堆的大小) 

/***********************************************************************************/


下面的百度文库给出了比较完整的答案:(百度文库这次竟然靠谱了word天) 

https://wenku.baidu.com/view/f13602e403d8ce2f016623a0.html

推荐阅读

史海拾趣

帝特(DTECH)公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,帝特始终坚持创新驱动的发展战略。公司不断投入研发资源,加强技术创新和产品升级,力求在保持传统业务优势的同时,开拓新的增长点。此外,帝特还积极布局电子专用材料项目,加强半导体芯片封装浆料研发推广,进一步优化产业结构,提升公司的综合竞争力。

以上五个故事概述了帝特(DTECH)公司在电子行业发展的主要历程和关键节点,展现了公司从创立到成长为行业领军企业的艰辛与辉煌。

依必安派特(ebmpapst)公司的发展小趣事

为了进一步满足中国市场的本地化需求,依必安派特在2005年成立了依必安派特电机(上海)有限公司,开始了国产化进程。这一举措不仅提高了产品的性价比,还缩短了交货周期,使得依必安派特在中国市场的竞争力得到了显著提升。随着国产化产品的快速增长,依必安派特在中国的前十年市场业绩突飞猛进,为后续的飞跃发展打下了坚实基础。

Hirel Systems Ltd公司的发展小趣事

为了进一步满足中国市场的本地化需求,依必安派特在2005年成立了依必安派特电机(上海)有限公司,开始了国产化进程。这一举措不仅提高了产品的性价比,还缩短了交货周期,使得依必安派特在中国市场的竞争力得到了显著提升。随着国产化产品的快速增长,依必安派特在中国的前十年市场业绩突飞猛进,为后续的飞跃发展打下了坚实基础。

Chips And Technologies Inc公司的发展小趣事

C&T始终坚持品质至上的原则,从原材料的采购到产品的生产、测试,每一个环节都严格把控。这种对品质的执着追求,使得C&T的产品在市场上赢得了良好的口碑。许多知名电脑制造商都选择与C&T合作,将其产品作为首选的半导体解决方案。

BB公司的发展小趣事

在成立后的几年里,BB公司逐渐在国内市场站稳了脚跟。然而,创始人并没有满足于此,他看到了更广阔的国际市场。1961年,BB公司首次进入国际市场,凭借其高品质的产品和专业的服务,迅速赢得了国际客户的青睐。此后,BB公司不断加快国际化步伐,先后在英国和日本设立子公司,进一步扩大了市场份额。这一系列的国际化举措,不仅提升了BB公司的知名度,也为其带来了丰厚的回报。

安信可(Ai)公司的发展小趣事

在不断创新和突破的过程中,安信可不断推出具有创新性的产品。例如,公司推出的WiFi+BLE蓝牙二合一的Ai-WB1系列模组,凭借其高可靠度、高集成度、应用灵活、高性价比等特点,深受市场欢迎。这款产品不仅为智能设备提供了无线通信连接能力,还广泛应用于工业、商业、消费等各类市场,进一步拓展了安信可的应用领域。

问答坊 | AI 解惑

高频PCB注意啦

谢谢支持。。。 欢迎您来到电子工程世界论坛。。。 欢迎您再来电子工程世界论坛。。。…

查看全部问答>

请教这是个什么器件?

输入20V输出19.8,正向压降0.2-0.4V,属肖特基二极管,可第一脚做什么用呢?请教高手一下。…

查看全部问答>

关于AVR-M8使用串口中断的一些疑问。

最近在做M8的串口通讯实验,准备2个MCU之间串口通讯,使用发送和接受中断的思想来做,请问在一个多任务系统下,如何确保通讯以及别的程序不被出错。。。。谢谢!…

查看全部问答>

射频知识专题讲座

PPT格式的,射频的定义和概念,图文并茂,感觉比较详细。 …

查看全部问答>

请推荐一款最实用的2410开发板!

硬件资源: (1) OURS-2410-F型嵌入式开发板一块:包括2410RP核心板,2410F底板和     4.3寸液晶屏; (2) DC 5V 3A直流电源一个(支持AC 100~240V输入) (3) 直通串口线延长线一条(一头针一头孔); (4) 直通并口 ...…

查看全部问答>

我想监视压缩文件的操作,该怎么做呢,请各位说点思路

我想在程序中,如果对某个文件有压缩操作,我就把该文件的名字记录下来,请问该怎么做呢?…

查看全部问答>

我在关闭udp 的socket时,有时会导致多个任务挂起是怎么回事?

同一个socket描述符,在两个任务里同时使用,一个负责接收,一个复杂发送. 当发送次数超时而关闭socket时,有时候会导致多个任务挂起,都处于ready状态.而关闭socket的这个任务处于ready+I状态.这种现象只是偶尔会出现,不知道为什么?各位给个答案,谢了…

查看全部问答>

调试求救!

调试遇到这个,是个什么错误啊? first-chance exceptiont in xxxx.exe 0xc0000005:access violation. 一调试运行就显示这个。…

查看全部问答>

请问STR710的USB有没有标准的软件库?谢谢!

                                  …

查看全部问答>

U盘的问题!

我的STM32的开发板连到PC之后,发现新硬件,但是出现一个病毒,可能是我在单位电脑上传播到开发板的病毒,想把他格式化,但是开发板上的好像是只读的,无法格式化,大家告诉我应该怎么解决呢?…

查看全部问答>