【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩

这篇具有很好参考价值的文章主要介绍了【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

simulink优化ram占用,Matlab/Simulink,Matlab/Simulink,软件优化,动态内存,算法设计,MATLAB Function,可变长度数组,嵌入式软件

文章目录

背景介绍

初始代码

优化代码

分析和应用

总结


背景介绍

        在一个嵌入式软件开发项目中,有一个使用MATLAB Function编写的算法模块,功能是从一个较大的数组中提取一段数据,然后求均值输出,示例如下:

simulink优化ram占用,Matlab/Simulink,Matlab/Simulink,软件优化,动态内存,算法设计,MATLAB Function,可变长度数组,嵌入式软件

初始代码

        一开始算法开发的思路非常简单,按照功能需求把算法分成两步。第一步提取目标数据,第二步求均值输出。示例如下:

function y = fcn(u, n)


assert(n <= 100);

x = zeros(1, n);

for i=1:1:n

    x(i) = u(i);

end


y = mean(x);

        基于上述算法编译后生成的代码如下:

/* Model step function */

void DynamicRAMdown_step(void)

{

  real_T x_data[100];

  int32_T i;


  /* MATLAB Function: '<Root>/MATLAB Function' incorporates:

   *  Constant: '<Root>/Constant'

   */

  for (i = 0; i < 5; i++) {

    x_data[i] = DynamicRAMdown_ConstP.Constant_Value[i];

  }


  DynamicRAMdown_Y.y = x_data[0];

  for (i = 2; i < 6; i++) {

    DynamicRAMdown_Y.y += x_data[i - 1];

  }


  /* Outport: '<Root>/y' incorporates:

   *  MATLAB Function: '<Root>/MATLAB Function'

   */

  DynamicRAMdown_Y.y /= 5.0;

}

        分析上述代码可以看到,该算法的动态内存负荷是一个数组x_data[100]和一个i,数组x_data[100]的length是100,但是实际有用的长度只有5,另外95都是浪费的。

        而且随着具体应用的变化,如果数据数组更大,那么不必要的动态内存负荷浪费就会更严重,所以该算法有较大的优化空间。

优化代码

        我们利用matlab中的数组截取功能,把截取的数组直接送入求均值的函数,这样就不产生上述的中间变量数组x,示例如下: 

function y = fcn(u, n)


y = mean(u(1:n));

        基于上述算法编译后生成的代码如下:

/* Model step function */

void DynamicRAMdown_step(void)

{

  int32_T k;


  /* MATLAB Function: '<Root>/MATLAB Function1' incorporates:

   *  Constant: '<Root>/Constant'

   */

  DynamicRAMdown_Y.y = 1.0;

  for (k = 2; k < 6; k++) {

    DynamicRAMdown_Y.y += DynamicRAMdown_ConstP.Constant_Value[k - 1];

  }


  /* Outport: '<Root>/y' incorporates:

   *  MATLAB Function: '<Root>/MATLAB Function1'

   */

  DynamicRAMdown_Y.y /= 5.0;

}

        分析上述代码可以看到,该算法的动态内存负荷只有一个k,不产生任何的额外浪费

        至此,该算法中动态内存负荷压缩的优化就完成了。

分析和应用

        动态内存负荷压缩,在不同的软件开发项目中重要性是不一样的。一种是数据量非常庞大的应用(例如图像处理),算法优化很容易会产生很大的动态内存负荷压缩。另一种是硬件资源非常小的开发平台(例如单片机),开发的算法如果不经过仔细设计,很容易就会出现动态内存负荷溢出。

        动态内存负荷压缩优化时,需要注意如下几个点:

        1、使用Simulink中的可变数组时,生成的数组大小并不是动态的,而是按照最大Size来生成的。所以使用该功能时要根据自己的应用来计算一下,尽可能把最大Size设定的小一些。

        2、Simulink中设计的算法默认都是生成double型的数据,单个数据就要占用8 Byte的内存。所以我们要根据自己的应用选择合适的数据类型,例如,当精度要求不高时把double型改成single型就能压缩一半动态内存负荷,如果数值范围不大时把int32型改成int16型就能再压缩一半动态内存负荷。

        3、Simulink中设计算法模块时,用端口形式放在外面的信号默认会被定义成全局变量,如果放在里头就是局部变量。所以我们要尽可能地把一些信号放在内部,尽量少使用全局变量,内存使用效率就会提高,也就压缩了动态内存负荷。

        4、以上建议都是从硬件负荷压缩的角度来优化软件的,与此对立的一个优化方向是软件通用性和扩展性。前者的极限优化势必会降低后者的性能,反之依然。所以,要软件设计时要综合考虑各方面的性能,多方面来平衡。

总结

        以上就是本人在嵌入式软件开发中遇到内存优化时,一些个人理解和分析的总结,首先介绍了它的背景情况,然后展示它的初始设计和优化设计,最后分析了内存优化的注意事项和应用场景。

        后续还会分享另外几个最近总结的软件优化知识点,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明:原创文章,转载和引用请注明出处和链接,侵权必究!

simulink优化ram占用,Matlab/Simulink,Matlab/Simulink,软件优化,动态内存,算法设计,MATLAB Function,可变长度数组,嵌入式软件文章来源地址https://www.toymoban.com/news/detail-854382.html

到了这里,关于【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包