STM32突然死机以及莫名奇妙错误的解决

问题描述:

在STM32程序开发过程中,原本代码正常,为了实现接下来的功能,增加了一个结构体数组后,调试过程中遇到32死机的情况。后来通过逐步排查发现注释了结构体数组,程序运行正常,于是将结构体数组换成若干个数组替代,发现又出现了问题,这次是在串口调试过程中,显示了莫名其妙的结果。


我们结构体及结构体定义数组定义如下:

#define max 100
struct m_data{
	u8 compute_flag;	//用于记录是否计算过的标志位
	float temp;			//若计算过则存储中间值
	float value;
};
m_data Data[max];

想要替换的数组定义如下:

float data[max]={0};
float temp[max]={0};
u8 compute_flag[max]={0};

原因分析:

由于每次问题的出现都是在我们定义了一个数组(无论是结构体数组还是普通数组)后出现的,我就开始思考是不是数组定义的有什么问题呢,一个数组除了类型是我们自己定义的以外,还有一个参数是我们定义的,没错就是数组的大小
后来,经过在网上查资料可以发现STM32的栈区大小只有1024Kb,在我们STM32的启动文件中我们可以看到栈区大小的定义:
在这里插入图片描述
当我们定义上述数组时,由于占用内存空间过大,导致栈无法存放我们的数组和临时变量,所以出现了死机和莫名其妙输出的情况。


解决方案:

将数组大小变小一点即可,例如:将数组大小修改为20

#define max 20
float data[max]={0};
float temp[max]={0};
u8 compute_flag[max]={0};
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是一种微控制器系列,其中使用了轻型IP协议栈(LWIP)作为网络通信的基础框架。LWIP提供了一组用于处理网络通信的函数和数据结构,可以轻松地实现TCP/IP协议。 接收死机指的是在使用STM32与LWIP进行网络通信时,接收数据的过程中程序出现了死机现象。这种问题可能是由以下几个原因引起的: 1. 资源不足:可能是由于缓冲区大小不够,导致接收数据时出现溢出而导致死机解决方法是增加接收缓冲区的大小或者优化代码,提高接收数据的处理速度。 2. 中断冲突:可能是由于中断优先级设置不当,导致网络接收中断无法正确触发而引发死机解决方法是根据实际需求重新设置中断优先级,确保网络接收中断的及时触发。 3. 网络连接问题:可能是由于网络连接断断续续,或者网络质量较差导致接收数据时出现异常。可以通过检查网络连接状况,调试网络设置以及使用合适的网络调试工具来解决问题。 4. 代码错误:可能是由于代码逻辑错误,例如接收数据的处理过程中出现了死循环或者无限阻塞的情况。需要对代码进行仔细检查和调试,确保程序逻辑正确。 总之,接收死机问题需要综合考虑硬件和软件等多个方面的因素。通过逐步排查和调试,可以找到问题的根源并采取相应的解决方法,使STM32与LWIP能够正常进行网络通信。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值