【研发日记】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工程,可以到笔者的主页查找和下载。

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

版权声明:本文为博主作者:Mr.Cssust原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/CSSUST/article/details/137526557

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