历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月16日 | 关于STM32堆栈方面知识点

2020-01-16 来源:eefocus

最近弄json,发现经常的堆溢出,然后找问题。因为对STM32堆栈问题没有深刻认识,就花时间好好研究下了堆栈并且做了验证


1.栈地址区间确定


首先找到启动文件,我的启动文件在startup_stm32f40xx.s,一般的启动文件也都在startup_stm32fxxxx.s文件里

__initial_sp      这个参数是栈顶地址,因为栈的增长是向下增长,所以这个参数我们可以理解为栈的起始地址,我设置的栈尺寸是0x400,所以栈的地址范围是 __initial_sp  ~ (__initial_sp  - 0x400),__initial_sp 这个参数是keil编译代码之后计算出来的,有多种方法确定。


2.确定__initial_sp数值


(1)方法:1:编译代码,编译完成之后,在代码所在文件夹里找到一个.map的文件,放入keil

(2)方法2:Debug执行代码,然后查看0x08000000这个地址的数据,前四个字节就是

(3)方法3:直接根据RW-data + ZI-data

因为SRAM的基地址是0x20000000,所以上面的地址应该加上基址,也就跟上面吻合了


2.栈的功能


(1)函数中的局部变量是保存在栈里的,确认方法如下

地址为 0x200007a8  在 0x200007b0  ~  0x200003B0范围里,所以在栈里。


3.堆相关


(1)网上有网友说,全局变量、静态变量是放在堆里的,这个是错误的。堆的知识点,回头有时间我再研究一下。


(2)函数名是存放在flash中的!


 


4.总结


(1)函数内部局部变量是放在栈里面的


(2)函数名是存放在flash中的


(3)如果运行freertos时,在任务里调用函数时,此时这个函数中内部的变量是存放在freertos分配的内存中,而不是栈里


(4)堆只有调用malloc时,分配的空间才在堆中


(5)实际使用过程中,函数局部变量占空空间大于栈分配空间时,会自动占用堆空间,而不会导致程序挂掉


(6)栈的起始点是栈顶,从顶部向下增长


(7)堆是从底部向上增长,堆栈是连接在一起的

推荐阅读

史海拾趣

Fujitsu America公司的发展小趣事

在计算机技术发展的早期阶段,Fujitsu就展现出了强大的研发实力。1954年,Fujitsu成功研制出日本第一台电脑FACOM 100,这一里程碑式的成就不仅标志着Fujitsu在计算机领域的正式起步,也为其后续在ICT领域的发展奠定了坚实基础。Fujitsu America作为Fujitsu在全球的重要分支机构,积极将这一创新成果引入北美市场,推动了当地计算机技术的普及和应用。

CANDD公司的发展小趣事

在电子行业的初期,CANDD公司凭借其创始人对半导体技术的深入研究,成功开发出了一款具有划时代意义的芯片。这款芯片不仅性能卓越,而且成本远低于市场上的同类产品。凭借这一技术突破,CANDD公司迅速在行业内崭露头角,吸引了大量投资者的关注。随着产品销量的不断增长,公司逐渐扩大了生产规模,并在全球范围内建立了销售网络。

Deutronic Elektronik GmbH公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Deutronic Elektronik GmbH始终坚持创新驱动和可持续发展的理念。公司不断推出新产品、新技术和新服务,以满足客户的不断变化的需求。同时,公司也注重环境保护和可持续发展,积极推广绿色能源和环保技术,为社会和环境做出了积极贡献。

Harris公司的发展小趣事

进入20世纪30年代,Hammond迎来了其发展历程中的一个重要转折点。在1930年代初,Hammond成为加拿大第一家生产两柱式机架和窄柜系列产品的公司,这些产品迅速获得了广播和通讯行业的青睐。这一创举不仅巩固了Hammond在业内的地位,还为其后续在电气、电子行业的全面发展铺平了道路。

芯海科技(CHIPSEA)公司的发展小趣事

近年来,随着新能源汽车市场的快速崛起,BMS(电池管理系统)技术成为关键。芯海科技凭借在“模拟信号链+MCU”领域的技术积累,成功开发出应用于BMS锂电管理的高精度模拟信号链芯片。这一技术的突破使得芯海科技能够切入新能源汽车市场,为行业的发展提供了有力支持。

Fuji Electric Co Ltd公司的发展小趣事

近年来,随着新能源汽车市场的快速崛起,BMS(电池管理系统)技术成为关键。芯海科技凭借在“模拟信号链+MCU”领域的技术积累,成功开发出应用于BMS锂电管理的高精度模拟信号链芯片。这一技术的突破使得芯海科技能够切入新能源汽车市场,为行业的发展提供了有力支持。

问答坊 | AI 解惑

哪些地方需要监控系统?

a.宾馆、银行、饭店、娱乐场所等服务行业   服务行业的竞争愈来愈激烈,人们对服务行业的服务质量、服务态度有了更高的要求。这使得在窗口服务行业中,管理人员对营业人员的管理日趋重要。而闭路监控系统为管理者提供了一种有效的手段。电视监控 ...…

查看全部问答>

初学射频,请问基站的工作做啥?

今天下午闲来无事,在网上找了一些资料,贡献给坛子里的朋友。 想请教下:基站的工作,咱电子工程师都可以做啥? 请大家指点。…

查看全部问答>

WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?

WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?…

查看全部问答>

救助 用VHDL 设计一个指令寄存器 紧急 谢谢

救助 用VHDL  设计一个指令寄存器  紧急 谢谢  大家新年快乐哈…

查看全部问答>

交叉编译busybox-1.2.0出错,请高手帮忙

     内核是linux 2.4.18, busybox的配置信息:1.使用静态连接库 2.不用本地/usr 3.添加ext2文件系统工具:e2fsck, fsck....  4.添加交叉编译工具路径。仅此而已,错误信息如下: >  LINK busybox_unstri ...…

查看全部问答>

有没朋友用过Integrated 的D4发卡器

问题: 虽然有dll的函数说明但不知道 一些参数的格式,和如果要读写数据时,需要那些步骤. 如有做过智能卡的开发的朋友 给点资料.谢谢!…

查看全部问答>

wince windows mobile如何用c++实现通信,这个如何操作,包括与服务器的配置?

wince windows mobile如何用c++实现通信,这个如何操作,包括与服务器的配置?…

查看全部问答>

新人弱弱的问题:单片机仿真器与开发板的区别?

我是新来的,什么都不懂,请教下各位大虾单片机仿真器与开发板的区别,各有什么功能.谢谢!…

查看全部问答>

开关电源运用在单片机电路上所出现的问题

                                 我在做智能车时  老听说别人因为用的开关电源把电源烧了!  现在让我们讨论一下开关电源在单 ...…

查看全部问答>

dspMCBSP多通道缓冲串口,后接MAX3111进行串口扩展

用dsp的MCBSP串口扩展通信,使用SPI协议。知道mcbsp怎么初始化了,max3111有一个输出中断,连接到DSP,DSP要怎么样检测并使用MAX3111的输出中断?…

查看全部问答>