十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenHarmony硬件调试三板斧:日志、状态与信号实战指南

OpenHarmony硬件调试三板斧:日志、状态与信号实战指南 搞嵌入式开发和系统移植的朋友应该都有同感硬件调试这件事做好了是抽丝剥茧的快感做不好就是深夜抓狂的根源。尤其在做OpenHarmony开源鸿蒙这种从内核到框架全链路打通的系统时硬件调试早就不是“点个灯、读个寄存器”那么简单了。最近不少人在折腾电脑版x86 OpenHarmony想在PC上直接跑鸿蒙系统调试场景又变得不太一样。我把这些年做硬件调试积累的套路总结了一下姑且叫它“三板斧”看日志、查状态、量信号。这套方法不挑平台小到开发板大到x86整机基本都能套。这篇教程适合正在做OpenHarmony系统移植、驱动开发、外设适配的工程师也适合刚入手开发板、对系统启动流程一头雾水的初学者。我会从方法论讲到实操命令再给几个真实场景的排查案例尽量把硬件调试这件事讲透。1. 硬件调试三板斧的整体思路1.1 为什么硬件调试绕不开这三招很多人觉得硬件调试就是拿示波器点点测测或者靠仿真器单步走。真正做过系统级开发的人会明白OpenHarmony这种规模的项目问题往往藏在软件和硬件的交界处单靠某一类工具根本搞不定。我自己的体会是任何硬件问题最后都会以某种“症状”暴露出来而这些症状逃不出三个层面系统说了什么日志、打印信息、内核报错这是系统在“说话”。系统处于什么状态寄存器值、设备节点、系统负载这是系统的“体检报告”。物理世界发生了什么电平高低、时序对错、纹波大小这是硬件的“真实现场”。所以我把它们归纳成三板斧每一板斧对应一个层面的排查手段。第一板斧“看日志”解决的是“系统到底跑到哪一步、卡在哪一行”的问题第二板斧“查状态”解决的是“当前软硬件配置到底认没认到设备”的问题第三板斧“量信号”解决的是“物理层波形到底对不对”的问题。这三招是递进关系。我见过太多新手一上来就拿示波器到处点折腾半天没结果回来一问连串口日志都没看过。正确的路子永远是从最高层往底层推先看日志缩小范围再查状态确认配置最后才用仪器去验证物理信号。顺序反了效率就没了。1.2 OpenHarmony调试和其他嵌入式系统的差异用OpenHarmony做开发调试思路和传统单片机开发有本质区别。传统单片机往往是单线程裸机程序printf一打基本就能定位逻辑问题。OpenHarmony是完整的操作系统有内核、有进程调度、有驱动框架问题可能藏在任何一个子系统里。举例来说一个外设不工作可能是硬件引脚接错可能是设备树配置不对可能是驱动没加载也可能是权限管控导致应用层访问失败。这么多环节如果只靠看代码效率太低如果只靠硬件测量又看不到系统内部的运行逻辑。这正是三板斧方法论在OpenHarmony开发中格外好用的原因日志告诉你软件层面的执行轨迹状态检查告诉你内核和外设的“握手”结果信号测量告诉你物理链路是否通畅。另外OpenHarmony的日志体系也很有特点。它不像传统Linux那样只有dmesg和printk而是有一套独立的日志系统hilog从内核态到用户态都有对应的日志通道。后面我会详细展开。1.3 为什么现在大家爱聊电脑版x86 OpenHarmony热搜词里出现了“电脑版x86 OpenHarmony”这个现象很有意思。以前玩OpenHarmony基本离不开开发板RK3568、Hi3516这些芯片一板难求。现在x86平台能跑OpenHarmony了意味着你手头一台普通PC就能体验完整的鸿蒙生态开发门槛大幅降低。但对调试来说x86平台反而有个“幸福的烦恼”它太熟悉了大家容易用PC的思路去排查问题忽略了OpenHarmony作为嵌入式实时操作系统的本质。比如在x86上跑OpenHarmony启动流程里的固件、引导、内核初始化顺序和传统Linux是有差异的日志的获取方式也略有不同。这块我在后面的实操部分会专门提。2. 第一板斧看日志让系统“开口说话”2.1 日志抓取的基本姿势hilog和dmesg一个都不能少OpenHarmony的日志体系可以从两个维度去看。内核态基本沿用Linux内核的日志机制通过dmesg查看用户态和应用框架层则走hilog这是OpenHarmony自研的高性能日志系统。先说dmesg。系统启动过程中内核的打印信息都会进内核环形缓冲区。用dmesg可以直接查看常见用法我列在下面# 查看内核启动日志 dmesg # 带时间戳显示方便对齐启动时序 dmesg -T # 实时跟踪内核日志输出 dmesg -w # 只查看错误级别的日志 dmesg | grep -i error\|fail\|warn再说hilog。hilog的日志通过hilog命令查看支持按域名、级别、进程号过滤。基础用法如下# 实时查看hilog日志 hilog # 按进程名过滤 hilog | grep com.example.myapp # 按日志级别过滤D调试 I信息 W警告 E错误 F致命 hilog -e # 只看错误级别及以上 # 把日志落盘保存方便事后分析 hilog -w core /data/log/hilog_core.log这里有个容易踩的坑hilog的缓存区默认是环形的日志量大的时候早期日志会被冲掉。所以如果系统在启动早期就崩了等你看hilog时可能啥都捞不着。建议在系统稳定之前把hilog的持久化提前打开或者通过串口把日志重定向出来这样能抓住第一现场。2.2 从启动日志定位“卡住”的位置系统起不来的问题绝大多数都能从启动日志里找到端倪。OpenHarmony的启动流程大体是固件启动引导程序UEFI或者U-Boot然后是内核解压和初始化接着是init进程拉起一系列系统服务最后才到应用层。我用x86的OpenHarmony举个例子。正常启动时日志会依次出现内核版本信息、内存检测信息、驱动初始化信息、文件系统挂载信息等。如果日志停在某个驱动初始化的位置不动基本可以断定是那个驱动的硬件初始化没有返回常见原因是硬件复位不成功、时钟没起振、或者中断配置冲突。看启动日志有个技巧不要从头到尾读先看最后几行是停在哪然后从停住的位置往回找前几条日志通常问题就出在最后成功打印的那一行和卡住的那一行之间。# 假设日志保存在boot.log中 tail -50 boot.log我一直强调一个习惯每次刷机或修改配置后的第一次启动一定要保留完整日志。不要嫌日志长系统启动阶段的日志一般也就几百KB它记录的是整个系统的“出生过程”任何异常都逃不过。2.3 日志分析中常见的假象与误判日志分析最容易犯的错是“看见错误就以为找到了根因”。我见过很多新手看到日志里出现一个failed就兴奋得不行结果按照那个方向查了半天发现这只是某个非关键服务的降级提示跟真正的问题半毛钱关系没有。给大家几个识别日志关键信息的经验看错误码比看错误描述更可靠。OpenHarmony的很多错误码是定义在头文件里的比如ERR_OHOS_INVALID_PARAM这类先查错误码定义再结合上下文判断。注意日志的时间戳偏移。如果两个日志之间的时间间隔异常大比如本该毫秒级完成的操作耗了几秒那说明中间有阻塞或者重试这个比单纯报错更值得关注。别忽略D级别日志。很多人只看W和E但有些关键流程只在D级别打了中间状态丢了这些信息排查顺序就断了。提示换一个版本、换一块板子之后同一段日志内容很可能有细微差异。建议先在稳定版本上抓一份“基准日志”存好出问题时和基准日志diff多出来的和少掉的往往就是问题线索。3. 第二板斧查状态让系统“自报家门”3.1 从设备节点和procfs看内核“认没认”硬件日志只能告诉你程序执行到哪里但系统的当前状态还得通过状态接口来确认。OpenHarmony继承了Linux内核的能力所以很多熟悉的排查手段都能直接用。最核心的接口是设备树和设备模型。系统启动后内核会根据设备树把硬件注册到驱动模型中。我们可以这样确认一个设备是否被系统识别# 查看所有平台设备 ls /sys/devices/platform/ # 查看具体设备的状态 cat /sys/devices/platform/fe310000.serial/uevent # 查看设备树中定义的设备是否与内核匹配 ls /proc/device-tree/ cat /proc/device-tree/model如果设备出现在/sys/devices/platform/下至少说明设备和驱动的匹配过程是走通的。如果不在要么是设备树配置的问题要么是驱动没编译进内核。中断状态也是排查外设不响应的重要窗口看中断统计就能知道硬件有没有真正触发中断# 查看各个中断号的触发次数 cat /proc/interrupts我建议关注中断次数这个数字。如果驱动已经加载、寄存器配置也正确但/proc/interrupts里对应中断号始终没有增长那说明物理信号根本没到达中断控制器这时候问题基本可以确定在硬件链路或引脚配置上可以放心动用第三板斧了。3.2 用户态与内核态的“对话”hdc和hilog组合拳OpenHarmony开发中绕不开的一个工具是hdcHarmonyOS Device Connector它的地位相当于嵌入式开发者的串口终端加adb的合体。通过hdc可以进入设备的shell环境直接执行命令、访问文件系统、查看进程。# 连接设备USB或网络方式 hdc list targets # 进入设备shell hdc shell # 在设备上执行单条命令 hdc shell cat /proc/meminfo # 查看当前运行的系统服务 hdc shell hidumper -s 10 # 抓取系统CPU、内存等整体状态 hdc shell top -n 1hilog配合hdc可以快速定位应用层或者服务框架层的问题。比如某个系统服务起不来通过hidumper -s查看服务注册状态再通过hilog过滤该服务的日志基本就能定位。这里分享一个实际案例有一次我调一个传感器驱动应用层始终读不到数据。用hdc进入shell后发现/dev/input下根本没有对应节点说明驱动虽然加载了但没成功创建设备节点。再查dmesg发现驱动在probe阶段就返回了错误原因是I2C通信失败。顺着这条线索去查硬件发现传感器地址配置错了。整个排查过程没有用示波器全靠状态检查和日志就锁定了方向。3.3 状态检查的时机选择与横向对比状态检查最大的陷阱是“只查一次”。系统的状态是动态变化的一次查询结果正常不代表整个过程都健康。我通常的做法是在复现问题的前后各抓一次状态做对比。比如问题出现时内存占用90%问题解决后内存占用30%这组对比就很有说服力。另外横向对比也很关键。同一套系统改了某段代码或换了一块板子之后出问题把前后的内核配置差异、设备树差异、驱动版本差异都列出来逐项对比往往比闷头查代码快得多。我在实际工作中会把每次修改前的dmesg、/proc/cmdline、设备树源文件都归档这样出问题随时可以回溯。注意OpenHarmony的版本迭代很快不同版本之间/sys、/proc接口可能会有变化。如果你从网上找到某条状态检查命令在当前版本上执行报错先别急着怀疑硬件去查一下当前版本的接口是不是改名了。4. 第三板斧量信号让硬件露出“真面目”4.1 万用表、示波器、逻辑分析仪各管什么日志和状态检查做得再细最后都要过物理层这一关。第三板斧解决的是“系统告诉我的结论和实际物理现象是否一致”的问题。三类常用工具的分工是这样的工具适用场景核心指标容易忽视的点万用表电源电压、通断、电阻直流电压、短路动态跌落测不到需用示波器补示波器波形形状、时序、纹波幅度、频率、上升沿探头接地线太长会导致信号失真逻辑分析仪多路数字信号时序关系电平跳变顺序、协议解码采样率不够会漏采样要留够余量我个人的经验是优先用万用表排除电源和地的问题然后用示波器观察关键信号波形最后用逻辑分析仪验证多路信号之间的时序关系。顺序不能乱否则很容易被一个正常的波形骗过去。4.2 OpenHarmony开发中最值得先测的几组信号拿到一块新板子做OpenHarmony系统适配时我不会盲目地把所有信号都测一遍而是先测最容易出问题的四个点核心电源轨3.3V和1.8V或具体芯片要求的电压看空载和满载时电压是否稳定正常波动范围应该在标称值的5%以内。时钟信号SoC的主时钟或者外设的参考时钟频率要准、幅度要够。时钟偏了串口通信就会乱码网络就不通所有跟时序相关的功能都会出问题。复位信号复位的低电平持续时间要足够释放后不能有毛刺。我遇到过因为复位电路电容太大导致系统上电后迟迟不复位完成看起来就像“死机”。关键外设的中断或数据线比如I2C的SDA/SCL通信时是否正常翻转有没有卡在低电平的情况。测电源的时候有个细节示波器要用交流耦合档位配合20MHz带宽限制来看纹波如果用直流耦合去看电源的直流分量会把纹波淹没啥也看不出来。4.3 软硬件联调时的信号解释技巧信号测量最考验经验的地方不在“测”而在“怎么解释测到的波形”。举个例子你用示波器看一个通信接口的波形看到一个很窄的负脉冲频率大概几百赫兹。经验不足的人可能觉得这是噪声直接忽略。实际上这可能是芯片在定期发送心跳包或者是中断引脚上出现了不该出现的毛刺。怎么区分有一个笨办法但很有效把手放在芯片附近或者用示波器探头轻轻点一下芯片的供电引脚如果波形变了说明存在干扰耦合如果波形稳定不变那大概率是正常的周期性行为。我做软硬件联调时经常用“一处信号不动另一处信号强制变化”的方法。比如怀疑某个中断引脚有问题就用手头工具给对应的传感器一个外部触发看中断引脚上是否出现期望的跳变。如果功能正常时该引脚有跳变异常时没有问题就锁定在传感器侧如果两种情况下引脚都有跳变但系统就是不响应问题就跑到中断控制器或者软件配置上了。提示示波器探头的地线夹不要夹得太远。地线夹形成的环路面积越大测到的高频噪声越多波形越不可信。我一般会把探头地线夹缩短到2厘米以内或者用弹簧地针这样测出来的波形才接近真实。5. 三板斧联动一个完整的启动挂起排查案例5.1 案例背景一块x86开发板运行OpenHarmony时启动挂起为了把三板斧的联动方式讲清楚我拿一个之前遇到的真实案例来做完整复盘。当时手里的设备是一块x86平台的主板跑OpenHarmony系统现象是开机后系统卡死在启动过程中最后一行日志永远停在某个固定的位置没有任何进一步输出。这类问题在系统开发中非常典型硬件环境固定软件配置有改动开机起不来。很多人第一反应是怀疑内核配置改错了但真正的元凶可能藏在硬件层面。5.2 第一轮排查从日志确认卡死位置我先抓了完整的启动日志。通过串口连接主板波特率设为115200在开机前就把串口终端打开。最终日志停止在这一段附近[ 3.142382] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 3.152250] serial8250: ttyS0 at I/O 0x3f8 (irq 4) is a 8250 [ 3.160445] serial8250: ttyS1 at I/O 0x2f8 (irq 3) is a 8250日志停在内核里串口驱动初始化完成之后接下来系统应该继续枚举PCI设备、初始化存储设备。最后的打印是串口驱动注册完成而后续驱动没有任何输出。这一步的信息量很大串口驱动能正常工作说明最基本的内核运行环境没问题而后续设备没有枚举出来问题大概率出在PCI总线或者某个PCI设备上。5.3 第二轮排查状态检查排除软件配置在确认卡死位置后我用状态检查手段做进一步筛查。因为日志停在内核启动早期用户态命令还不可用这里能用的主要是内核编译参数和设备树配置。我把内核启动参数从“静默模式”切换到“详细模式”在GRUB或UEFI引导配置里加上earlyprintkserial,0x3f8,115200重新开机。这次日志更详细了能看到PCI总线的枚举过程[ 3.300011] PCI: Probing PCI hardware [ 3.303452] PCI: Probes of PCI devices for bus 0000:00 finished但注意它只是“probe finished”并没有继续往下走。结合之前的信息我判断问题集中在PCI设备枚举之后的某个资源分配环节。这时候我还用了一个状态检查技巧对比同一块主板在另一个版本的OpenHarmony内核上的启动日志发现旧版本能正常走到PCI设备驱动加载新版本却不行。配置对比后发现新旧版本对某个PCI设备的resource处理逻辑有改动。到这里范围从“整个系统”缩小到了“PCI资源分配”。5.4 第三轮排查信号测量定位硬件异常软件层面的嫌疑已经很明确但为什么资源分配会失败我决定把示波器拉出来看看PCI设备相关的物理信号。我重点测了PCI复位信号和时钟信号。因为卡在设备枚举与资源分配之间如果某个PCI设备的复位没释放或者时钟不稳会导致设备无法正常响应资源分配就会失败。实测发现板卡上一路PCI时钟的波形频率正常但幅度明显偏低只有标称值的60%左右。这个幅度的时钟信号无法保证所有PCI设备都能可靠识别尤其在系统负载升高或温度变化时更容易出问题。再查时钟源发现该路时钟由一个可编程时钟芯片产生配置寄存器的值有一项和硬件要求不匹配。到这里三个层面的信息拼在一起就完整了日志告诉我们卡在哪状态检查帮我们锁定与PCI资源相关信号测量最终暴露了物理层的时钟幅度异常。最终修改时钟芯片的配置参数后系统正常启动问题解决。5.5 复盘三板斧如何帮我们避开弯路这个案例如果只用一种手段走弯路几乎是必然的。从头到尾只看日志你会在驱动代码里翻很久只查状态你很难理解为什么资源分配失败只量信号你根本不知道要测哪个脚。三板斧组合起来每一板斧都帮下一板斧缩小了范围最后花在排查上的总时间反而最少。这也是我想强调的核心方法不要在一棵树上吊死。现在很多教程教大家“用示波器查这个问题”“看日志查那个问题”但真实世界的问题根本不会自动贴上标签告诉你该用哪种工具。唯一可靠的办法就是掌握一套完整的排查闭环。6. 常见问题与排查技巧实录6.1 日志抓不到或日志丢失怎么办这是硬件调试里最让人恼火的问题之一系统崩了但日志啥也没留下。常见原因和解决思路如下日志缓冲区太小早期日志被环形覆盖。解决方法是提前调大hilog缓冲区或者在启动早期就把日志重定向到串口。崩溃发生在串口驱动初始化之前。这种情况需要借助硬件调试器如JTAG/SWD或让固件阶段先输出打印确认到内核入口是否正常。日志输出到了别的终端。OpenHarmony有多个日志输出目标确认当前命令看到的是不是真正的系统控制台。用hilog时也要先敲hilog -d确认当前设备的日志域设置。我还有一个习惯在开发阶段把consolettyS0,115200和earlyprintkttyS0,115200同时打开这样从固件到内核的所有打印都能串口看到。系统稳定后再把这些调试参数去掉这样能最快地抓住“第一现场”。6.2 串口输出乱码或者完全没有输出串口乱码是硬件调试最常见的入门级问题。很多情况并不是板子坏了而是配置对不上。波特率不一致。确认你的串口终端设置的波特率和系统打印配置一致115200是最常见的但不要想当然去固件配置里查实际值。电平不匹配。部分板子是TTL电平有些是RS232电平用错转接线会导致乱码或完全无输出。接地问题。串口通信是异步的收发双方必须共地只接了TX、RX不接地大概率读到乱码。误把普通GPIO当成串口TX。如果完全没有输出先拿示波器看看你接的那个引脚有没有电平跳变有跳变说明数据在发只是接收端配置不对没跳变说明问题在发送端。我在x86平台上调试过一次特别典型的乱码串口终端怎么配波特率都是乱码最后用示波器一测发现该路UART的波特率实际是2400跟配置的115200完全对不上。查了固件源码原来是某个宏定义被改过绕了一大圈。6.3 测量到“幽灵信号”的辨别经验在信号测量中我踩过最多次的坑是被假信号欺骗。所谓“幽灵信号”就是示波器上明明看到了激动的波形但拿掉探头之后系统一切正常装上探头问题复现。这种情况通常是探头本身引入了干扰或者是测量点选取不当。几个实用建议测量高频信号时探头衰减倍数和示波器通道设置必须匹配10倍探头就要设定成10x否则幅度和带宽都不准。测量电源纹波时用弹簧地针代替长地线夹并把带宽限制在20MHz否则你看到的“纹波”多半是空间耦合进来的噪声。观察多路信号时序时用逻辑分析仪比用多通道示波器方便得多但采样率一定要高于被测信号最高频率的5倍以上。判断信号是否真实我习惯用“一致性法”同一个测量点换不同探头测或者把探头换个接地位置再测如果波形对测量方式敏感那这个信号本身就要打问号。6.4 三板斧调试速查表下面的速查表是我打印出来贴在工位上的内容也分享给大家问题现象第一板斧日志第二板斧状态第三板斧信号系统完全无输出串口从头抓确认固件阶段是否启动—测核心电源、复位、时钟启动卡死在驱动初始化看最后日志停在哪个驱动查看对应设备的uevent和interrupts测该外设时钟、复位、数据线开机后系统反复重启看panic堆栈和看门狗日志对比稳定版状态接口输出测电源跌落和复位毛刺外设数据不对过滤外设相关hilog日志读设备节点、寄存器值用逻辑分析仪解码协议时序系统运行慢/卡顿查看是否有大量错误重试日志top、hidumper查看CPU/内存占用测存储接口、DDR频率是否正常这张表不能覆盖所有问题但它能帮你在混乱中快速找到切入点。硬件调试最怕的是乱了阵脚三板斧给你一个固定的排查顺序至少保证方向不会跑偏。写在最后做OpenHarmony的硬件调试这几年我最大的体会是调试不是比谁工具多、谁仪器贵而是比谁对系统的理解深、谁的排查逻辑顺。三板斧听起来简单真正用得好的人靠的是对日志的敏感度、对状态接口的熟悉程度以及对物理信号的判断经验。这三样都没有捷径只能靠一个个问题喂出来。最后再分享一个小技巧每次排查完一个问题花十分钟把过程写成一份简报记录现象、排查路径、根因和修复方法。这十分钟的投入会在你下一次遇到类似问题时变成十倍的时间回报。调试之路漫漫三板斧在手心里不慌祝大家都能顺利点亮自己的那块板子。
返回列表