新闻详情

新闻详情

首页 / 资讯中心 / 详情

Zephyr BSP: 39-SoC家族架构代理娱乐

发布时间:2026/9/29 3:39:26来源:尧图网络
Zephyr BSP: 39-SoC家族架构代理娱乐
SoC Family Architecture:一个 Zephyr BSP 如何支撑一整个 SoC 家族现在必须解决一个更现实的问题:如果公司不是只有一个 SoC,而是有 SoC-A、SoC-B、SoC-C……怎么办?真正成熟的 BSP 不应该:SoC-A → 一套代码 SoC-B → 复制一份 SoC-C → 再复制一份而应该形成:Company SoC Family │ ┌─────────────┼─────────────┐ │ │ │ SoC-A SoC-B SoC-C │ │ │ Board-A Board-B Board-C更重要的是:Common Architecture │ ┌───────────────┼────────────────┐ │ │ │ Common HAL Common Drivers Common SoC │ │ │ ┌────┴────┐ ┌───┴────┐ ┌───┴────┐ A B A B A B这就是今天这一篇的核心:如何设计一个"可扩展的 SoC Family BSP Architecture"。1. 先看一个真实世界的问题假设公司有三个 MCU:Company-X1 Company-X2 Company-X3它们关系如下:特性X1X2X3CPUCortex-M4Cortex-M4Cortex-M7UART相同相同相同GPIO相同相同新版SPI相同相同相同I2C相同相同相同Clock不同不同不同IRQ基本相同扩展不同SRAM128 KB256 KB512 KBFlash512 KB1 MB2 MBPinmux相同相同新版如果没有 Family Architecture,很容易变成:soc_x1/ uart.c gpio.c spi.c clock.c soc_x2/ uart.c gpio.c spi.c clock.c soc_x3/ uart.c gpio.c spi.c clock.c结果:80% 的代码重复。几年以后:X1 UART 修 bug ↓ 忘记 X2 ↓ X3 又有自己的版本这就是 BSP 最容易发生的code fork。2. 正确的第一原则:Family ≠ SoC这是今天最重要的概念之一。不要把:SoC Family理解成:一个 SoC 名字下面有几个型号更准确的理解是:Family 是一组共享硬件架构的软件抽象边界。例如:Company SoC Family │ ├── CPU architecture ├── interrupt model ├── clock model ├── peripheral register model ├── pinmux model └── memory model只要这些东西高度共享,就应该尽量共用代码。3. SoC Family 最常见的三级结构一个比较合理的 Zephyr BSP:arch/ arm/ soc/ company/ family_a/ soc_a1/ soc_a2/ soc_a3/ boards/ company/ board_a1/ board_a2/ board_a3/但这只是目录。真正重要的是:Family │ ├── Common │ ├── Variant │ └── SoC可以画成:Company Family │ ┌───────────┴───────────┐ │ │ Family Common Variant-specific │ │ ┌────┼────┐ ┌────┼────┐ │ │ │ │ │ │ Clock IRQ UART X1 X2 X34. 什么应该放 Family Common?假设:X1 X2 X3UART register layout 完全一样:struct company_uart{volatile uint32_t DR;volatile uint32_t SR;volatile uint32_t CR;volatile uint32_t BAUD;};那么:UART Driver不应该复制三份。应该:drivers/ serial/ uart_company.c然后:X1 ─┐ X2 ─┼──→ uart_company.c X3 ─┘这就是:Driver Commonality5. SoC Common 和 Driver Common 不是一回事这是很多 BSP 新手容易混淆的地方。例如:drivers/serial/uart_company.c属于:Zephyr Driver而:soc/company/family_a/common/属于:SoC Architecture例如 Family Common 里面可能有:clock_control.c soc_irq.c system_init.c pinmux.c power.c这些代码负责:SoC architecture而不是直接实现:Zephyr device API所以:Zephyr │ ┌───────┴────────┐ │ │ SoC Layer Driver Layer │ │ Family Common UART/GPIO/SPI │ │ Variant这是非常重要的边界。6. 三层 SoC Family 模型推荐把 SoC 分成:Family Variant Part例如:CompanyX Family │ ├── CX3 Family │ │ │ ├── CX301 │ ├── CX302 │ └── CX305 │ └── CX5 Family │ ├── CX501 └── CX502或者:CompanyX Family │ ├── CX3 Family │ │ │ ├── CX301 │ ├── CX302 │ └── CX305 │ └── CX5 Family │ ├── CX501 └── CX502这里:Family代表共享的软件架构。Variant代表一个硬件架构分支。Part代表最终芯片型号。7. Devicetree 应该承担什么?这是 SoC Family Architecture 的关键。不要把所有差异塞进 C:# ifdef CONFIG_SOC_X1...# elif CONFIG_SOC_X2...# elif CONFIG_SOC_X3...# endif如果差异属于:硬件描述应该优先进入 Devicetree。例如 X1:soc{uart0: uart@40000000{compatible="company,uart";reg=0x40000000 0x1000;interrupts=5;status="okay";};};X2:soc{uart0: uart@40010000{compatible="company,uart";reg=0x40010000 0x1000;interrupts=7;status="okay";};};Driver 不需要知道:X1 X2Driver 只知道:company,uart然后:DEVICE_DT_DEFINE(...)从 Devicetree 获取:base address IRQ clock pinmux status8. Kconfig 又负责什么?可以用一个非常简单的判断方法:Devicetree回答:我的硬件是什么?例如:UART0 在哪里? GPIO 有几个? IRQ 是多少? SPI 接哪个 clock?Kconfig回答:软件功能是否启用?例如:CONFIG_SERIAL=yCONFIG_GPIO=yCONFIG_SPI=y
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

换 Session、换 Agent 都不失忆!用 TaoToken 统一 Key 给 Coding Agent 接上长期记忆 2026/9/29 6:37:29

换 Session、换 Agent 都不失忆!用 TaoToken 统一 Key 给 Coding Agent 接上长期记忆

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

阅读更多 →
深入深出 openclaw:gateway 代码实现阅读 1 —— 从 server.impl.ts 拆解 WebSocket 接入 TaoToken 的配置骨架 2026/9/29 6:37:29

深入深出 openclaw:gateway 代码实现阅读 1 —— 从 server.impl.ts 拆解 WebSocket 接入 TaoToken 的配置骨架

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

阅读更多 →
openclaw喂饭教程!在 Linux 环境下快速完成安装、初始化与 Web UI 配置(TaoToken 统一 Key 接入版) 2026/9/29 6:37:29

openclaw喂饭教程!在 Linux 环境下快速完成安装、初始化与 Web UI 配置(TaoToken 统一 Key 接入版)

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

阅读更多 →
Vibe coding环境配置:TaoToken统一Key接入Claude Code的settings.json骨架 2026/9/29 6:37:29

Vibe coding环境配置:TaoToken统一Key接入Claude Code的settings.json骨架

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

阅读更多 →
Claude Code、Codex、Gemini CLI 全自动 yolo 模式配置:TaoToken 统一 Key 接入与免审批验证 2026/9/29 6:37:22

Claude Code、Codex、Gemini CLI 全自动 yolo 模式配置:TaoToken 统一 Key 接入与免审批验证

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

阅读更多 →
AI早报 2025年04月10日:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置 2026/9/29 6:37:22

AI早报 2025年04月10日:用 TaoToken 统一 Key 打通 Cline 与 CC Switch 配置

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