[AT32F403/403A] 结构体成员未完全初始化会导致什么样的异常?

[复制链接]
 楼主| 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 | 显示全部楼层
结构体变量的初始化既可以在定义变量的时候初始化,也可以定义完变量后,在单独给变量的成员变量赋值
木木guainv 发表于 2023-10-13 09:18 | 显示全部楼层
结构体变量的初始化必须按照结构体的成员列表的顺序初始化,否则可能会因为类型不匹配而导致错误,如果在有些信息不知道的情况下,只能初始化部分成员,则可以指定元素初始化。
晓伍 发表于 2023-10-13 09:41 | 显示全部楼层
为什么 AT32 官方程序就可以避免结构体未完全初始化问题呢
观海 发表于 2023-10-13 22:40 | 显示全部楼层
这个并不是结构体本身的缺陷 只是因为楼主这样使用了  所以会造成这样的后果
八层楼 发表于 2023-10-13 23:13 | 显示全部楼层
这种错误是可以预见的 所以在使用之前就必须要进行相应的初始化
磨砂 发表于 2023-10-13 23:45 | 显示全部楼层
如果一开始没有初始化 会预留相应的空间吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2061

主题

14485

帖子

59

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