尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ARM SCP-firmware 编译与模块生成实战:从 CMake 配置到自动生成 fwk_module_list.c 的 5 个步骤
ARM SCP-firmware 编译与模块生成实战从 CMake 配置到自动生成 fwk_module_list.c 的 5 个步骤在嵌入式系统开发领域ARM SCP-firmware 作为系统控制处理器的核心固件承担着电源管理、时钟控制等关键任务。本文将深入探讨如何从零开始编译 SCP-firmware并解析其构建系统如何根据Firmware.cmake中的SCP_MODULES列表自动生成核心框架文件。1. 环境准备与工具链配置在开始编译 SCP-firmware 之前需要确保开发环境满足以下要求操作系统推荐使用 Linux 发行版如 Ubuntu 20.04 或更高版本CMake 版本至少需要 3.18.4 版本工具链ARM GNU Toolchain推荐 13.3 或更高版本安装步骤下载 ARM GNU Toolchainwget https://developer.arm.com/-/media/Files/downloads/gnu/13.3.rel1/binrel/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz解压并安装工具链xz -d arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz tar -xvf arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu.tar将工具链添加到环境变量export PATH$PATH:/path/to/arm-gnu-toolchain-13.3.rel1-x86_64-aarch64-none-linux-gnu/bin提示建议将环境变量设置添加到~/.bashrc文件中以便永久生效。2. 源码获取与产品选择SCP-firmware 支持多种 ARM 平台我们需要根据目标硬件选择合适的产品配置git clone https://github.com/ARM-software/SCP-firmware.git cd SCP-firmwareSCP-firmware 的目录结构中product目录包含了各种平台的配置product/ ├── juno/ # Juno 开发板配置 ├── morello/ # Morello 平台配置 ├── tc2/ # Total Compute 平台配置 └── ...产品选择对比表产品名称适用平台主要特点junoJuno 开发板完整的参考实现适合学习morelloMorello 平台支持 CHERI 安全扩展tc2Total Compute高性能计算场景3. CMake 配置解析SCP-firmware 使用 CMake 作为构建系统核心配置文件位于产品目录下的Firmware.cmake。以 Juno 平台为例# product/juno/scp_romfw/Firmware.cmake list(APPEND SCP_MODULES juno-ppu) list(APPEND SCP_MODULES juno-rom) list(APPEND SCP_MODULES gtimer) list(APPEND SCP_MODULES sds) list(APPEND SCP_MODULES bootloader) list(APPEND SCP_MODULES juno-soc-clock)关键变量说明SCP_MODULES定义了该产品包含的所有模块SCP_MODULE_IDX_MAX自动计算的模块数量SCP_MODULE_IDX_GEN生成的模块索引枚举构建系统会根据这些模块定义自动生成框架核心文件包括fwk_module_idx.h模块索引枚举定义fwk_module_list.c模块表及配置表4. 编译流程与模块生成完整的编译流程可以分为以下几个步骤配置阶段make -f Makefile.cmake PRODUCTjuno/scp_romfw MODEdebug configure生成模块索引# 示例生成命令实际由构建系统自动执行 python tools/gen_module_code.py --modules juno-ppu,juno-rom,gtimer,sds,bootloader,juno-soc-clock编译固件make -f Makefile.cmake PRODUCTjuno/scp_romfw MODEdebug firmware-scp_romfw自动生成文件示例生成的fwk_module_idx.h内容示例enum fwk_module_idx { FWK_MODULE_IDX_JUNO_PPU 0, FWK_MODULE_IDX_JUNO_ROM 1, FWK_MODULE_IDX_GTIMER 2, FWK_MODULE_IDX_SDS 3, FWK_MODULE_IDX_BOOTLOADER 4, FWK_MODULE_IDX_JUNO_SOC_CLOCK 5, FWK_MODULE_IDX_COUNT 6, };生成的fwk_module_list.c内容示例extern const struct fwk_module module_juno_ppu; extern const struct fwk_module module_juno_rom; /* ...其他模块声明... */ const struct fwk_module *module_table[FWK_MODULE_IDX_COUNT] { module_juno_ppu, module_juno_rom, /* ...其他模块指针... */ }; const struct fwk_module_config *module_config_table[FWK_MODULE_IDX_COUNT] { config_juno_ppu, config_juno_rom, /* ...其他模块配置... */ };5. 模块系统深度解析SCP-firmware 的模块系统是其核心架构理解其工作原理对定制开发至关重要。5.1 模块定义与注册每个模块需要定义并导出fwk_module结构体实例// module/juno_rom/src/mod_juno_rom.c const struct fwk_module module_juno_rom { .type FWK_MODULE_TYPE_SERVICE, .init juno_rom_init, .bind juno_rom_bind, .start juno_rom_start, .process_event juno_rom_process_event, };5.2 模块初始化流程框架初始化时会按照以下顺序调用模块函数fwk_module_init()初始化模块表和配置表fwk_module_start()调用各模块的.init函数执行两轮.bind调用round 0 和 round 1调用.start函数启动模块模块绑定示例// module/cmn700/src/mod_cmn700.c static int cmn700_bind(fwk_id_t id, unsigned int round) { status fwk_module_bind( FWK_ID_MODULE(FWK_MODULE_IDX_SYSTEM_INFO), FWK_ID_API(FWK_MODULE_IDX_SYSTEM_INFO, MOD_SYSTEM_INFO_GET_API_IDX), system_info_api); return status; }5.3 模块间通信机制SCP-firmware 提供了两种模块间通信方式API 调用通过fwk_module_bind获取其他模块的 API事件机制使用fwk_put_event发送事件事件处理示例static int juno_rom_process_event( const struct fwk_event *event, struct fwk_event *resp) { /* 处理事件逻辑 */ return FWK_SUCCESS; }6. 实战添加自定义模块为了加深理解让我们通过一个实例演示如何添加自定义模块创建模块目录结构module/my_module/ ├── include/ │ └── mod_my_module.h ├── src/ │ └── mod_my_module.c └── CMakeLists.txt实现模块基本结构// mod_my_module.c #include mod_my_module.h static int my_module_init(fwk_id_t id) { /* 初始化逻辑 */ return FWK_SUCCESS; } const struct fwk_module module_my_module { .name my-module, .type FWK_MODULE_TYPE_DRIVER, .init my_module_init, /* 其他回调函数 */ };添加到产品配置 在product/your_product/firmware_x/Firmware.cmake中添加list(APPEND SCP_MODULES my-module)编译验证make -f Makefile.cmake PRODUCTyour_product MODEdebug firmware-scp_ramfw7. 调试技巧与常见问题在实际开发中可能会遇到各种问题以下是一些实用的调试技巧启用调试日志FWK_LOG_INFO([MY_MODULE] Initialization started);检查模块绑定状态确保所有依赖模块都已正确添加到SCP_MODULES验证fwk_module_bind的返回值常见错误排查模块未加载检查SCP_MODULES是否包含该模块API 绑定失败确认 API ID 和模块索引正确初始化失败检查.init函数的返回值性能优化建议尽量减少模块初始化时间合理设计模块间的依赖关系使用事件机制替代轮询通过本文的详细讲解你应该已经掌握了 SCP-firmware 的编译流程和模块系统工作原理。在实际项目中建议从简单的模块开始逐步深入理解框架的各个细节。
RELATED

