拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Flipper Zero 固件 Furi HAL 调试指南:用编译期宏开启 GPIO 信号与 SD 总线日志

Flipper Zero 固件 Furi HAL 调试指南用编译期宏开启 GPIO 信号与 SD 总线日志【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware本指南围绕 documentation/FuriHalDebugging.md 展开系统讲解 Flipper Zero 固件中 Furi HAL 层为底层调试预留的编译期特性如何通过--extra-define宏开启 FuriHalOs 的调度/时间流跟踪、FuriHalPower 的电源模式切换跟踪以及 FuriHalSD 的 SPI 总线日志。读完本文你将掌握这几组调试开关的具体含义、每个 GPIO 信号的电平语义、对应的源码实现位置以及在实际排针上的观察方法可直接用于低层追踪、剖析与信号重定向/复制类调试场景。调试特性的开启方式编译期宏与 fbtFuri HAL 的调试特性默认关闭全部通过向固件编译过程注入额外的宏定义define来启用适用于低层跟踪tracing、性能剖析profiling以及信号重定向/复制signal redirection/duplication等场景。开启方法是在fbt构建命令中追加--extra-define参数。根据 documentation/fbt.md 第 114 行的命令行参数说明--extra-defineA --extra-defineBC— 额外的全局宏定义会被透传给 C/C 编译器可多次指定。典型用法./fbt firmware --extra-defineFURI_HAL_OS_DEBUG --extra-defineFURI_HAL_POWER_DEBUG其中firmware为构建目标也可替换为flash、debug等其他目标--extra-define可重复书写以同时开启多个调试特性。需要说明的是这些调试宏的实际实现位于 targets/f7/furi_hal/ 目录下本仓库当前固件面向 STM32WB 平台的 f7 目标以下三个子系统各自支持独立的调试开关。FuriHalOs调度与时间流的三路 GPIO 跟踪--extra-defineFURI_HAL_OS_DEBUG开启操作系统层的调试输出覆盖tick系统节拍、tick suppression节拍抑制、idle空闲与 time flow时间流。启用后会有 3 个信号被暴露到外部 GPIO 引脚实现文件为 targets/f7/furi_hal/furi_hal_os.c。信号名引脚电平语义用途AWAKEPA7高 系统忙于计算低 睡眠中跟踪进入睡眠模式的转换时刻TICKPA6每个系统 tick 翻转一次仅在无 tick suppression 进行时翻转跟踪 tick 偏移与异常任务调度SECONDPA4每秒翻转一次跟踪实时性RT问题时间流扰动意味着系统不满足硬实时约束AWAKE忙/闲状态的可视化在 furi_hal_os.c 的furi_hal_os_init()中三个调试引脚被初始化为推挽输出GpioModeOutputPushPullAWAKE 初始写高电平。真正的电平切换发生在空闲睡眠路径furi_hal_os_sleep()内进入睡眠前将 AWAKE 拉低第 141-143 行睡眠唤醒后立即拉高第 148-150 行。因此 AWAKE 的高电平宽度即系统忙于计算的时间低电平宽度即睡眠时间可直接用逻辑分析仪或示波器观察系统的忙闲占空比以及从高到低/从低到高的沿来定位睡眠进出的时机。TICK节拍翻转与 tick 抑制检测TICK 信号在furi_hal_os_tick()中翻转第 75-83 行。该函数在调度器已启动后先将 TICK 翻转一次再调用xPortSysTickHandler()进入 FreeRTOS 的 SysTick 处理。当空闲睡眠路径vPortSuppressTicksAndSleep()执行 tick suppression 时见 第 169-207 行系统会挂起 tick 定时器、用低功耗空闲定时器替代计时此期间 TICK 不会翻转——这正是文档所说“仅在无 tick suppression 进行时翻转”的底层含义。借助 TICK 信号可以直观发现两类问题tick skew节拍偏移实际睡眠耗时与预期 tick 数不一致。源码在vPortSuppressTicksAndSleep()中会把超出预期的 tick 数以N的格式通过日志打印第 196-199 行TICK 波形可用于交叉印证偏移是否发生异常任务调度若某段代码长时间关中断、阻塞或过度占用 CPUTICK 翻转会呈现异常停顿或抖动。SECOND每秒翻转与硬实时校验SECOND 信号由furi_hal_os_init()中创建的一个周期为 1000 tick 的 FuriTimer 驱动第 67-69 行回调furi_hal_os_timer_callback()每执行一次就翻转一次 SECOND 引脚第 48-52 行。由于它由正常任务上下文调度任何导致时间流扰动例如长时间的睡眠、中断风暴、时钟切换都会在 SECON 的周期上体现为抖动或缺失因此它是对“系统是否满足硬实时Hard RT约束”的粗粒度判据。调试辅助中断挂起追踪除三个 GPIO 外FURI_HAL_OS_DEBUG还附带两个专为调试器设计的辅助函数furi_hal_os_nvic_dbg_trap()遍历WWDG_IRQn至DMAMUX1_OVR_IRQn的 NVIC 挂起中断与furi_hal_os_exti_dbg_trap()解析 EXTI 行号二者内部均有__NOP()断点锚点注释明确提示“在调试时找出 IRQ 号/EXTI 行号”第 85-108 行。当系统因挂起中断而无法进入睡眠时这两个函数会在调试器下触发断点帮助定位“谁在阻止睡眠”。FuriHalPower电源模式切换的两路跟踪--extra-defineFURI_HAL_POWER_DEBUG开启电源子系统模式切换跟踪实现文件为 targets/f7/furi_hal/furi_hal_power.c。启用后暴露 2 个 GPIO 信号信号名引脚电平语义模式特点WFIPB2高 正在使用轻睡眠等待中断最轻量、最不易出问题的省电模式所有功能与调试均应正常STOPPC3高 正在使用 STOP 模式平台深睡眠绝大部分硅片被关闭或处于不可用状态几乎无法调试 MCUWFI轻睡眠的进出标记在furi_hal_power_init()中两个调试引脚同样被初始化为推挽输出并默认写低第 54-60 行。轻睡眠路径位于furi_hal_power_light_sleep()第 171-179 行执行__WFI()前将 WFI 拉高从__WFI()返回后拉低。由于 WFI 模式仅暂停 CPU 等待中断几乎不影响任何外设与调试器因此该信号适合统计系统处于轻睡眠的时间占比并验证furi_hal_power_sleep_available()由furi_hal_power.insomnia计数决定见 第 162-164 行的判定逻辑是否按预期放行睡眠。STOP深睡眠的脆弱窗口STOP 信号在furi_hal_power_deep_sleep()中、执行__WFI()前拉高唤醒后拉低第 228-234 行。该函数对应文档所述“平台深睡眠模式”进入前会先挂起辅助外设如 USART见furi_hal_power_suspend_aux_periphs()第 181-189 行并涉及 PLL/HSE/HSI 时钟切换与硬件信号量HSEM协调——整个过程由furi_hal_power_deep_sleep_available()把关第 166-169 行其中包含三个前提条件BT 核存活、未设置遗留睡眠 RTC 标志、当前没有 GDB 调试会话。这一点对调试者很重要STOP 模式下大部分硅片关闭MCU 内部调试基本不可能因此固件在检测到 GDB 会话激活时会自动禁止进入深睡眠furi_hal_debug_is_gdb_session_active()此时观察 STOP 信号将看不到拉高沿——这是预期行为而非故障。FuriHalSDSD 卡 SPI 总线日志--extra-defineFURI_HAL_SD_SPI_DEBUG开启 SD 卡 SPI 总线日志实现文件为 targets/f7/furi_hal/furi_hal_sd.c。与前面两组 GPIO 信号不同这一特性不输出电平而是通过日志通道输出 SD 卡 SPI 通信过程中的关键状态。在 furi_hal_sd.c 第 8-12 行sd_spi_debug(...)宏在开启时展开为FURI_LOG_I(TAG, ...)TAG 为SdSpi关闭时为空操作。从源码可见日志覆盖了 SD 卡初始化的完整流程与异常分支SPI 模式初始化 v1/v2 的进入与完成Init SD card in SPI mode v1/v2、... doneACMD41失败、CMD55失败、CMD0失败、CMD58失败等异常分支的定位容量类型判定结果SD card is SDHC or SDXC或SDSC第 557 行复位与重试过程Power reset与SD init OK after %d retries第 921、948 行。启用后上述日志通过 Furi 日志系统输出可用串口 CLI 或日志工具查看适用于排查 SD 卡无法挂载、SPI 时序异常、供电复位等底层问题。需要注意的是该宏只开启日志打印并不改变 SPI 总线本身的电气行为。观察信号时的硬件注意点三个调试特性所用的 5 个引脚——PA7、PA6、PA4、PB2、PC3——同时也是 Flipper Zero 外扩 GPIO 排针上的可用引脚。从 targets/f7/furi_hal/furi_hal_resources.c 的gpio_pins[]引脚表第 71-104 行可以看到它们的排针编号信号引脚排针编号AWAKEPA72TICKPA63SECONDPA44WFIPB26STOPPC375 号位为PB3不在本调试特性中。建议用逻辑分析仪多通道同步采样同时抓取 AWAKE、TICK、SECOND 或 WFI、STOP 组合并以 GND 为公共参考配合系统日志进行时间戳对齐分析。由于这些引脚在调试模式下被初始化为推挽输出调试期间不应再将该排针位置用于其他外设功能。总结Furi HAL 调试特性是 Flipper Zero 固件为低层问题排查预留的“示波器接口”FURI_HAL_OS_DEBUG— 三路 GPIOAWAKE/TICK/SECOND跟踪调度忙闲、节拍抑制与时间流并附带 NVIC/EXTI 挂起断点辅助与 tick 偏移日志FURI_HAL_POWER_DEBUG— 两路 GPIOWFI/STOP标记轻睡眠与 STOP 深睡眠窗口其中 STOP 模式受 GDB 会话检测自动保护FURI_HAL_SD_SPI_DEBUG— 以日志形式输出 SD 卡 SPI 初始化全过程与异常分支。三者均通过./fbt ... --extra-defineMACRO编译期开启宏实现集中于 targets/f7/furi_hal/ 目录关闭时对运行时零开销。对于需要深入追踪固件睡眠行为、实时性抖动或存储介质底层问题的开发者这组开关是进入 Furi HAL 内部的第一把钥匙。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门