Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
栈溢出_StackOverflow
国产MCU移植
堆栈溢出问题排查(缺芯替代国产芯片)
发布于 2021-08-30 20:36:26 浏览:3262
订阅该版
[tocm] 最近因为缺芯问题,公司有一些产品在做国产替代芯片,我们选用的是华大的HCF32460系列的单片机,但是在使用过程中老是遇到一些奇怪的问题:运行一段时间死机、串口在接收长数据时死机或者异常,修改一段代码后死机,增加一行代码又恢复等等奇怪的问题。 在这个问题下,花了一天的时间解决了,具体问题定位在了堆栈溢出上,修改了堆栈大小后解决了这个问题,今天分享查找问题的经过和自己的一些总结,文笔忽略,不喜勿喷。。。 首先看一组代码截图 ![微信图片_20210830193448.png](https://oss-club.rt-thread.org/uploads/20210830/f1bb7699c981574d62e620a305a25c29.png) ![12131.png](https://oss-club.rt-thread.org/uploads/20210830/29cea83e6beeec3790f2f00053a3e0b3.png) 可以从截图中看到,我把硬件的初始化放在了主函数main()中(本人不建议这样使用,而是使用rt_thread提供的硬件初始化流程对硬件进行初始化,`INIT_BOARD_EXPORT(xxx)`),而 我的主函数线程堆栈大小配置为256Bytes,我的程序是在串口接收到数据后,申请一段内存,所以首先在串口接收长数据的地方打上断点,观察发现申请内存失败,跟到rt_malloc函数中,发现内存已经被破坏了 ![微信图片_20210830203957.png](https://oss-club.rt-thread.org/uploads/20210830/c1420676ff5325e3a751e9aee15218f0.png) 那么现在的问题就是什么导致内存被破坏了尼? 给rt_thread内存管理的地址开始的地方是0x1fff9660,观察内存变化情况,发现在释放main线程资源之前,已经出现了内存被修改的问题,那么到底是怎么回事?在调试中观察,发现这个出错的地方正好是main线程的堆栈栈底地址,而cotex-mx内核的堆栈生长方向正好是向下生长的,至此问题基本找到了,就是堆栈溢出造成的问题,导致管理内存链被破坏,而溢出的原因也定位到了,华大的库函数里面有很多临时变量,临时变量太多,退出函数的时候,就会被压入堆栈,导致堆栈溢出。 修改了main线程大小后,一直没有出现过类似的问题了。 ## 总结: 1)修功还要修内功,阅读rt_thread源码,并理解,如果有可能自己可以模仿写一段代码实现一些功能,对自己是很大的提高;(推荐一本好书《ARM Cortex-M3与Cortex-M4权威指南》,有时间可以自己实现一个简单的任务调度系统) 2)如果出现程序异常现象,第一个去查内存链是否被破坏? 3)如果被破坏可以断定大部分是由于堆栈分配不合理造成的; 4)尽量不要像我一样,在main线程或者其它线程中去初始化硬件相关的代码。
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
阿聪-聪
忙碌于写代码,不能自己
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
一个简单的线程,只有简单几个常量和调用,128字节的栈竟然溢出了
2
栈溢出怎么找原因,只提示了StackOverflow?
3
仿真运行出现“tidle0 stack overflow”?
4
main stack overflow
5
简单任务切换,出现stack overflow
6
rt-thread堆栈溢出的问题
7
rt-thread-nano防止某个任务的堆栈溢出
8
互斥量的地址怎么突变了?
9
正弦波形不全,是什么机制引起的?
10
使用minizip包的minizip指令报内存溢出故障
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部