OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9960|回复: 9

无操作系统下栈溢出,增加栈大小怎么仍然会出问题?

[复制链接]

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2022-3-13
在线时间
52 小时
发表于 2023-2-7 17:59:18 | 显示全部楼层 |阅读模式
1金钱
我的程序出问题了,查看调用栈,是在free()函数里进入到了HardFault_Handler(),我目前确定程序没有内存泄漏,应该是栈溢出导致,但还没有好的解决办法。
我没有用操作系统,因此无法像网上提到的在ticker_ISR里记录栈针,然后得到栈的最大值。另外即使无操作系统下,在定时器中增加栈针打印,也不知道是哪个函数出现的栈溢出(或者方法比较复杂)

研究startup_stm32f10x_hd.s里的堆栈大小配置,有一个疑惑:Stack_Size是所有函数调用栈的总大小么?但我增加Stack_Size到0x1800,程序仍然会进入HardFault_Handler()。
我查了代码,再深的函数调用,所有栈空间加起来不会超过0x1800,怎么还会出问题呢?
解决栈溢出有什么好办法么?我翻了论坛上栈溢出相关的帖子和STM32相关文档,没有找到解决方法。我下一步的打算是把栈中所有256byte以上的大数组都改用malloc申请,但这会让代码变得复杂。

下面是我的配置及编译后的大小
Stack_Size      EQU     0x00001800
Heap_Size       EQU     0x00002800
Program Size: Code=121684 RO-data=13384 RW-data=3428 ZI-data=59996         // 我STM32F103内存是64K的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2023-2-7 20:23:17 | 显示全部楼层
先看错误标志位是什么 , 再继续分析 .

自己也可以查一下有没有访问越界把堆写坏了 .
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

8

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
789
金钱
789
注册时间
2019-8-15
在线时间
423 小时
发表于 2023-2-7 22:15:09 | 显示全部楼层
首先,free函数操作的是堆,如果调整大小,应该首先考虑调整堆的大小。其次,free是标准库函数,如果用stm32裸机调用该函数,应该要使用迷你库才对,不能使用标准库进行编译。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2023-2-8 01:48:35 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-2-8 08:16:07 | 显示全部楼层
free用的不是heap,堆的内存吗,你是用的c库函数吗,建议自行管理内存
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-2-8 11:44:45 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-2-8 11:48 编辑

我觉得( "RW-data" + "ZI-data" + “Stack_Size”+ “Heap_Size”)应小于总内存(64K),楼主的空间似乎超了。
https://blog.csdn.net/qq_31073871/article/details/102569983

傲游截图20230208114729.jpg

专治疑难杂症
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2022-3-13
在线时间
52 小时
 楼主| 发表于 2023-2-9 09:11:00 | 显示全部楼层
谢谢各位的回复,我只能走读代码看哪里出错了。

@shihantu       对,数组越界也是代码走读检查项之一
@鲸鱼niko       我没有使用MicroLIB,貌似标准库的malloc/free能正常工作,该问题应该不会是标准库的malloc/free有bug导致,应该不需要切到MicroLIB
@a5820736     没有内存泄漏,应该不需要自行管理内存,另外有较多小内存申请,不方便自行管理内存
@LcwSwust     内存空间超了KEIL会报错。另外程序RAM占用是RW-data + ZI-data,应该已经把Stack_Size和Heap_Size包进去了。因为我发现修改startup_stm32f10x_hd.s文件中的堆栈大小,ZI-data会随之变化
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-2-9 09:29:35 | 显示全部楼层
我的意思是动态内存分配用的是heap的大小,你改stack的大小是没有用的,同样代码,你可以试试gcc-arm编译器的效果,看是不是一样的
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-2-9 09:36:21 | 显示全部楼层
其次不清楚有没有多线程,所以可能看似没有内存溢出,实际上可能还是会发生
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-2-9 10:06:51 | 显示全部楼层
Asdfsdf 发表于 2023-2-9 09:11
谢谢各位的回复,我只能走读代码看哪里出错了。

@shihantu       对,数组越界也是代码走读检查项之一

即然“Stack_Size和Heap_Size包进去了”那就只能自己多检查了。(“堆”与“栈”我弄不清楚,这里我就统一叫“堆栈”)

局部变量会占用堆栈,像FATFS文件系统中某些结构体变量如果作为局部变量也是会容易出问题,printf也会占用较大堆栈。
另外就是我个人更喜欢自己定义数组来管理内存,尽量不用malloc,自己写函数代替printf。
还有就是想办法减小内存占用,比如时分复用、以时间换空间。

专治疑难杂症
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表