HAL库已经#include uart.h和dma.h仍然报错#20: identifier “DMA_HandleTypeDef“ is undefined

最近买了好多合宙的Air001,没有提供标准库 刚好学习一下HAL库,照着Air001芯片 - LuatOS 文档把灯点亮了,想继续使用串口的时候出现了一些问题,记录一下方便后续查看。


首先使用串口:

各文件的包含关系

我使用Keil编译,提示.\AIR001xx_HAL_Driver\Inc\air001xx_hal_uart.h(178): error:  #20: identifier "DMA_HandleTypeDef" is undefined

奇怪啊,已经包含了air001xx_hal_dma.h,为啥还会报未定义呢?

最后发现是

#include "air001xx_hal_dma.h"                #include "air001xx_hal_uart.h"
顺序问题,调换一下就没问题了。

#include 命令是预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置。

uart.h在前,其中的代码已经用到DMA了,所以会报未定义。

排查过程:

该错误表明在`air001xx_hal_uart.h`文件中,标识符"DMA_HandleTypeDef"未被识别,导致编译错误。这可能是因为编译器无法找到或识别此标识符的定义。

一种常见的原因是头文件的包含顺序或头文件的依赖关系不正确,导致编译器无法正确识别结构体`DMA_HandleTypeDef`的定义。

尝试按照以下步骤排除错误:

1. **确保头文件路径正确**:
   确保在Keil工程中,头文件路径配置正确,能够正确找到`air001xx_hal_dma.h`。

2. **检查头文件依赖关系**:
   确保在`air001xx_hal_uart.h`文件中,先引入`air001xx_hal_dma.h`之后再使用`DMA_HandleTypeDef`,确保头文件的引入顺序正确。

3. **检查宏定义**:
   在`air001xx_hal_conf.h`中确保`HAL_DMA_MODULE_ENABLED`宏已正确定义。

4. **重新生成工程或清理构建**:
   尝试重新生成Keil工程或者进行清理构建,以确保所有依赖项都正确处理。

5. **检查DMA_HandleTypeDef定义位置**:
   确保`DMA_HandleTypeDef`的定义确实在`air001xx_hal_dma.h`文件中,并且没有条件编译或其他因素导致它被排除在编译范围之外。

总结:头文件的引用顺序对于程序的编译有一定影响

头文件中可能包含了定义、声明、宏、类型和函数原型等信息。正确的头文件引用顺序能确保符号在编译时正确解析。

以下是头文件引用顺序的一些重要原则和影响:

1. **依赖关系**:
   头文件的引用顺序应该考虑到文件之间的依赖关系。如果文件A依赖于文件B中定义的内容,那么应该先引用文件B,再引用文件A。

2. **定义和声明**:
   头文件可能包含类型的定义、变量的声明、函数的原型等。如果某个头文件定义了某个类型,另一个头文件依赖于这个类型,则应该先引用定义类型的头文件,然后再引用依赖该类型的头文件。

3. **宏和条件编译**:
   头文件中可能包含预处理宏和条件编译指令,这些可以影响程序的行为。引用头文件的顺序可能影响这些宏的值和条件编译的结果。

4. **避免重复定义**:
   正确的头文件引用顺序可以避免重复定义或重复声明,以确保编译时不会出现多次定义的错误。

5. **命名冲突**:
   引用头文件的顺序也可以影响命名空间和符号的冲突,确保引用的头文件中的符号不会与其他头文件中的符号冲突。

总的来说,头文件的正确引用顺序是确保程序正确编译、避免错误和符号冲突的关键之一。编写良好的头文件,考虑它们之间的依赖关系,并按照正确的顺序引用它们,将有助于保持代码的清晰性和可维护性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值