历史上的今天
今天是: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)堆是从底部向上增长,堆栈是连接在一起的
下一篇:STM32内存与堆栈
史海拾趣
|
a.宾馆、银行、饭店、娱乐场所等服务行业 服务行业的竞争愈来愈激烈,人们对服务行业的服务质量、服务态度有了更高的要求。这使得在窗口服务行业中,管理人员对营业人员的管理日趋重要。而闭路监控系统为管理者提供了一种有效的手段。电视监控 ...… 查看全部问答> |
|
WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗? WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?… 查看全部问答> |
|
内核是linux 2.4.18, busybox的配置信息:1.使用静态连接库 2.不用本地/usr 3.添加ext2文件系统工具:e2fsck, fsck.... 4.添加交叉编译工具路径。仅此而已,错误信息如下: > LINK busybox_unstri ...… 查看全部问答> |
|
问题: 虽然有dll的函数说明但不知道 一些参数的格式,和如果要读写数据时,需要那些步骤. 如有做过智能卡的开发的朋友 给点资料.谢谢!… 查看全部问答> |
|
wince windows mobile如何用c++实现通信,这个如何操作,包括与服务器的配置? wince windows mobile如何用c++实现通信,这个如何操作,包括与服务器的配置?… 查看全部问答> |
|
dspMCBSP多通道缓冲串口,后接MAX3111进行串口扩展 用dsp的MCBSP串口扩展通信,使用SPI协议。知道mcbsp怎么初始化了,max3111有一个输出中断,连接到DSP,DSP要怎么样检测并使用MAX3111的输出中断?… 查看全部问答> |




