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

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

3天内不再提示

嵌入式设计中每一分钱都很重要

星星科技指导员 来源:嵌入式计算设计 作者:Shawn Prestridge 2022-11-16 17:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

量化节约的最简单方法之一是BML:低成本零件要求公司花费更少的钱来制造产品。在大多数嵌入式设计中,两个最昂贵的部件通常是屏幕(如果设备有,大多数物联网设备没有)和处理器。随着您向处理器添加更多内存(闪存和 RAM),处理器的成本也会增加。虽然成本增加多少的具体细节因半导体公司而异,但粗略的经验法则是,每增加一倍内存,处理器单位成本就会增加约一美元。

使这个问题变得更糟的是,嵌入式工程师通常不太擅长在应用程序的设计阶段预测内存需求。这些对所需内存量的最佳“猜测”是处理器选择的关键因素。鉴于许多生产运行每年达到数十万或数百万台,在BML中增加不必要的美元会对公司的底线产生有害影响。

结果,无数项目“资源紧张”,这是“我们没有正确预测内存需求”的代码。加剧这个问题的是,BML通常在项目开始时就被推荐给高层管理人员。一旦发生这种情况,成本就变得不可侵犯。这使人们争先恐后地减少内存占用,或者依靠采购来保持BML成本与管理层预期的相同,通过协商其他组件的更好价格。为了减少内存占用,团队经常求助于编译器的优化引擎来减小生成的代码的大小。

提高编译器优化的标准

一些工程师非常不愿意加快优化,因为他们认为优化会给系统带来错误。这种情况很少发生,根据我的经验,大约 5% 的优化器问题最终是优化器的问题。

当优化级别提高时,编译器对 C 和 C++ 语言的语义非常挑剔。优化决策是基于对语言规则的严格解释做出的。通常,工程师并没有以他们看起来很自然的方式完全了解语言和代码的所有细微差别。

例如,如果函数调用是这样编写的:

myFunc(varA, varB, varC, varD);

自然的假设是从左到右读取变量:varA 将从内存中读取,然后是 varB 等。

但是,C 或 C++ 中没有任何内容表明必须如此。如果内存是有目的地布置的,或者是偶然的,其中varB位于varD旁边,那么高级优化可能会使用索引寄存器来读取连续的内存空间,以节省代码大小和速度。

在大多数情况下,这不会对代码产生影响。但是,如果您依赖于从左到右编写时要访问的变量,则可能会出现代码在较低优化下运行良好但在高级别无法正常运行的情况。这就是工具供应商提供的良好支持结构可以帮助发现这些类型的问题并重写代码部分以更好地优化和正常工作的地方,而与优化设置无关。

此外,如果您的代码可以在高优化下工作,那么它编写正确并且经过更好的测试。如果代码在更高的优化下不起作用,则很有可能潜在缺陷正在等待“咬你”。

当设置为高尺寸优化时,好的工具可以节省 10-40% 的代码大小。但是,并非所有优化转换都是任何代码段的好选择 - 某些转换实际上可能会增加某些类型代码的代码大小。这本身就是一篇文章。

目前,有一些资源可以解决“从编译器中获得最少的资源”,这意味着最小大小的代码和最紧凑的执行时间。节省如此多的代码空间可能是剥离功能以保持在设备尺寸内、由于手动优化代码而错过计划或超出 BML 预算之间的区别。

虽然好的代码可以在任何优化级别上运行相同的操作,但调试高度优化的代码在最好的情况下是很棘手的。例如,整个代码段可以折叠到完全不同的位置的其他代码段中。这就是为什么必须在低优化或无优化下调试代码,并在增加优化以运行全部测试之前验证代码是否正常运行的原因。

在 BML 中调试成本

使嵌入式调试变得困难的部分原因是,大多数人根本不知道他们武器库中的所有调试工具。它们倾向于默认使用 printf 语句和代码断点。在尝试隔离硬故障、查找发生堆栈溢出的位置或找出变量不断被破坏的原因时,这些默认值无济于事。

好消息是,存在特殊的工具可以帮助发现这些类型的问题。

处理硬故障

让我们从硬故障开始。许多现代MCU都具有实时指令跟踪功能,可让您跟踪指令流。在基于 Arm 的设备上,用于实现此目的的技术是嵌入式跟踪宏单元 (ETM)。参考手册将指示设备是否支持 ETM。如果是这样,请将跟踪引脚拉到调试标头,并使用启用跟踪的调试器(如 IAR I-jet 跟踪),该调试器可以捕获该实时指令流并将其显示在调试器窗口中。

