01.Debug是什么?
1947年9月9日,美国著名科学家格蕾丝.霍普(Grace Hopper)与其同伴在对Mark II计算机进行研究时发现,导致计算机无法正常工作的罪魁祸首居然是一只粘在继电器上的小飞蛾。格蕾丝用镊子将飞蛾夹出,并用胶带固定到日志中,并在日志最后写了这样一句话:“First actual case of bug being found”。这是历史上第一次出现关于bug的记载,排除故障的过程被称为“Debug”,后被译为调试,并在之后的计算机领域内广为流传。
在75年后的今天,计算机领域的软硬件调试技术经历了不断的发展和演进,对嵌入式领域而言已成为与开发、设计一样重要的存在。尤其在嵌入式系统飞速发展的飞行控制领域,软硬件紧耦合的尴尬处境使得具备优秀调试技术的工程师变得炙手可热:只有快速定位问题并找到问题出现的根本原因,才能最大程度地降低调试成本,缩短开发周期。
02.常规的调试步骤有哪些?
第一步 · 正确重现问题
当问题出现在本地时,工程师通常可以轻松实现问题复现,但当问题出现在设备所在地或远程站点时,调试工作便完全依赖于记录了设备各项参数设置的可靠日志。在实际操作中,此类情况的出现将对最终的调试结果造成直接影响——一旦复现的问题与实际存在出入,一切调试工作都将存在偏差,需要多次迭代才能最终解决问题。
第二步 · 缩小问题所在范围
一旦问题被正确复现,接下来的步骤就是细化问题所在区域。嵌入式系统通常可分为应用层、固件层、硬件层,这一过程便可通过获取这之中的数据流来完成:以应用层与固件层、硬件层的接口为抓手,获取数据流,并根据逻辑将数据流路径划分为更多的子级别。这一过程可独立检查、测试来确定每一层是否存在问题,并缩小问题所在范围。
第三步 · 修复每一个小问题
由于嵌入式系统通常存在高度耦合性,因此问题极有可能不仅仅存在于一处。需要根据设备逻辑纵观数据流完整路径,找到所有需要修改之处,并一一修改对应代码。
第四步 · 充分测试,确保Debug已完成
比与棘手的bug做斗争更为令人沮丧是,在工程师以为Debug完成后,bug还依然存在,且“解决方案”导致了更多bug的出现。解决此类问题的方法便是进行充分测试,但由于高耦合门槛的存在,常规的TypeScript、console.log、VS Code都无法应对当下复杂度极高的嵌入式系统。
03.仿真:飞控Debug的解决方案
对嵌入式系统整体过程进行全数字实时仿真,便可在很大程度上解决上述各种各样的调试问题。由迪捷软件自主研发的天目全数字实时仿真软件SkyEye,可在常见的桌面级操作系统上仿真嵌入式硬件芯片,模拟各类复杂嵌入式系统的被测环境,1:1还原真实硬件芯片内部的行为逻辑,通过运行真实的目标二进制程序,实现从真实硬件到仿真硬件开发、调试、测试验证的无缝过渡。
借助SkyEye,工程师可以在世界上任何地方快速搭建与远程设备相同的硬件仿真环境,轻松实现问题复现,还可实现远程代码开发、调试和测试工作。本地已有的系统环境可被快速发送给组内其他同事,完美解决因被测环境不同导致的现场难复现问题,避免复杂配置等各类环境因素带来的时间与资源的浪费。
对飞控领域而言,因其往往涉及多方资源协作,真实硬件整机系统的搭建往往需要花费大量时间来完成,而除了上述优势外,SkyEye自带的GDB调试工具,不仅支持底层驱动、消息中间件和上层应用软件代码的调试,还支持查看硬件内存、寄存器状态等各项指标,可实现替换昂贵的飞控调试器,且仍满足从硬件、固件代码到应用软件的所有调试工作。