年味尚存,但打工人却要收收心了,准备开工开学!今天的技术文章版块和大家分享的是《软件优化方法介绍》,专业的你若有其他见解,记得在评论区及时指出哦!
近来嵌入式软件中添加了多样的功能的同时,构成嵌入式系统的内核与内存也在急速上升。嵌入式软件与一般的通用软件不同,嵌入式软件的系统资源是有限的。汽车领域的ADAS(Advanced Driver Assistance System)便是典型示例。为同时保证驾驶者、乘客及行人的舒适出行,需要满足多样的要求事项,因此也导致了ADAS系统的软件复杂度大幅上升。
尤其软件内部数据处理运算频率暴增,但基于资源有限的MCU(Micro Controller Unit)的 ADAS集成控制器中大量ADAS要求功能汇集,控制器的算符部分就会发生瓶颈现象,从而导致性能下降。
为了缓解这一情况,减少资源负荷的软件优化方法变得至关重要。本篇文章将针对这种有限资源的软件优化方法中的重要部分进行说明。
提升函数调用速度优化
调用多个函数的多重分支和在函数内反复调用其他函数的方式,会导致程序内产生分支(Branch)和上下文切换(Context Switching)等附加费用,因此调用的Depth越高,对程序性能的不良影响就越大。这样一来,最优选便是采用以低成本执行函数调用,并提高程序运算速度的优化方法。
宏函数不会产生函数调用开销。无法使用函数位置的分支,在编译阶段用预处理器所声明的函数代码替换相应部分,因此可以减少存储器函数调用相关的开销。但是,使用宏观函数的同时,代码也会增加,因此提高速度的同时内存使用量也会增大,所以如果挑选出内存较小且经常使用的函数将其用作宏函数,则可获得显著效果。
内联函数可以和宏函数一样,不调用函数,而是将函数代码插入调用位置, 编译器检查函数的类型等,并置换代码。虽然内联函数不适用分支提高了速度,但是代码增加,内存使用量也变大, 因此要选择小且经常使用的函数,使用内联函数。
运算速度提升优化
比起基本的算术运算符,bit运算符的运算速度更快。为了能更直观地展示,我们将通过发挥同样作用的运算符的汇编代码Line数来进行比较。
通过上述示例我们不难发现,比起一般使用的算数运算符,bit运算符实际执行的代码明显减少了。 这就意味着,执行算术运算需要使用更多的处理器资源,若使用较多的运算符持续累积,执行速度的差异也会变得相当大。
控制语句的优化
“IF-ELSE”及“SWITCH-CASE”等分支命令语是导致性能低下的最主要原因。
生成条件表达式时, 将执行概率高的语句放在最前面的条件中, 可提升执行速度。
Ex) if(a>0 && b>0)
a0条件中90%是False,因此不执行b>0条件。
If(a>0 || b>0)
a>0 概率 90%, b>0 概率 50%的情况下,a>0 条件中90%是True,因此不执行 b>0条件。
若相同的条件都重复时,且在相应的条件下执行运算,在进入条件语句之前提前完成运算,然后在临时变量赋值处理,运算速度就会提高。
Ex) if( (a/5)>20 && b>0) else if( (a/5)>10 && b>0) else if ……
int temp = a/5;
if(temp>20 && b>0) else if(temp>10 && b>0) else if ……
每次都执行的a/5运算最开始只执行一次。
比起IF-ELSE,最好是执行SWITCH-CASE
IF-ELSE是多重分支命令语,多次重复比较,但SWITCH-CASE只执行一次比较和分支,因此可帮助改善性能,能用SWITCH-CASE语句处理的情况下便可最大限度地使用(比较特定值的情况)。
利用IF-ELSE比较范围值时,执行分支二进制分解 (Branch binary break down) 方法
IF-ELSE是多重分支命令语,多次重复比较,但SWITCH-CASE只执行一次比较和分支,因此可帮助改善性能,能用SWITCH-CASE语句处理的情况下便可最大限度地使用(比较特定值的情况)。
为减少内存使用量优化代码
由于内存优化方法非常复杂,接下来将为大家介绍一个最简单实用的方法。
在全局变量的情况下,由于无法向寄存器分配,在反复语句中使用时,每次都会从外部存储器读取数据。如果必须要在函数或反复语句中使用全局变量,和一样,复制到局部变量使用的话可提高性能。
为实现多样的要求事项,嵌入式软件的新功能日渐增多的同时复杂度也提升了,因此遇到了可利用资源受限这一问题,为了克服这些问题,采用了许多优化方法。
通过这些优化方法,可以调用最合理、有效的代码优化方法,减少进程的负荷,提高运算速度。
软件优化方法除了今天介绍的之外还有很多种,要根据软件和控制器的特性,考虑到内存使用量和TASK执行时间等多种因素来选择合适的方法。
看了今天的文章对你的工作有没有一些帮助呢请期待我们下一期的内容呦!
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114288 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!