OpenEdv-开源电子网

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

怎么查找死机的原因?

[复制链接]

27

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2014-12-25
在线时间
83 小时
发表于 2015-12-12 16:22:56 | 显示全部楼层 |阅读模式
5金钱
我有一个STM32程序用到了SRAM,运行到某些地方,
    有时候会死机,
    有时候不会死机,
    死机发生的时间也无法预知,该怎么查找原因呢?
我总结以前死机的原因要么是 堆栈溢出,要么是数组越界,这些错误导致的死机都是在某个时候或者运行到某个地方必然会发生的.像上面那样的死机该怎么查找原因呢? 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12549
金钱
12549
注册时间
2015-11-5
在线时间
2147 小时
发表于 2015-12-13 20:17:35 | 显示全部楼层
不知道你的程序是否跑操作系统,如果是进入硬件错误的话,除了堆栈溢出等SRAM越界等问题外,其实还有一个比较常见的字节对齐问题,这个问题原子哥在FATFS上遇过并发了帖子说明,讨论的结果也出来了,你可以翻查下

我做过一个简单的测试,如果一个不是以4字节对齐的u8指针,作为参数传递到一个参数类型为u16的函数时,例子如下:

u8  test1[4];     // 假设test1地址不是以4字节对齐,如0x2000A001

void FlashWrite( u16* addr )
{
    *addr = 0xABCD;    // 对addr指向的内容进行赋值操作
    ....
    ....
}

int main(void)
{
    FlashWrite(test1);    // 由于test1并没有以4字节对齐,因此执行后会进入硬件错误
}


对于STM32 4字节对齐的问题,百度上流传着一个解释,就是可以节省很多读写SRAM所需的指令,也就是说可以节省很多时间和提高执行效率,详细的说就是如果待操作的数并没有以4字节对齐的话,编译器编译时会以更多的指令来实现你想要的操作。但这还不足以说明为何不以4字节对齐的情况会进入硬件错误,后来我又百度了下,具体原因其实就是指令本身的问题,具体是用到哪条指令需要4字节对齐我忘了,好像是那个什么LDRB和STRB吧,记不得了,知道的朋友麻烦告诉我一声哈!

所以我最后得出的一个结论是,如果要对指针进行强制类型转换或者做赋值等操作时,必须要十分小心,不然会因为这个字节对齐问题而挂掉

下面提供一个其他人做过的非常好的测试:
http://bbs.elecfans.com/jishu_466493_1_1.html
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2015-12-14 09:12:03 | 显示全部楼层
mark..
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2015-12-14 10:32:09 | 显示全部楼层
可以把串口利用起来,移植printf函数,通过串口在程序中添加打印信息,看看死机的时候是死在那个打印信息的位置上
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-3-7
在线时间
17 小时
发表于 2016-6-20 15:10:40 | 显示全部楼层
mark   
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 07:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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