软件优化方法介绍

最近,随着嵌入式软件的各种功能和复杂性的增加,构成嵌入式系统的内核和存储器的使用正在迅速增加。嵌入式软件与一般通用软件不同,嵌入式软件系统资源有限。汽车领域的ADAS(高级驾驶辅助系统)就是一个典型的例子。驾驶员、乘客和行人对安全和便利的同时追求产生了各种要求,为了满足这些要求,ADAS系统的S/W复杂性显着增加以满足这些要求。
特别是S/W内部数据处理的运算频率呈爆炸式增长,但由于大量ADAS请求功能集成在基于MCU(Micro Controller Unit)资源有限的ADAS集成控制器中,运算单元控制器存在瓶颈,导致性能下降。为了解决这种情况,可以减少资源过载的 S/W 优化技术变得很重要。今天,我们将讨论一些在 S/W 中优化这些有限资源的关键技术。

提升函数调用速度的优化方法
调用多个函数的多个分支在一个函数内重复调用其函数的方法会导致程序出现分支,并产生上下文切换等额外开销,调用深度越高,对程序性能产生的不利影响越大。 因此,希望应用一种可以提高程序运行速度同时以低成本执行函数调用的优化方法。

使用宏函数进行优化
宏函数不会产生调用函数的溢出。 因为分支不会执行到函数所在的位置,并且预处理器在编译阶段将部分替换为声明函数的代码,所以可以减少与调用内存中的函数相关的溢出。 但是,随着宏函数数量的增加,代码也随之增加,内存使用量也会提高,因此选择较小且经常使用的函数作为宏函数,可获得显著效果。
软件优化方法介绍_第1张图片<图1>使用宏函数进行优化的示例
使用内联函数进行优化
内联函数将函数代码插入到调用位置,而不是像宏函数那样调用函数,但编译器会检查函数类型并置换代码。 内联更快,因为内联函数不进行分支,速度会更快。但是代码增加,内存使用量也会增大,所以你应该选择小,经常使用的内联函数进行优化。
软件优化方法介绍_第2张图片<图2>使用内联函数进行优化的示例
因此,宏函数和内联函数是强大的优化技术,可以通过减少与调用函数相关的溢出来提高程序性能。 但是,应该避免无条件地使用这种技术,因为程序的代码大小会增加,内存使用也会增加。 由于代码置换导致调试困难而使测试变得困难,因此建议与TDD方法并行开发代码。

提升运算速度的优化
基本上,按位运算符比算术运算符快。 为了一目了然,让我们通过查看执行相同操作的运算符的汇编代码行数来进行比较。
软件优化方法介绍_第3张图片
<图3> 转换汇编语言时改变行数的例子
如果您查看上面的示例,您可以看到按位运算符实际执行的代码与常用的算术运算符相比代码行数显著减少。 这意味着更多的处理器资源用于执行算术运算,并且在频繁使用运算符的情况下,它们会累积,导致执行速度存在显着差异。

控制语句的优化
“IF-ELSE”和“SWITCH-CASE”等分支指令是导致性能下降的主要原因。

放置在高概率执行的条件语句之前
在编写条件语句时,可以通过要执行的语句放在最前面的条件中来提高执行速度。
Ex) if(a>0 && b>0)
如果 a<0 概率为 90%,b<0 概率为 50%,则不执行条件 b>0,因为条件 a>0 的 90% 为 False。
If(a>0 || b>0)
如果 a>0 的概率为 90%,b>0 的概率为 50%,则不执行条件 b>0,因为条件 a>0 的 90% 为真。
同样条件下优先执行运算
如果相同的条件共同重复,并且在该条件下进行运算,如果在进入条件语句之前进行运算并将值存储在临时变量中进行处理,则可以提高运算速度。

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操作,第一次只执行一次。
执行 SWITCH-CASE 语句而不是 IF-ELSE 语句
IF-ELSE语句是多分支语句,比较会重复多次,而SWITCH-CASE语句只进行一次比较和分支,有助于提高性能。

使用 IF-ELSE 语句比较范围值时执行分支二进制分解技术
使用 IF-ELSE 语句比较范围内的值时,通过划分范围以最小化的方式进行处理,有助于提高性能。
软件优化方法介绍_第4张图片
<图4> 分支二值化技术示例
减少内存用量的代码优化
由于内存优化方法相当复杂,我将介绍一种最容易应用的方法。
软件优化方法介绍_第5张图片<图五> 减少内存使用的代码优化示例

由于全局变量没有分配给寄存器,因此每次循环使用数据时都会从外部存储器中读取数据。 如果您需要在函数迭代中使用全局变量,则将其复制到局部变量并按照<代码优化示例以减少内存使用>中的使用方式来提高性能。

随着新功能的增加,实现各种需求的嵌入式软件变得越来越复杂,并且应用了许多优化技术来克服可用资源和资源的限制。 通过这种方式,将调动最合理、最有效的代码优化技术减少进程的负载,提高运行速度。
除了今天介绍的技术,还存在很多其他的技术种类,可以根据S/W和控制器的特性考虑内存使用和任务执行时间等各种因素来应用软件优化技术。

你可能感兴趣的:(单元测试,c语言)