Questions: 结构体成员未完全初始化会导致什么样的异常?请举例说明。 Answer:
使用非官方程序,由于某些外设驱动在配置结构体时,未完全初始化所有成员,导致程序运行异常。
以 FSMC 为例,FSMC_NORSRAMInitStructure 结构体共有 15 个成员,若 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait 没有配置,则可能出现以下情形:使用 IAP 引导 APP 程序,APP 程序出现 FSMC 驱动 LCD 刷屏很慢。
用户只配置了 FMSC 结构体的 15 个成员中的 14 个,其中 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait没有配置,该成员变成了 SRAM 中的随机值,因此会将错误的配置写到 BK1CTRL1 中。
解决办法:
1. 使用 AT32 官方程序,避免结构体未完全初始化问题。
2. 将所有结构体成员都完成初始化,对于上述 FSMC,在 void ILI9806_GPIO_FSMC_Init(void)中增加 FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;语句。
扩展分析C 语言的写法一定要严谨规范,否则类似 FSMC 结构体成员未完全初始化的现象同样存在于 TMR,USART,CAN等任何外设,且现象不固定,比较难 debug。
|