变量位置不同会死机?郭天祥老师视频的遗留问题分析答案

描述

嵌入式

 

嵌入式

 

在郭天祥老师视频里有一个问题分享,是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机,最终定位到程序是进入hardfault死机,但暂时没有后续分析了,这里我们来继续分析一下。

死机的程序是这样的:

嵌入式

 

这段代码是定义和初始化exmc的结构体参数,我们来详细看下结构体中的定义,其中有一个关键是这里有两个指针成员,分别是读和写的结构体参数指针。

嵌入式

 

那我们看下结构体成员初始化函数,其中除了对成员变量赋值了默认参数外,还对读写时序参数结构体指针的成员也赋值了默认参数:

嵌入式

 

所以这里就是重点,此时这个结构体刚定义完成,因为是局部变量是定义在栈里的,所以初值都是随机值,这个随机值实际可以解释为栈空间上次释放的局部变量值。

当对一个随机值的指针进行赋值会发生什么?三个结果:

1、随机值是非法地址,立刻触发hardfault;

2、随机值是程序实际RAM地址范围外的可写地址,意外操作了寄存器或者无效地址,一次无效操作或开启意外功能;

3、随机值是程序已使用的RAM地址,破坏了这段内存,程序不会立刻触发hardfault,会在CPU使用到该区域时才出现异常。

那我们应该如何调用这个EXMC的结构体初始化呢?其实这里有定义三个结构图,另外两个就是读写的时序结构体的实体,我们定义后先将这两个结构体变量赋值到exmc模式结构体成员的两个指针,此时指针才有了正确地址,调用结构图初始化后就可以把这两个结构体一起完成初始化。

嵌入式

 

这里的分析很考验大家C语音指针、CPU内存的理解功底,还有什么疑难杂症欢迎大家提供素材。上面分析的正确初始化顺序在红枫派开发板例程中应用,欢迎大家应用到项目中使用。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分