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

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

3天内不再提示

多线程RTOS应用程序的五个最佳实践

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

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

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

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

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

poYBAGKxIueAGXUIAAHh_MLBOpY601.png

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

调试时更好的洞察力意味着将有更少的猜测,并且更有可能找到根本原因。在无法使用传统方法(如在断点处暂停系统)的情况下,它也是一个很大的帮助。

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

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

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

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

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

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

使用您的跟踪工具将跟踪数据连续流式传输到主机,如果需要,您可以在其中存储很长的记录,甚至在屏幕上实时显示数据。跟踪流使您能够监控系统测试或寻找难以重现的罕见错误。视觉跟踪诊断允许在高级视觉概览中发现异常并深入到特定事件以准确找出发生了什么。

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

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

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

审核编辑:郭婷

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

    关注

    68

    文章

    19083

    浏览量

    228729
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119348
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68196
收藏 人收藏

    评论

    相关推荐

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

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

    RTOS开发最佳实践

    基于RTOS编写应用程序时,有一些要注意事项。在本节中,您将学习RTOS开发最佳实践,例如POSIX合规性、安全性和功能安全认证。
    的头像 发表于 08-20 11:24 359次阅读

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

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

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

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

    鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程并发机制处理CPU密集型任务可以提高CPU
    的头像 发表于 04-01 22:25 759次阅读
    鸿蒙OS开发实例:【ArkTS类库<b class='flag-5'>多线程</b>CPU密集型任务TaskPool】

    鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比

    TaskPool(任务池)和Worker的作用是为应用程序提供一多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降
    的头像 发表于 03-26 22:09 547次阅读
    鸿蒙APP开发:【ArkTS类库<b class='flag-5'>多线程</b>】TaskPool和Worker的对比

    【从0开始创建AWTK应用程序】编译应用到RTOS平台

    AWStudio上编写好AWTK应用程序后,部署到RTOS平台(如STM32)是很方便的,下面就以STM32F429型号为例子来介绍如何编译AWTK应用到RTOS
    的头像 发表于 03-21 08:23 536次阅读
    【从0开始创建AWTK<b class='flag-5'>应用程序</b>】编译应用到<b class='flag-5'>RTOS</b>平台

    java实现多线程的几种方式

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

    基于RTOS的应用进程中的典型线程

    RTOS中的关键因素是最小的中断延迟和最小的线程切换延迟。RTOS的价值在于它的响应速度或可预测性,而不是它在给定时间段内可以执行的工作量。
    发表于 03-05 09:32 489次阅读
    基于<b class='flag-5'>RTOS</b>的应用进程中的典型<b class='flag-5'>线程</b>

    AT socket可以多线程调用吗?

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

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

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

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高
    的头像 发表于 12-01 14:29 1363次阅读

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

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

    多线程同步的几种方法

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

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

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