跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 国内电商 > 【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩

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

时间:2024-04-11 08:20:30 来源:网络cs 作者:欧阳逸 栏目:国内电商 阅读:

标签: 动态  负荷  日记 
阅读本书更多章节>>>>

文章目录

背景介绍

初始代码

优化代码

分析和应用

总结


背景介绍

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

初始代码

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

function y = fcn(u, n)assert(n <= 100);x = zeros(1, n);for i=1:1:n    x(i) = u(i);endy = 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工程,可以到笔者的主页查找和下载。


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

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/guonei/2024-04-11/156855.html,文章来源:网络cs,作者:欧阳逸,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论