相关推荐

如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果

如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果

如何通过ExplorerBlurMica打造个性化的Windows文件管理器视觉效果 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlurMica …

📅 2026/8/30 3:49:49
CesiumJS 图层混合实战:2种影像叠加实现昼夜平滑过渡,Alpha值动态控制详解

CesiumJS 图层混合实战:2种影像叠加实现昼夜平滑过渡,Alpha值动态控制详解

CesiumJS 图层混合实战:2种影像叠加实现昼夜平滑过渡与Alpha动态控制 在数字孪生和地理可视化领域,昼夜交替效果不仅是基础功能,更是提升用户体验的关键细节。传统实现往往局限于简单的透明度切换,导致晨昏过渡生硬不自然。本文将…

📅 2026/9/17 3:30:22
OpenAI硬件产品解析:AI推理优化与边缘计算落地实践

OpenAI硬件产品解析:AI推理优化与边缘计算落地实践

1. 先搞清楚 OpenAI 硬件产品到底在解决什么问题OpenAI 的硬件产品动向之所以被关注,本质上是因为大家想弄明白:一个以软件和模型见长的团队,为什么要做硬件?它到底想解决现有 AI 使用流程中的哪些具体痛点?从我过去跟…

📅 2026/9/8 16:05:03
MORE NEWS

更多资讯

📰

用Multisim仿真MOS管电源开关:NMOS低端与PMOS高端设计

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

📰

RK3568 Maskrom模式全解析:三种进入方式与救砖实战

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

📰

激光二极管恒流驱动设计:从原理、选型到PCB实战指南

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

📰

车载测试实战:CAN/UDS/OTA故障定位与验证方法论

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

📰

树莓派SD卡全量备份与恢复:Win32DiskImager实战指南

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

📰

Convex 数据迁移模式实战指南:widen-migrate-narrow 工作流与零停机策略

数据库后端 【免费下载链接】convex-backend The open-source reactive database for app developers 项目地址: https://gitcode.com/gh_mirrors/co/convex-backend 点击查看 免费下载 导读 本指南以 convex-migration-helper 技能的迁移模式参考文档&#xff08…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