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

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

3天内不再提示

优化嵌入式软件的七个技巧,不同应用程序的优化需求各不相同

GReq_mcu168 来源:未知 作者:李倩 2018-04-08 11:21 次阅读

技巧1—总是创建基准用于比较

创建基准用于比较优化结果的必要性显而易见,令人惊讶的是开发团队常常在没有任何基准的情况下匆忙开展优化。基准测量很重要,因为每次优化得到的改进会越来越小。举例来说,第一遍能耗优化可能有20%的改进,第二次有10%,第三次5%,以此类推。开发人员应了解这种趋势,并将他们在系统中获得的改进量化为输入次数的函数。

技巧2—设定优化目标

每一次优化都比前一次需要更多的时间才能从系统中获得极少量的改进。开发团队需要仔细平衡他们的时间投入,并根据改进结果判断是否值得花这么多时间。一味闷头做事很容易沉迷,可能花了数周时间才认识到自己在优化一个不再需要优化的系统。因此在优化开始之前,开发团队应设定一个目标值,达到这个目标,就表示优化结果对当前应用来说足够好,优化过程已经完成。

技巧3—使用正确的测量工具

如果没有合适的测量工具,优化一个系统是很困难的。举例来说,如果不使用一种精确的方法来测量系统和微控制器的能耗,便很难完成能耗的优化。开发人员经常无法区分这两种不同的能量测量,他们试图减少实际上无法再减少的微控制器能耗。

对性能优化感兴趣的开发人员可以看一看我在“亲自动手:Segger系统查看工具”中介绍的Segger系统查看工具,这款工具对于了解哪些 函数正在独占CPU非常有用。如果没有能够精确测量或可供开发人员查看系统行为的工具,那么在优化系统时便抓不住重点。

技巧4—使用优化工具

为了减小代码大小或提高性能,嵌入式软件的许多方面都可以优化。一些情况下可以使用独立的或附属的工具链。Somnium DRT优化器就是一种很好的优化工具,可以与GCC一起用来优化代码大小、能量使用率和性能。

不过有时候外部工具可能不是必需的,只要选择正确的工具链就足够了。我最近写了一篇题为《开源与商用编译器》的文章,说明了这样一个事实:在Coremark测试中,对于相同的微控制器和相同的测试条件,商用编译器的得分总是高于GCC等开源编译器。

技巧5—使用编译器属性和#pragma指令

我一般很不喜欢用#pragma指令或编译器属性。属性和#pragma指令通常是不可移植的,改变编译器可能会造成软件缺陷。然而,在调整嵌入式软件时,开发人员通常没有选择。使用属性和#pragma指令可以提高速度,并能根据实际情况有选择地优化某个功能。基于这些理由,想要优化软件的开发人员应该熟悉属性的使用,而且要阅读《用C语言编写可移植的优化程序》,这样他们才知道如何编写出可移植的最优程序,并且没有负面影响。

技巧6—多做实验

在优化系统方面没有一成不变的方法,开发人员不应该局限于任何一种特殊的技术。有时候学习和优化系统的最好方法是尝试各种实验并分析其结果。

当我首次为了低功耗而优化系统时,做了很多实验,也出现了一些错误。通过实验过程和所记录的结果,我就能够理解什么有用,什么没用,以及做哪些事是在浪费资源和时间。如何最好地利用printf就是一个简单的例子: 通过尝试不同的驱动模型可以发现,很多方法都可以显著提高开发人员使用printf时获得的实时性能,而人们设想的结果通常远好于真实结果。

技巧7—深入研究编译器产生的指令

在资源特别有限的应用中,开发人员有时只需挽起袖子深入理解编译器产生的指令。在将要执行的三四个广义指令间选择三元操作符而不是if/else是有区别的,这很可能会导致应用程序崩溃。

虽然像C这样的语言是标准的,但每种编译器在优化和产生机器指令时有少许差异。唯一现实的方法是检查汇编语言,了解编译器在做什么。

总结

不同应用程序的优化需求各不相同。小批量产生的应用程序也许根本不需要优化;而对于另外一些应用程序,每个时钟周期或每毫微安电流都很重要,则可能需要开发人员花大量时间从系统中榨出最后一点性能或能量。虽然每种系统都是不同的,但开发人员若熟记这些技巧,便为实现更高效的系统迈出了可喜的第一步。

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

    关注

    48

    文章

    7487

    浏览量

    151033
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303154

