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 目录,里面有三个子文件夹:
Components\hal\
├── common\ ← 公共文件
├── include\ ← 各种驱动程序接口文件(头文件)
└── target\ ← 各种类型主板的驱动程序源文件① common 文件夹:公共区域
| 文件 | 作用 | 大白话 |
|---|---|---|
hal_assert.c | 条件合法性判断 | 保安:检查条件合不合法 |
hal_drivers.c | HAL 任务初始化及事件处理函数所在文件,是 HAL 的"入口" | 前台:HAL 的大门 |
hal_drivers.c是全 HAL 最重要的文件——Hal_Init()、HalDriverInit()、Hal_ProcessEvent()、Hal_ProcessPoll()都在这里,下一节 4.2 专门讲它。
② include 文件夹:驱动接口"说明书"
存放各种驱动程序接口头文件(13 个):
| 头文件 | 对应外设 | 头文件 | 对应外设 |
|---|---|---|---|
hal_adc.h | ADC(模拟数字转换) | hal_lcd.h | 显示屏 |
hal_assert.h | 条件合法性判断 | hal_led.h | LED |
hal_board.h | 主板硬件资源配置 | hal_rpc.h | RPC(远程过程调用) |
hal_defs.h | 通用定义 | hal_sleep.h | 休眠 |
hal_drivers.h | HAL 任务/事件处理 | hal_timer.h | 定时器 |
hal_flash.h | FLASH 存储器 | hal_uart.h | 串口 |
hal_key.h | 按键 |
规律:每个外设一对文件——include 里的
.h是"说明书"(接口),target 里的.c是"施工队"(实现)。比如用 LED:接口看hal_led.h,实现看target\CC2530EB\hal_led.c。
③ target 文件夹:不同主板的"施工队"
存放各种类型主板的驱动程序源文件,按芯片/板型分目录:
| 目录 | 适用主板 |
|---|---|
CC2530EB | 芯片主控为 CC2530 的评估板(我们用的就是它) |
CC2530USB | CC2530 + USB 转串口的评估板 |
CC2530ZNP | CC2530 的 ZNP(ZigBee And Processor)板 |
CC2538 | CC2538 评估板 |
CC2538ZNP | CC2538 的 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 节,经本站整理优化以便于理解;原站链接