尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Zephyr BSP: 36-Zephyr集成公司HAL
摘要:本文是 Zephyr BSP 系列第 36 篇,核心回答一个现实问题——公司已有 HAL 时,Zephyr Driver 该如何与之协作。文章首先给出最终架构:Zephyr Driver 调 Company HAL,Company HAL 直接操作 SoC,并解释为什么不要让 Driver 直接操作寄存器(避免代码重复、绕过 SoC workaround)。随后详细阐述 HAL 与 Driver 的职责边界:HAL 管"怎么操作硬件",Driver 管"怎么把硬件变成 Zephyr Device";HAL 应保持 RTOS independent,不解析 Devicetree、不依赖 Kconfig,而 Clock/Reset 的 ownership 要清晰划分。最后给出推荐的目录结构、常见错误清单,以及从 09 到 36 篇的完整学习链路总结。Company HAL 怎么放进 Zephyr?这一篇非常关键。到35 — BSP Validation,你已经建立了一个完整认识:Application ↓ Zephyr API ↓ Zephyr Driver ↓ Company SoC ↓ Hardware但真正做公司 SoC BSP 时,还会遇到一个现实问题:公司通常已经有一套 HAL。为什么还要重新写 Zephyr Driver?答案是:Zephyr Driver 不应该重新实现硬件寄存器逻辑。最理想的架构是:Zephyr Driver 调 Company HAL,Company HAL 再直接操作 SoC。1. 先看最终架构假设公司已经有:Company HAL ├── uart.c ├── gpio.c ├── spi.c ├── i2c.c ├── timer.c ├── clock.c └── irq.c那么 Zephyr BSP 推荐形成:┌─────────────────────────────┐ │ Application │ │ │ │printk()/UART API/GPIO │ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Zephyr API │ │ │ │uart_poll_out()│ │gpio_pin_set()│ │spi_transceive()│ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Zephyr Driver │ │ │ │ uart_company.c │ │ gpio_company.c │ │ spi_company.c │ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Company HAL │ │ │ │company_uart_init()│ │company_uart_write()│ │company_gpio_set()│ │company_spi_transfer()│ └──────────────┬──────────────┘ │ ▼ ┌─────────────────────────────┐ │ Company SoC HW │ │ │ │ UART/GPIO/SPI/I2C │ │ Clock/IRQ/Timer │ └─────────────────────────────┘这就是今天这一篇最核心的结构。2. 为什么不要让 Zephyr Driver 直接操作寄存器?当然可以:staticintcompany_uart_poll_out(...){UART0-TXDATA=c;while(!(UART0-STATUSTX_READY));return0;}但是如果公司已经有 HAL:company_uart_write(UART0, c);那么重新写寄存器逻辑会产生两个问题。问题 1:代码重复原来:Company HAL ↓ UART register现在变成:Zephyr UART Driver ↓ UART register两套代码都维护 UART。问题 2:HAL 的 SoC workaround 被绕过真实 SoC 往往不是:UART=几个寄存器而可能存在:ClockenableReset release Pinmux FIFO configuration Errata workaround DMA Power management Silicon revision这些东西可能已经封装在 HAL:company_uart_init(){company_clock_enable(...);company_reset_deassert(...);company_pinmux_uart(...);/* * Silicon revision workaround */...UART-CTRL=...;}如果 Zephyr Driver 自己重新实现:UART-CTRL=...很容易绕过这些逻辑。3. 所以 Company HAL 的位置是什么?可以把它理解成:HAL 是 SoC 厂商提供的「硬件操作库」。而:Zephyr Driver 是把这些硬件能力翻译成 Zephyr API。两者不是竞争关系。4. 一个非常重要的边界例如 Company HAL:intcompany_uart_init(conststructcompany_uart_config*cfg);intcompany_uart_putc(uint32_tbase,uint8_tc);intcompany_uart_getc
RELATED

相关推荐

Zephyr BSP: 35-BSP Validation Overview

Zephyr BSP: 35-BSP Validation Overview

摘要:本文是 Zephyr BSP 系列的第 35 篇,核心结论是「blinky 能跑 ≠ BSP 完成」。文章系统性地拆解了 BSP Validation 的完整方法论:从 Build、Boot、CPU、Memory、Clock、Interrupt、GPIO、UART、Timer、SPI、I2C、Flash、Debug 到 Regression 共 14 个验证层次,并给出每…

📅 2026/9/29 4:19:25
零基础快速搭建网站:Cursor 1小时建站实录(TaoToken 统一 Key 配置版)

零基础快速搭建网站:Cursor 1小时建站实录(TaoToken 统一 Key 配置版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:14:25
给做知识库 / RAG 的你 —— MarkItDown 配 TaoToken,让各种文件都能说 Markdown

给做知识库 / RAG 的你 —— MarkItDown 配 TaoToken,让各种文件都能说 Markdown

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/29 4:14:25
MORE NEWS

更多资讯

📰

边缘端AI选型:从场景反推算力,避开TOPS误区

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

EMI辐射发射超标怎么办?从DC-DC振铃到共模天线整改全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Java开发环境配置:JDK 8/17双版本无缝切换+Maven阿里云镜像+IDEA教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

YOLOv11零售货架商品识别:从训练调参到库存统计落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

无线收发芯片选型与射频调试实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

STM32外围电路硬件解析:电源、复位、时钟三大核心电路深度实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