打印
[应用相关]

我在学单片机时在堆栈遇到的问题

[复制链接]
867|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51xlf|  楼主 | 2022-11-18 12:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
堆栈发生问题时会产生很多奇怪的问题,我就说说我看到的一些现象。堆栈溢出后,程序和参数就会完全乱了套,出现程序重启或者系统崩溃。我当时是在对GSM模块通信进行调试的时候,在处理数据的时候使用了很多sprintf标准函数。就出现了通讯故障、断线或数据乱码等问题,由于自己对标准功能不熟悉。在一些处理上使用不合理。整个项目进行得磕磕绊绊。我觉得一定是某个地方出现了问题导致不稳定,自己的逻辑上没有错,找不到问题解决不了让我一度很沮丧。经过反复的测试后来我发现一个现象,两个连续的 for 循环,第一个运行正常然后第二个跳到第一个for循环中途就出现了重启。程序在这里就崩溃了。看到了问题就好处理了,经过观察我发现是指针乱序了,我意识到了可能是堆栈出现了问题。我把栈变大了,问题就得到了解决。
接下来说说我在哪里修改的。其实STM32中只修改了两个值,一个是stack_size的大小,一个是heap_size的大小。
遇到问题一定要多测试观察才能找到其中的问题,自身的知识要储备好,遇到问题才不会手忙脚乱

使用特权

评论回复
沙发
一只眠羊| | 2022-12-11 10:40 | 只看该作者
嗯,堆栈这块属实需要设置大一些,不然溢出都不知道

使用特权

评论回复
板凳
我吃小朋友| | 2022-12-11 11:12 | 只看该作者
这个还得是通过仿真的方式实现才行

使用特权

评论回复
地板
温室雏菊| | 2022-12-11 11:44 | 只看该作者
我之前也没修改过这块,但好像也没遇到过你说的问题,是因为我指针用的少了?

使用特权

评论回复
5
失物招領| | 2022-12-11 12:16 | 只看该作者
这是不是不能随便修改,而且不是越大越好,是吧

使用特权

评论回复
6
白马过平川| | 2022-12-11 12:48 | 只看该作者
你用sprintf的话,应该不用for循环了吧,用memcpy

使用特权

评论回复
7
月亮一键变蓝| | 2022-12-11 13:20 | 只看该作者
指针属实很难弄,容易翻车

使用特权

评论回复
8
西洲| | 2022-12-11 13:52 | 只看该作者
我指针用的少,还没遇到这个问题,可能是因为你用的指针比较多,遇到了这个问题吧

使用特权

评论回复
9
捧一束彼岸花| | 2022-12-11 14:24 | 只看该作者
话说,溢出的话,会有什么提示么?

使用特权

评论回复
10
风凉| | 2022-12-11 14:56 | 只看该作者
这属实是有些经验了,不然一般也想不到这块

使用特权

评论回复
11
故意相遇| | 2022-12-11 15:28 | 只看该作者
这俩应该怎么改啊?应该有规律吧

使用特权

评论回复
12
抹茶妹妹| | 2024-7-30 20:30 | 只看该作者
堆栈溢出会导致程序出现各种不可预期的行为,包括程序重启、系统崩溃、数据损坏或乱码等。这是因为堆栈的溢出可能会覆盖其他重要的内存区域,如函数返回地址、局部变量等,从而导致程序逻辑混乱。

使用特权

评论回复
13
抹茶妹妹| | 2024-7-30 20:30 | 只看该作者
观察现象和重现问题:首先要注意观察程序在什么情况下出现问题,尽可能地重现问题,这有助于缩小排查范围。

使用特权

评论回复
14
裤脚口感好| | 2024-7-31 23:53 | 只看该作者
你提到的通过多次测试和观察现象,最终定位到堆栈问题,是非常正确的方法。有时候问题可能不显而易见,需要通过系统性的测试和分析才能找到根本原因。

使用特权

评论回复
15
裤脚口感好| | 2024-7-31 23:53 | 只看该作者
增加堆栈大小是一种常见的解决方法,特别是在处理大量数据或使用复杂的函数调用链时。另外,合理设置堆(heap)的大小也是确保程序稳定性的重要因素之一。

使用特权

评论回复
16
为你转身| | 2024-8-31 13:24 | 只看该作者
通过调整堆栈大小来解决堆栈溢出问题。可以在启动文件或链接脚本中调整堆栈大小。

使用特权

评论回复
17
发给她更好fh| | 2024-8-31 21:24 | 只看该作者
你的经验很典型,堆栈溢出会导致许多难以预测的问题,如程序崩溃、重启、数据损坏等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

534

主题

9586

帖子

23

粉丝