0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

无痛多线程:摆脱调试地狱的五个简单技巧

星星科技指导员 来源:嵌入式计算设计 作者:Dr. Johan Kraft 2022-11-18 17:09 次阅读

多线程 RTOS 应用程序的一个更被低估的方面是,您不能只查看代码来完全理解应用程序的工作原理

你需要知道它的各个部分是如何相互通信的,你需要很多其他信息:任务需要多长时间才能执行,是否存在任何潜在的竞争条件或死锁,你是否满足你的计时要求等等。

您希望代码执行的操作和实际执行的操作可能在许多方面有所不同,这些差异在代码中既难以看到,也难以测试。对于所有使用多线程代码的开发人员来说,无论他们使用 RTOS 还是 Linux,这都是一个挑战,最好使用可视化跟踪诊断工具进行管理,这些工具可以让您深入了解我所说的代码的“黑暗面”——您可以从字面上看到它在执行时的行为。

视觉时间线是一个很好的起点。在许多情况下,查看随时间分布的软件事件、消息和任务执行非常重要,例如,当从症状中看不出错误的确切位置时,计算机在数字处理和文本日志中搜索方面可能非常出色,但通常您不知道要搜索什么。在视觉模式识别方面,人脑表现出色。

poYBAGN3S-GAJgWeAAGZXegH8Es210.png

显示软件事件的可视化时间线为您提供了嵌入式应用程序内部工作的概述,如果您需要深入挖掘以查找错误,这是一个很好的起点。

调试时更好的洞察力意味着猜测更少,找到根本原因的几率更高。在无法使用传统方法(如在断点上停止系统)的情况下,它也有很大帮助。

你说printf调试呢?是的,printf 易于部署,有时它确实是您所需要的,但它的价格很高。将调试打印输出放在对时间敏感的应用程序代码中是有风险的,并且不能很好地扩展到更复杂的应用程序和更快的处理器。此外,printf 通常非常慢,每次打印输出大约几毫秒。相比之下,软件事件跟踪的优化解决方案可以比这快 100 倍左右,允许您在同一时间段内收集更多信息。

确保在整个开发项目中测量时间和性能。如果做得好,这可以确保您能够在开发过程中检测和解决任何问题,而不是在承诺的交付日期之前与时间赛跑。

满足时序规格对于具有硬要求的实时系统至关重要,但对于几乎任何嵌入式系统的用户体验也很重要。没有人喜欢缓慢的触摸屏或慢速的wifi路由器,因为它无法提供承诺的吞吐量。同样,从源代码来看,根本原因可能并不明显,如果真正的问题是糟糕的软件设计,简单地切换到更快的处理器可能没有任何好处。

如果您发现自己处于项目的“调试地狱”中,大量的调试会消耗房间中的所有能量并阻止项目向前发展,那么可视化跟踪诊断可以帮助您。在基于 RTOS 的应用程序的软件设计中未能遵循最佳实践通常是一个主要因素,它可能以性能差、处理器负载高或瞬态错误等形式出现。任务之间的大量依赖关系是设计可以改进的另一个常见信号

即使是架构不佳的系统今天也可能运行,但它们将具有复杂和混乱的行为,再加上糟糕的可测试性,这增加了难以捉摸的错误泄漏到生产设备的风险。而且它们几乎肯定会很脆弱,因此代码或环境中的微小更改可能会导致它们失败。

可视化跟踪诊断可帮助开发人员分析和改进其软件设计,并确保稳定可靠的系统行为。当您能够更早地发现软件设计缺陷时,修复它们所需的更改更少。设计改进还可以带来更好的系统性能和响应能力,这反过来又可以让您选择更具成本效益的处理器来降低 BoM 成本或使用较低的时钟频率以延长电池寿命。

使用跟踪工具将跟踪数据连续流式传输到主机,如有必要,您可以在主计算机上存储很长的记录,甚至可以在屏幕上实时显示数据。跟踪流使您能够监视系统测试或查找难以重现的罕见错误。可视化跟踪诊断允许在高级可视化概述中发现异常,并向下钻取到特定事件以准确了解发生了什么。

最后,可视化跟踪诊断可以作为纯软件解决方案实现,不需要额外的硬件,甚至不需要调试探针。内存和处理器使用量是有成本的,但通常不超过这个成本,你可以在整个开发、测试甚至部署过程中将其保留在系统中。在所有阶段都提供这些信息意味着每个人都每天都能从中受益。

此方法允许记录应用程序中的任何相关信息,包括运行时未公开的内部数据和状态。数据可以与可视化执行时间线并行绘制,以便在运行时深入了解您的应用程序。这样,您可以制作出击败竞争对手的出色产品

遵循这五个最佳实践,在系统级别获得所需的实时行为可见性,以提高产品质量并加快开发速度,从而更快地进入市场。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19095

    浏览量

    228788
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119357
收藏 人收藏

    评论

    相关推荐

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进程池来提高并发执行效率。
    的头像 发表于 10-23 11:48 228次阅读
    Python中<b class='flag-5'>多线程</b>和多进程的区别

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 246次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的
    的头像 发表于 03-14 16:55 546次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    使用C++11新特性实现一通用的线程池设计

    在C++11标准之前,多线程编程只能使用pthread_xxx开头的一组POSIX标准的接口。从C++11标准开始,多线程相关接口封装在了C++的std命名空间里。
    的头像 发表于 12-22 13:58 1125次阅读
    使用C++11新特性实现一<b class='flag-5'>个</b>通用的<b class='flag-5'>线程</b>池设计

    redis多线程还能保证线程安全吗

    是单线程的,多个客户端请求会按序执行,每个请求使用一线程完成,这样可以避免多线程之间的竞争条件和锁等带来的开销。但是,由于Redis是存储内存中的数据的,当多个客户端同时对同一
    的头像 发表于 12-05 10:28 1617次阅读

    redis使用多线程处理操作命令

    Redis 是一使用多线程处理操作命令的开源内存数据库系统。它以其高性能、可扩展性和灵活性而闻名,通常被用作缓存、消息代理和数据存储等各种应用场景。在本文中,我们将详尽、详实、细致地探
    的头像 发表于 12-05 10:25 528次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 1371次阅读

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步的问题,即保证多个
    的头像 发表于 11-17 14:22 1101次阅读

    多线程并发查询oracle数据库

    数据库的原理、使用场景、实现方法以及可能遇到的问题和解决方案。 一、多线程并发查询的原理 在传统的单线程查询方式中,当一查询请求发起时,数据库会按照顺序执行查询语句并返回结果。如果查询语句比较复杂或者数据量比较大,查询的时
    的头像 发表于 11-17 14:22 3546次阅读

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的访问。下面将介绍几种常见的
    的头像 发表于 11-17 14:16 1102次阅读

    Linux系统上多线程和多进程的运行效率

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你
    的头像 发表于 11-10 10:54 1292次阅读
    Linux系统上<b class='flag-5'>多线程</b>和多进程的运行效率

    LabVIEW多线程编程解析 LabVIEW的VI优先级和并行循环等相关知识

    软件开发过程中总会遇到需要多线程同步运行的情况,尤其是一些复杂的测试系统和大型项目,仅靠单线程运行的程序是远远无法满足用户需求的,甚至可以说在复杂测试系统的软件开发中,多线程运行是最基本的。
    的头像 发表于 11-10 10:20 1w次阅读
    LabVIEW<b class='flag-5'>多线程</b>编程解析 LabVIEW的VI优先级和并行循环等相关知识