要查找导致硬故障的原因,只需滚动跟踪窗口并找到在转到错误处理程序之前执行的指令。瞧!这个指示是罪魁祸首。如果可以可靠地重现错误,请在错误处理程序处设置断点并消除跟踪窗口中的所有滚动 - 罪魁祸首是跟踪窗口中的倒数第二条指令。

现在原因已知,因此可以在罪魁祸首上设置断点,并再次运行测试用例,以查看导致异常的代码出了什么问题。

但是,如果您没有 ETM 怎么办?大多数基于 Arm 的设备都具有串行线输出 (SWO),允许采样、低速跟踪。虽然您没有收到每一条指令,但这可以提供足够的跟踪信息来缩小范围并定位问题。此外,尝试降低MCU时钟和/或调整SWO设置,以便从调试器中获取更精细的跟踪信息粒度,以查明问题发生的位置。

其他设备架构具有与 ETM 或 SWO 类似的功能。因此,使用高质量的工具可以利用这些信息并快速隔离和消除问题。此外,可用的支持资源有助于提高 SWO 的性能,以保护更多的跟踪数据。

停止堆栈溢出

堆栈溢出或找出变量神秘丢失其内容的原因怎么样?使用相同的技术来诊断这两种情况。

在 Arm 领域,大多数处理器在其调试接口中都有一个数据观察点和跟踪 (DWT) 块,可用于快速隔离这些类型的问题。在这种情况下,请使用数据观察点来找出坏事发生的地方。每当接触一段数据时,此观察点本质上就是一个断点。

将选项配置为仅在读取和/或写入数据时中断执行。此外,甚至可以将其限制为仅在数据是具有特定位掩码的特定值时才中断。在避免每次访问数据时都停止时,这非常方便。

在堆栈溢出的情况下,我们希望在堆栈顶部设置一个数据观察点。读取或写入该值并不重要,因为堆栈在代码中的那个点已经吹响了。处理器将在堆栈顶部停止执行,提供一个完全保留的调用堆栈,允许查看哪一段代码正在吹堆栈以及您如何到达该点。这是确定如何修复错误的关键。

清理整理数据

对于被破坏的数据,我们使用基本相同的技术,只是在该变量经历写入时设置数据观察点。如果始终使用相同的值进行破坏,则进一步缩小断点的范围,仅在将该值写入变量时跳闸。然后,再次运行我们的测试用例,找出导致问题的代码。

同样,许多其他架构(如瑞萨电子RL78、RX和许多其他芯片供应商的器件)具有类似的功能,可用于实现相同的结果。使用高质量的工具,查找这些类型的问题变得更加容易,并增加了满足紧迫的时间表和截止日期的几率。

让采购知道您的关心

事半功倍似乎是一个矛盾,但通过使用正确的工具可以轻松实现。通过使用编译器优化,您可以将代码硬塞到尽可能小的空间中,以便为您的应用程序使用最便宜的设备。

优化还可以帮助桌面检查您的代码,以查看它在高优化下是否运行相同,以便在您将代码签入构建之前找到潜在的代码缺陷(从而使每个缺陷都计入您的发布指标)。它还通过使用完整的工具箱更快地查找错误来帮助您更有效地进行调试,从而缩短测试和修复周期并更快地启动项目。

如果您知道工具箱中有哪些工具(以及如何正确使用它们),您就可以让每一分钱都为您的组织发挥作用。

