没有不足的资源,只有没优化的代码

智能硬件 创建于:2022-11-13

本文分享自中移物联网微信公众号《OneOS技术实践-没有不足的资源,只有没优化的代码》。

成本和配置的博弈

对于MCU而言,资源就是成本。同一系列的芯片,厂商通常会推出各种梯度的RAM和ROM配置,以满足不同的应用需求。对于同一种封装,RAM和ROM容量越大价格越高。所以在芯片选型的时候,就不可能简单地选择最高配置,而是在评估应用需求和保证一定裕量的前提下,选择最符合需求的配置。那么如何在实现既定产品功能时,占用最少的资源;或者在有限的资源下,赋予产品更为丰富的功能呢?

使用OneOS开发,你可以有很多选择。

第一,基于OneOS-Lite开发。OneOS-Lite是专门针对资源受限MCU量身打造的,精简易用。

OneOS-Lite版

第二,定制化剪裁。如果Lite版本无法满足需求,那么基于OneOS主线版本,通过定制化裁剪,也可以打造成适合自己的专属版本。

下面让我们以主线版本为例一起看看有哪些行之有效的资源优化方法吧!优化思路对于其他版本也可推而广之哦~

资源优化思路

(一)基于功能裁剪思路

资源优化,首先最容易想到的就是裁剪,即只保留有用的,舍弃无用的。

1.不用不开原则

OneOS提供了丰富的外设驱动和功能组件,对于具体的某个项目,自始至终都不会用到的组件,可以直接选择关闭,比如在某表计应用中,Graphic、Touch、USB等驱动,Micropython、GUI、Jecrryscript等组件均不会使用,则在menuconfig中直接去掉对应的功能模块。

2.即用即开原则

OneOS提供了丰富的开发调试的工具,如assert,Shell,Atest,Dlog,Diagonse等。这些功能组件是开发过程中有力的工具,可以帮助开发者发现潜在风险,分析定位问题等,但这些功能又不直接影响产品的功能,那么我们就可以在开发过程中,动态的开启或者关闭它,用之即开,用完则关。比如Diagonse组件,当发生hardfault这类难以定位的问题时,打开它,通过它的栈回溯功能,快速定位问题。解决问题之后,再将其关闭。

3. 用之有方原则

如果某些功能或者组件,我们无法避免的要使用,但是又不需要全功能。此时就可以开启我们需要的部分功能,关闭不相关的子功能。例如某项目中会使用到molink组件的AT解析器,又不需要打印AT交互的原始数据信息,则可以关闭此子功能。同样地,AT解析器默认分配栈空间为2KB,实际用的时候,发现1KB足够了,那么我们可以直接修改为1KB。

上述基于功能模块裁剪的思路,是剔除无关代码的资源消耗,一个功能模块的关闭,其相关的代码都不会参与编译,RAM或者ROM的优化效果立竿见影。

(二)基于合理分配思路

当功能模块已经确定,那么我们可以根据具体应用,来精细化地调整资源的分配,从提高资源的利用率的角度,实现资源优化。

1.线程栈资源分配

在创建用户线程时,需预先分配该线程的栈空间大小。如果线程栈设置过大,则会造成内存的浪费,但如果线程栈设置过小,则会发生栈溢出错误。那么就可以根据线程栈的使用最大百分比,来确定最终栈的大小,一般将百分比控制在80%,是比较合适的。

2. 中断栈资源分配

中断栈是中断过程中使用的栈空间,该栈空间是在编译阶段就完成分配的静态内存。通常在启动文件或者链接脚本中指定栈的大小。可以通过map文件找到栈顶的地址,并且搜索栈空间未被使用的空间,以此得到中断栈的使用百分比,再将使用百分比控制在一个合适的水平。

3. 减少静态内存占用

减少静态内存占用,可以有效提高内存的使用效率。定义静态的buffer和大型结构体,它所需的内存在编译时就已经固定不变了,不能另作他用。如果某一个功能模块,在整个生命周期中,只有特定场景或者周期性的工作,那么该功能模块使用的内存,就应当动态申请,用完之后释放。例如项目中用到4G模组,每隔30分钟与平台进行一次数据交互,那么模组的线程就应该动态创建,并在完成数据交互后回收。

4. RAM和ROM空间置换

一般情况下,RAM资源比ROM资源更紧张,通过RAM空间和ROM空间的互换,可以缓解内存不足的问题。二进制文件一旦生成,其ROM空间占用就是固定的,开发者很容易就能评估ROM空间是否足够;而RAM空间占用是在代码执行过程中动态变化的,裕量充足可以减少内存溢出的风险。因此,在开发过程中,有意识地将数据尽可能放到ROM中,可以置换出更多的RAM空间。

资源的按需分配,可以让有限的资源具有更高的利用率,减少不必要的浪费。这种优化思路,可以贯穿整个开发过程中,积少成多。

(三)基于编译优化思路

基于编译优化,可以整体优化资源占用,优化效果明显。

使用不同的编译器,编译生成的目标文件也不同,常见的有gcc,armcc等,选择合适的编译器,可以达到资源优化的目的,但是鉴于一般芯片支持的实际情况,可选的编译器是有限的。但是对于arm架构的芯片,keil提供了AC5和AC6两种不同版本的编译器,后者相对于前者,在相同优化等级下,RAM和ROM都有明显的优化。

除了选择编译器,相同编译器,也可以选择不同的优化等级。选择对资源优化有利的优化选项,可以明显减少目标文件的体积。

开发实例

光说不做假把式,让我们通过一个OneOS在实际应用中的表现看看资源优化的成果吧!

某表计生态项目,MCU型号为FM33G048,总内存为24kb,总Flash为256kb,支持的驱动和组件如下:

资源优化方式:

优化前后资源对比:

可以看到,通过5步的剪裁与调整,RAM和ROM的优化比例均达到了25%以上,省出这么多资源,咱就是说,如果老板还想再加点啥时髦功能,也不是不行了!

最终资源占用如下:

Ok,本次资源优化的介绍就到此结束啦,如果想了解OneOS的其他方面,可以在评论区留言哦~

原文地址:https://my.oschina.net/u/5443273/blog/5486728

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

中移物联OneOS