打印
[AT32F403/403A]

结构体成员未完全初始化会导致什么样的异常?

[复制链接]
798|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2023-9-19 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用非官方程序,由于某些外设驱动在配置结构体时,未完全初始化所有成员,导致程序运行异常。以 FSMC 为例,FSMC_NORSRAMInitStructure 结构体共有 15 个成员,若 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait 没有配置,则可能出现以下情形:使用 IAP 引导 APP 程序,APP 程序出现 FSMC 驱动 LCD 刷屏很慢。用户只配置了 FMSC 结构体的 15 个成员中的 14 个,其中 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait没有配置,该成员变成了 SRAM 中的随机值,因此会将错误的配置写到 BK1CTRL1 中。

使用特权

评论回复
沙发
forgot|  楼主 | 2023-9-19 10:40 | 只看该作者
解决办法:
1. 使用 AT32 官方程序,避免结构体未完全初始化问题。
2. 将所有结构体成员都完成初始化,对于上述 FSMC,在 void ILI9806_GPIO_FSMC_Init(void)中增加
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;语句。

使用特权

评论回复
板凳
forgot|  楼主 | 2023-9-19 10:40 | 只看该作者
扩展分析
C 语言的写法一定要严谨规范,否则类似 FSMC 结构体成员未完全初始化的现象同样存在于 TMR,USART,CAN
等任何外设,且现象不固定,比较难 debug。

使用特权

评论回复
地板
tpgf| | 2023-10-13 08:35 | 只看该作者
结构体变量的初始化既可以在定义变量的时候初始化,也可以定义完变量后,在单独给变量的成员变量赋值

使用特权

评论回复
5
木木guainv| | 2023-10-13 09:18 | 只看该作者
结构体变量的初始化必须按照结构体的成员列表的顺序初始化,否则可能会因为类型不匹配而导致错误,如果在有些信息不知道的情况下,只能初始化部分成员,则可以指定元素初始化。

使用特权

评论回复
6
晓伍| | 2023-10-13 09:41 | 只看该作者
为什么 AT32 官方程序就可以避免结构体未完全初始化问题呢

使用特权

评论回复
7
观海| | 2023-10-13 22:40 | 只看该作者
这个并不是结构体本身的缺陷 只是因为楼主这样使用了  所以会造成这样的后果

使用特权

评论回复
8
八层楼| | 2023-10-13 23:13 | 只看该作者
这种错误是可以预见的 所以在使用之前就必须要进行相应的初始化

使用特权

评论回复
9
磨砂| | 2023-10-13 23:45 | 只看该作者
如果一开始没有初始化 会预留相应的空间吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1762

主题

13167

帖子

55

粉丝