审核编辑:郭婷

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

    关注

    68

    文章

    20333

    浏览量

    255052
  • C++
    C++
    +关注

    关注

    22

    文章

    2131

    浏览量

    77384
  • 编译器
    +关注

    关注

    1

    文章

    1672

    浏览量

    51915
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【解决方案】新能源园区投资,如何让每一分钱都“心中有数”?

    体化微电网成为新能源消纳与能效提升的关键载体,但风光分布能源出力的波动性、负荷需求的不确定性,让新能源规划和能源管理难度陡增。 传统能源调度模式难以匹配实时能源供需变化,导致能源浪费、运行成本高等问题。市场亟需
    的头像 发表于 02-26 16:03 206次阅读
    【解决方案】新能源园区投资,如何让<b class='flag-5'>每一分钱</b>都“心中有数”?

    嵌入式单片机开发学习路径

    嵌入式系统是现代科技的重要组成部分,广泛应用于智能家居、汽车电子、工业控制、医疗设备等领域。学习嵌入式单片机开发不仅能提升个人技能,还能开拓职业发展路径。本文将为你提供条详细的
    发表于 02-09 15:42

    记ESP32CAM踩坑解决指南,已反映商家

    中国香河英茂科工没有个鸭蛋是白吃的,没有一分钱融资是百花的,都转化为科技成果----记ESP32CAM踩坑解决指南,已反映商家 https://user.qzone.qq.com/382905282/blog/1770127464
    发表于 02-03 22:23

    什么是嵌入式应用开发?

    系统,用于控制、监测或通信等特定用途。与般计算机系统不同,嵌入式系统通常具有较小的存储容量、处理能力和功耗,且需要满足特定的实时性、可靠性和安全性要求‌。 应用领域 嵌入式系统
    发表于 01-12 16:13

    嵌入式软件测试找bug的常见方法和秘诀

    嵌入式软件开发过程般来说,花在测试比花在编码的时间要多很多,通常为3:1(甚至更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对般人来讲
    发表于 01-12 07:07

    电表自身耗电谁掏钱?答案明确:不用居民买单!

    答案来了,不用居民掏一分钱
    的头像 发表于 12-31 10:58 1072次阅读

    嵌入式应掌握的几种能力

    1. 编程语言 基本掌握嵌入式必备的编程语言。C语言为主,C++为辅。在资源有限的情况下,大多数嵌入式产品还是使用C语言为主的,特别是底层驱动开发。上层应用开发大多用C,在些资源比较充足的平台
    发表于 12-08 06:05

    UPS电源售价迷雾重重?读懂这几点,让你的每一分钱都花在刀刃上

    导语:正在为数据中心、医疗设备或家庭办公电脑寻找台可靠的UPS不间断电源?查价格,从几百到数万,是不是瞬间眼花缭乱?价格差异的背后,究竟隐藏着怎样的秘密?今天,我们就来拨开迷雾,聊聊UPS售价
    的头像 发表于 11-20 10:45 683次阅读
    UPS电源售价迷雾重重?读懂这几点,让你的<b class='flag-5'>每一分钱</b>都花在刀刃上

    嵌入式系统的定义和应用领域

    不在影响着我们的生活和工作方式。 在嵌入式系统嵌入式操作系统和嵌入式微处理器扮演着至关重要的角色。从硬件层面剖析,
    发表于 11-17 06:49

    2025年最佳的嵌入式编程语言有哪些呢?

    嵌入式系统是现代科技不可或缺的一部分。它们存在于家用电器、汽车、住宅、医院、商店等各个领域。它们与我们的社会紧密相连。选择合适的语言来构建嵌入式系统对于成功至关重要。那么,2025年最
    的头像 发表于 11-14 10:27 1786次阅读
    2025年最佳的<b class='flag-5'>嵌入式</b>编程语言有哪些呢?

    嵌入式开发的关键点介绍

    嵌入式开发在现代科技扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要开发人员具备深入的硬件知识和编程
    发表于 11-13 08:12

    N101仿真运行C程序出错怎么解决?

    公众号里面的微信不能添加了。。。。。能不能处理下,帮我拉如讨论群,谢谢! 问题:芯来一分钱计划里面的N101SoC,然后将C程序编译好之后,仿真运行时出现错误,大家能不能看看时什么原因帮忙解决下。。。。。,新手小白看不出什么
    发表于 11-06 06:02

    为什么说对嵌入式ARM核心板进行24小时老化测试十分重要

    在飞凌嵌入式的生产及测试流程,有个雷打不动的环节——每块核心板产品都必须完成24小时持续老化测试,才能获准出厂。这个看似简单的数字背后,是飞凌
    的头像 发表于 10-24 09:01 9583次阅读
    为什么说对<b class='flag-5'>嵌入式</b>ARM核心板进行24小时老化测试十<b class='flag-5'>分重要</b>?

    嵌入式工程师为什么要学QT?

    Qt对嵌入式工程师来说,真的很重要吗? Qt是个跨平台的C++应用程序开发框架,非常适合嵌入式系统的开发,Qt在嵌入式开发
    发表于 08-14 15:15

    入行嵌入式应该怎么准备?

    想入行嵌入式该怎么准备。很能理解大家对于嵌入式的关注,嵌入式系统是当今科技领域中的重要组成部分,它存在于我们生活的方方面面,各行各业。智能化时代的到来也让
    发表于 08-06 10:34