原文标题:优化嵌入式软件的七个技巧

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    优化嵌入式软件的7技巧

    正在做什么的唯一真正方法是查看程序集。应用程序优化需求将大不相同。一些小批量生产的应用可能根本不需要
    发表于 01-16 18:07

    ADS1298的8channel采样值都不相同

    请假大家一ADS1298的问题:我用信号发生器给8channel直接灌正弦波(100HZ,1Vpp,0 offset)。发现采样值各不相同。这是正常的吗?还是我的ADS1298坏了? 谢谢。
    发表于 05-23 09:42

    嵌入式机器视觉系统有什么特性?怎么优化

    介绍了基于ARM+DSP架构的嵌入式机器视觉系统的特性,分析了制约嵌入式机器视觉系统性能的因素。从操作系统和应用程序方面,讨论了嵌入式机器视觉系统的
    发表于 03-11 06:47

    浅析嵌入式系统结构

    必须的设备。外部设备将根据需要而各不相同,如通用通信接口USB,RS-232,RJ45等,输入输出设备,如
    发表于 10-27 06:10

    嵌入式系统内存优化使用

    响应运行。并且经过实践证明,嵌入式系统内存优化使用,能够提升系统空间5%内存,确保系统顺利运行。【关键词】 嵌入式 Linux系统 内存优化 使用方法研究现如今,
    发表于 11-04 06:23

    嵌入式应用程序进行性能优化

    满足嵌入式应用的性能需求。1 嵌入式程序优化的类型嵌入式应用
    发表于 12-22 07:46

    嵌入式系统中的MODEM

    嵌入式系统中的MODEM 近日研究MODEM心得不少,写出来,请大家提提意见。(一)协议按照调制解调协议的不同,数据传输速度亦各不相同。56K bit/秒有ITU V.90、Rockwell
    发表于 04-18 22:55 57次下载

    ARM嵌入式系统开发-软件设计与优化

    ARM嵌入式系统开发-软件设计与优化
    发表于 02-11 09:57 94次下载
    ARM<b class='flag-5'>嵌入式</b>系统开发-<b class='flag-5'>软件</b>设计与<b class='flag-5'>优化</b>

    嵌入式芯片的存储器映射

    很多嵌入式芯片都集成了多种存储器(RAM、ROM、Flash、),这些存储器的介质、工艺、容量、价格、读写速度和读写方式都各不相同嵌入式系统设计需根据应用需求巧妙地规划和利用
    发表于 11-24 11:43 101次下载
    <b class='flag-5'>嵌入式</b>芯片的存储器映射

    基于RTSJ的实时嵌入式系统API的优化研究

    描述了一基于RTSJ的应用程序接口,该API的功能是提供高级的并发实时计算结构,优化实时嵌入式系统开发。同时,部署和优化(在开销足迹/时间
    发表于 11-30 12:20 420次阅读

    构建和优化嵌入式和物联网应用程序

    构建和优化嵌入式,移动和物联网应用程序
    的头像 发表于 05-31 09:23 1682次阅读

    优化嵌入式软件时可以遵循几个通用技巧盘点

    早前的专栏中曾讨论过在许多情况下需要优化嵌入式系统的关键特征,包括系统时序、代码大小、RAM使用率和能耗。虽然优化每个特征通常要求不同的方法和技术,但开发人员在优化
    发表于 03-08 14:40 657次阅读

    介绍一些关于优化嵌入式软件的小技巧

    优化嵌入式软件的特点包括系统定时、码大小、RAM使用、功耗等。当优化每个特征通常需要其自己的方法和技术时,当优化
    发表于 12-23 14:10 918次阅读

    嵌入式Linux应用程序例程

    嵌入式Linux应用程序例程(arm嵌入式开发步骤)-嵌入式Linux应用程序例程,有需要的可以参考!
    发表于 07-30 13:23 16次下载
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>应用程序</b>例程

    嵌入式Linux应用程序开发-(1)第一嵌入式QT应用程序

    第一嵌入式QT应用程序在成功安装 Qt Creator 开发环境后,我们通过一简单的嵌入式Qt应用程
    发表于 11-01 17:21 16次下载
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>应用程序</b>开发-(1)第一<b class='flag-5'>个</b><b class='flag-5'>嵌入式</b>QT<b class='flag-5'>应用程序</b>