ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Zephyr 平台上的 nrf5340bsim 模拟板卡:基于 BabbleSim 的双核 nRF5340 开发与调试指南

Zephyr 平台上的 nrf5340bsim 模拟板卡:基于 BabbleSim 的双核 nRF5340 开发与调试指南 Zephyr 平台上的 nrf5340bsim 模拟板卡基于 BabbleSim 的双核 nRF5340 开发与调试指南【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr导读本文围绕 Zephyr RTOS 仓库中 nrf5340bsim 模拟板卡文档 展开系统讲解如何在开发主机上原生仿真 Nordic nRF5340 双核 SoC应用核 cpuapp 与网络核 cpunet。这套方案由 BabbleSim 负责仿真射频行为、由 POSIX 架构与 native simulator 负责在开发机上以原生速度执行应用代码读者学完后将掌握两个模拟板卡的选型与构建方法、如何把双核镜像组装进同一个可执行文件含 sysbuild 方式、以及 TrustZone/TF-M 在仿真环境中的边界与替代方案。一、nrf5340bsim 是什么为了在开发主机上模拟 nRF5340 SoCZephyr 提供了两个目标板板卡目标对应物理核心说明nrf5340bsim/nrf5340/cpuappnRF5340 应用核Application core对应 nrf5340dk 目标的 cpuapp 构建目标nrf5340bsim/nrf5340/cpunetnRF5340 网络核Network core对应 nrf5340dk 目标的 cpunet 构建目标这两个板卡从 board.yml 定义 上看type: native、arch: posix、simulation: native并且要求环境中存在BSIM_OUT_PATH环境变量。它们的工作方式与 nrf52_bsim 一脉相承使用 BabbleSim 仿真射频活动使用 POSIX 架构与 native simulator 在开发系统上原生运行应用。这样做的好处是原生代码执行性能运行速度远快于指令级仿真可以使用 gdb、valgrind 等本机工具直接调试继承 POSIX 架构的固有限制文档中的posix_arch_limitations一节。从 Kconfig.nrf5340bsim 可以看出BOARD_NRF5340BSIM会select SOC_POSIX两个目标共享同一套板级配置。1.1 与 nrf5340dk 的关系与真实 nrf5340dk 目标一致nrf5340bsim/nrf5340/cpuapp对应应用核nrf5340bsim/nrf5340/cpunet对应网络核。区别在于仿真板卡针对已被建模的外设复用了与 nrf5340dk 完全相同的驱动因此应用层代码几乎无需改动即可在两者之间迁移。1.2 已被建模的外设清单nrf5340bsim 板卡包含了以下 nRF5340 SoC 外设的模型AAR加速地址解析器 Accelerated Address ResolverAES CCM 与 AES ECB 加密硬件CLOCK时钟控制DPPI分布式可编程外设互连 Distributed Programmable Peripheral InterconnectEGU事件生成单元 Event Generator UnitFICR工厂信息配置寄存器 Factory Information Configuration RegistersGPIO 与 GPIOTEIPC核间通信 Interprocessor communicationMUTEX互斥外设NVMC非易失存储器控制器 / FlashRADIORNG随机数发生器RTC实时计数器TEMP温度传感器TIMERUARTE带 Easy DMA 的 UARTUICR用户信息配置寄存器 User Information Configuration Registers这些外设使用与 nrf5340dk 目标相同的驱动。至于每个模型被建模到何种细节程度可查阅 BabbleSim 的ext_nRF_hw_models仓库中的HW models implementation status文档见硬件模型实现状态。从 cpuapp 的设备树文件 可以观察到仿真板卡对未建模的外设I2C、SPI、PWM、PDM、I2S、QDEC、USB、NFCT、QSPI、ADC、看门狗、比较器等通过/delete-node/与/delete-property/方式从继承的arm/nordic/nrf5340_cpuapp.dtsi中移除网络核的 设备树 同样删除了 watchdog、I2C/SPI、ACL、VMC 等节点并在 RADIO 节点中删除dfe-supported因为 RADIO 模型暂不支持 DFE 特性。1.3 资源限制的差异与真实 nrf5340 器件不同nrf5340bsim 板卡的 RAM 与 Flash 对代码来说都是不受限制的。例如 cpuapp 设备树把 flash0 定义为 1024 KiB、sram0 定义为 512 KiB但正如文档强调的仿真环境中的这些数值更多是逻辑上的真正的约束来自开发主机资源。二、构建与使用这两个模拟板卡2.1 环境准备如果只开发 SoC 中的某一个核可以按 nrf52_bsim 板卡的构建说明来操作只需把 board/target 换成对应的目标即可。前置条件主机 32 位 C 库POSIX 架构有相应依赖见 POSIX Arch 依赖 的posix_arch_deps一节。系统内编译好 BabbleSim最简单的方式是在本地 west 配置中启用 babblesim 组执行 west update 并编译模拟器west config manifest.group-filter -- babblesim west update cd ${ZEPHYR_BASE}/../tools/bsim make everything -j 8如果需要更多 BabbleSim 组件或更新版本可参考 BabbleSim 官网关于 fetch 与 build 的说明。设置两个环境变量指向 BabbleSim 安装目录export BSIM_OUT_PATH${ZEPHYR_BASE}/../tools/bsim export BSIM_COMPONENTS_PATH${BSIM_OUT_PATH}/components/建议把这两行追加到~/.zephyrrc或 shell 初始化脚本如~/.bashrc避免每个新 shell 都要手动执行。2.2 构建示例以 hello_world 为例构建针对网络核的镜像west build -p auto -b nrf5340bsim/nrf5340/cpunet samples/hello_world运行无射频场景./build/zephyr/zephyr.exe -nosim # 按 CtrlC 退出注意-nosim表示脱离 BabbleSim 仿真运行仅在无射频活动时可用对大多数 Zephyr sample 与测试完全够用。2.3 运行带射频的仿真当需要射频活动时必须同时运行 BabbleSim 的 2G42.4GHz物理层仿真Phy。以 BLE central 连接 peripheral 为例把两个可执行文件复制到 BabbleSim bin 目录后一起运行cd ${BSIM_OUT_PATH}/bin/ ./bs_nrf5340bsim_samples_bluetooth_peripheral_hr -strial_sim -d0 ./bs_nrf5340bsim_samples_bluetooth_central_hr -strial_sim -d1 ./bs_2G4_phy_v1 -strial_sim -D2 -sim_length10e6 命令行参数含义-s唯一标识本次仿真的字符串-D告诉 Phy 本次仿真共有多少设备-d告诉每个设备自己在仿真中的设备编号-sim_length仿真时长微秒。BabbleSim 设备和 Phy 支持大量命令行开关运行它们并加-help可查看完整说明。2.4 自动启动与无镜像行为与真实硬件不同仿真环境下网络核 MCU 默认被设置为启动时自动 boot以便在没有应用核镜像时也能独立开发。可通过以下两种方式控制Kconfig 选项CONFIG_NATIVE_SIMULATOR_AUTOSTART_MCU命令行选项--cpu1_autostart。如果某个 MCU 在没有镜像的情况下被 boot它会自动进入睡眠状态。2.5 串口控制台的使用部分应用需要控制台交互通常启用CONFIG_CONSOLE_SUBSYS与CONFIG_CONSOLE_GETCHAR。BabbleSim 板卡默认关闭 UART 控制台需要附加serial-consolesnippetwest build -S serial-console [...]然后通过伪终端pseudoterminal连接查看输出与交互# 自动附加到终端 ./build/zephyr/zephyr.exe --uartuart_id_pty_attach # 使用自定义命令附加到终端例如 xterm -e screen %s ./build/zephyr/zephyr.exe --uartuart_id_attach_cmdcmd # 手动连接伪终端 ./build/zephyr/zephyr.exe --uartuart_id_pty --uart_pty_wait minicom -D /dev/pts/pts_id--uart_list选项会打印uart_id与外设的映射关系overlay 文件则描述哪个 UART 外设被用作控制台输出。更多细节可查看可执行文件的-help输出。三、把双核镜像组装进单个可执行文件默认情况下针对nrf5340bsim/nrf5340/cpuapp或nrf5340bsim/nrf5340/cpunet的构建会得到zephyr/zephyr.elf对应 MCU 的代码镜像库zephyr/zephyr.exe包含 native simulator runner、SoC 硬件模型、该镜像以及另一个核的空镜像的可执行文件。3.1 使用 CONFIG_NATIVE_SIMULATOR_EXTRA_IMAGE_PATHS如果想在可执行文件中装入之前已构建好的另一核镜像无论由 Zephyr 构建系统还是其他兼容 native simulator 的构建系统生成可以通过 Kconfig 选项CONFIG_NATIVE_SIMULATOR_EXTRA_IMAGE_PATHS把这个镜像提供给第二个镜像的 Zephyr 构建。3.2 使用 sysbuild 构建双核可执行文件更推荐的方式是使用 System buildsysbuild 构建双 MCU 可执行文件。仓库中 nrf53_sync_rtc 示例的 sysbuild.cmake 是理解该流程的最佳参考if(${SB_CONFIG_NET_CORE_BOARD} STREQUAL ) message(FATAL_ERROR Target ${BOARD} not supported for this sample. There is no remote board selected in Kconfig.sysbuild ) endif() set(REMOTE_APP net) ExternalZephyrProject_Add( APPLICATION ${REMOTE_APP} SOURCE_DIR ${APP_DIR}/${REMOTE_APP} BOARD ${SB_CONFIG_NET_CORE_BOARD} ) native_simulator_set_child_images(${DEFAULT_IMAGE} ${REMOTE_APP}) native_simulator_set_final_executable(${DEFAULT_IMAGE})关键点在于通过ExternalZephyrProject_Add把第二个核示例中是net作为独立 Zephyr 工程加入构建native_simulator_set_child_images声明哪个是子镜像native_simulator_set_final_executable让默认镜像生成最终的合并可执行文件。该示例的应用核与网络核代码分别位于 samples/boards/nordic/nrf53_sync_rtc/app 与 samples/boards/nordic/nrf53_sync_rtc/net。重要限制这些库/镜像不是嵌入式镜像。它们不能用于嵌入式设备也不能用嵌入式镜像去组装 native 可执行文件。四、TrustZone、TF-M 与安全注意事项这些板卡没有建模 ARM TrustZone由此带来一系列约束不存在安全态secure与非安全态non-secure执行状态或总线访问的区分所有 RAM、Flash 和外设原则上对所有软件可访问拥有独立互连主端口的外设原则上可以访问任何其他外设或 RAM 区域不存在nrf5340bsim/nrf5340/cpuapp/ns板卡/构建目标也无法混合安全与非安全镜像目前没有 SPUSystem Protection Unit模型因此 Flash、RAM 区域或外设不能被标记为仅限安全或非安全访问TF-M 无法使用。另外ARM Cryptocell-312 外设未被建模。Mbed TLS 库仍然可以使用但使用的是软件加密后端而非 Cryptocell 硬件加速。五、调试、覆盖率、消毒器与时间模型5.1 原生调试工具链与 native_sim 一致构建产物是 Linux 原生应用因此可以用调试或检测本机应用的工具如gdb、valgrind来调试与检测。POSIX 架构的代码覆盖率分析手段coverage_posix在该板卡同样可用native_sim 的地址与未定义行为消毒器ASan/UBSannative_sim_asan也同样适用。BabbleSim 在其一个或多个组件被调试器或检测工具运行的情况下也能正常工作例如在断点处暂停某个设备会暂停整个仿真。5.2 确定性BabbleSim 在设计上是完全确定性的结果不受主机计算速度影响。所有随机性都由随机种子控制这些种子可以作为命令行选项提供。5.3 仿真时间BabbleSim 中的时间是模拟的与真实时间解耦。通常模拟时间比真实时间快几个数量级仅受工作站算力限制。如果需要把仿真速度限制到实时或其实时比例可以连接 BabbleSim 的 handbrake device 到 Phy。六、实战要点小结选板只做单核开发时直接用nrf5340bsim/nrf5340/cpuapp或nrf5340bsim/nrf5340/cpunet需要双核协同验证时走 sysbuild 路线。环境确认主机 32 位 C 库、BabbleSim 编译产物与BSIM_OUT_PATH/BSIM_COMPONENTS_PATH两个环境变量就绪。运行无射频场景用-nosim有射频场景必须启动bs_2G4_phy_v1并正确设置-s、-d、-D、-sim_length。网络核启动网络核默认自动 boot可用CONFIG_NATIVE_SIMULATOR_AUTOSTART_MCU或--cpu1_autostart控制无镜像 boot 会自动睡眠。安全边界TrustZone、SPU、Cryptocell-312 均未建模TF-M 不可用涉及安全态划分的验证应回到真实硬件。控制台需要串口交互时通过-S serial-console启用 snippet再用--uartid_pty_attach等选项连接伪终端。如需进一步深挖可继续阅读 nrf5340bsim 板卡源码目录、nrf52_bsim 板卡文档 以及 nrf53_sync_rtc 示例后者是双核 sysbuild 集成最直接的实践范本。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表