Skip to content

4.1 HAL 的文件结构和工程结构 ​

本节导读

总览页我们知道了 HAL 是"插座"——隔离硬件差异,给上层统一接口。这一节我们把 HAL 的"家底"翻一遍:它的源代码文件放在哪、每个文件夹/文件是干什么的、在工程里又怎么组织。

不用全部背下来,跟着走一遍,以后找文件不迷路就行。

HAL 是什么?一句话复习 ​

HAL(Hardware Adaptation Layer,硬件适配层),用于适配各种各样的硬件,为上层提供统一的接口,从而方便开发者使用各种各样的硬件。

生活类比:HAL 是"插座"——电器(上层应用)只需要知道"插上去就能用",完全不关心插座背后的线路。

一、HAL 的文件结构:Components\hal ​

在安装好 Z-Stack 3.0 后,HAL 相关的源代码可以在 Z-Stack 3.0 的 Components 文件夹中找到。进入 hal 目录,里面有三个子文件夹:

text
Components\hal\
├── common\    ← 公共文件
├── include\   ← 各种驱动程序接口文件(头文件)
└── target\    ← 各种类型主板的驱动程序源文件

① common 文件夹:公共区域 ​

文件作用大白话
hal_assert.c条件合法性判断保安:检查条件合不合法
hal_drivers.cHAL 任务初始化及事件处理函数所在文件,是 HAL 的"入口"前台:HAL 的大门

hal_drivers.c 是全 HAL 最重要的文件——Hal_Init()、HalDriverInit()、Hal_ProcessEvent()、Hal_ProcessPoll() 都在这里,下一节 4.2 专门讲它。

② include 文件夹:驱动接口"说明书" ​

存放各种驱动程序接口头文件(13 个):

头文件对应外设头文件对应外设
hal_adc.hADC(模拟数字转换)hal_lcd.h显示屏
hal_assert.h条件合法性判断hal_led.hLED
hal_board.h主板硬件资源配置hal_rpc.hRPC(远程过程调用)
hal_defs.h通用定义hal_sleep.h休眠
hal_drivers.hHAL 任务/事件处理hal_timer.h定时器
hal_flash.hFLASH 存储器hal_uart.h串口
hal_key.h按键

规律:每个外设一对文件——include 里的 .h 是"说明书"(接口),target 里的 .c 是"施工队"(实现)。比如用 LED:接口看 hal_led.h,实现看 target\CC2530EB\hal_led.c。

③ target 文件夹:不同主板的"施工队" ​

存放各种类型主板的驱动程序源文件,按芯片/板型分目录:

目录适用主板
CC2530EB芯片主控为 CC2530 的评估板(我们用的就是它)
CC2530USBCC2530 + USB 转串口的评估板
CC2530ZNPCC2530 的 ZNP(ZigBee And Processor)板
CC2538CC2538 评估板
CC2538ZNPCC2538 的 ZNP 板

以 CC2530EB 为例,里面有两种类型的文件:

第一种:实现 include 接口的源文件,例如 hal_led.c、hal_lcd.c、hal_adc.c、hal_key.c、hal_uart.c、hal_timer.c 等——每个 .h 都有对应的 .c。

第二种:板级相关驱动,例如 hal_dma.c(直接存储器访问)、hal_ota.c(空中升级)、hal_oad.c(空中下载)、hal_flash.c、hal_sleep.c、hal_startup.c(系统启动)、_hal_uart_dma.c / _hal_uart_isr.c(串口的两种实现方式)等。

还有几个重要的配置头文件:hal_board_cfg.h(当前主板的硬件资源配置)、hal_mcu.h(主控芯片相关)、hal_types.h(类型定义)、hal_mac_cfg.h(MAC 配置)、hal_aes.h / hal_ccm.h(加密相关)。

换板子怎么办?换 target 目录。比如换了 CC2538 的板子,就用 CC2538 目录下的驱动,上层代码一行都不用改——这就是 HAL"插座"思想的落地。

二、HAL 的工程结构:IAR 里的样子 ​

打开 SampleSwitch 工程,展开 HAL 分组,可以看到和文件结构对应的三个子目录:Common、Include、Target。

其中 Target 目录下有一个 CC2530EB 目录,表示这个工程采用的是 CC2530EB 主板相关的驱动程序文件(对应文件结构里的 target\CC2530EB)。

在 CC2530EB 目录下,又包含 Config、Drivers、Includes 三个子目录:

工程目录存放内容大白话
Config该主板的硬件资源配置头文件(如 hal_board_cfg.h)装修图纸
Drivers各种驱动程序源文件(.c)施工队
Includes各种驱动程序头文件(.h)说明书

三、小结 ​

问题答案
HAL 源码在哪?Components\hal:common(公共)/ include(接口头文件)/ target(板级实现)
include 和 target 什么关系?include 是"说明书"(接口 .h),target 是"施工队"(实现 .c),一一对应
我们用的主板目录?target\CC2530EB(CC2530 评估板)
工程里怎么组织?IAR 里 HAL 分组 = Common/Include/Target → CC2530EB → Config/Drivers/Includes
换板子怎么办?换 target 目录,上层代码不动

一句话总结:HAL = include 定接口、target 做实现、common 管公共、工程里原样镜像。找驱动文件的口诀:先找 include 的 .h 看接口,再进 target\CC2530EB 找对应的 .c 看实现。


内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第三部分·4.1 节,经本站整理优化以便于理解;原站链接

aioteer · 物联网专业课程群

💬AI 伴学配置