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

[复制链接]
3520|1
 楼主| 聚沃科技 发表于 2024-6-5 16:13 | 显示全部楼层 |阅读模式
本帖最后由 聚沃科技 于 2024-6-5 16:16 编辑

9722e262-ed15-48b3-baa8-28f3c3a1313c.jpg

2810fb0f-b41a-4762-ab84-cc037027cc14.jpg

在郭天祥老师视频里有一个问题分享,是EXMC初始化里的一个变量定义和初始化位置不同会导致程序死机,最终定位到程序是进入hardfault死机,但暂时没有后续分析了,这里我们来继续分析一下。
死机的程序是这样的:
b5ccdd78-bb5b-4a31-b48c-f1b0cba9acdb.png
这段代码是定义和初始化exmc的结构体参数,我们来详细看下结构体中的定义,其中有一个关键是这里有两个[backcolor=rgba(255,246,122,0.8)]指针成员,分别是读和写的结构体参数指针。
2bcd3150-b26e-4989-91d8-6aefeec74406.png
那我们看下结构体成员初始化函数,其中除了对成员变量赋值了默认参数外,还对读写时序参数结构体指针的成员也赋值了默认参数:
1d52ccd8-dce5-4a59-aeba-a7def6019d81.png
所以这里就是重点,此时这个结构体刚定义完成,因为是局部变量是定义在栈里的,所以初值都是随机值,这个随机值实际可以解释为栈空间上次释放的局部变量值。
当对一个随机值的指针进行赋值会发生什么?三个结果:
1、随机值是非法地址,立刻触发hardfault;
2、随机值是程序实际RAM地址范围外的可写地址,意外操作了寄存器或者无效地址,一次无效操作或开启意外功能;
3、随机值是程序已使用的RAM地址,破坏了这段内存,程序不会立刻触发hardfault,会在CPU使用到该区域时才出现异常。

那我们应该如何调用这个EXMC的结构体初始化呢?其实这里有定义三个结构图,另外两个就是读写的时序结构体的实体,我们定义后先将这两个结构体变量赋值到exmc模式结构体成员的两个指针,此时指针才有了正确地址,调用结构图初始化后就可以把这两个结构体一起完成初始化。
2574338b-50b2-484f-8646-910c60cdab9f.png
这里的分析很考验大家C语音指针、CPU内存的理解功底,还有什么疑难杂症欢迎大家提供素材。上面分析的正确初始化顺序在红枫派开发板例程中应用,欢迎大家应用到项目中使用。

本教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462











FranklinUNK 发表于 2024-6-20 19:11 | 显示全部楼层
局部变量未初始化的问题吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

190

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部