微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 高效的C编程之: 函数调用

高效的C编程之: 函数调用

时间:08-30 来源:3721RD 点击:

BL _dflt

LDMIA sp!,{lr}

B sqrt

使用函数内嵌有以下好处:

· 减少了函数调用开销(如寄存器的压栈保护);

· 减少了参数传递开销;

· 进一步提高了编译器对代码优化的可能性(如编译器可将ADD和MUL指令合并为一条MLA指令)。

但使用函数内嵌将增加代码尺寸。也正是处于这种原因,armcc和tcc都没有提供函数自动内嵌的编译选项。

一般来说,只有对性能影响较大的重要函数才使用关键字_inline进行内嵌。

14.9.7 函数定义

使用函数时要先定义后调用是ARM编程的基本规则之一。在函数调用之前定义函数,编译器可以检查被调用函数的寄存器使用情况,从而对其进行进一步的优化。

首先来看下面的例子。

int square(int x);

int sumsquares1(int x, int y)

{

return square(x) + square(y);

}

/* square函数可以在本文件中定义,也可以在其他源文件中定义 */

int square(int x)

{

return x * x;

}

int sumsquares2(int x, int y)

{

return square(x) + square(y);

}

编译的结果如下所示。

sumsquares1

STMDB sp!,{v1,v2,lr}

MOV v1,a2

BL square

MOV v2,a1

MOV a1,v1

BL square

ADD a1,v2,a1

LDMIA sp!,{v1,v2,pc}

square

MOV a2,a1

MUL a1,a2,a2

MOV pc,lr

sumsquares2

STMDB sp!,{lr}

MOV a3,a2

BL square

MOV a4,a1

MOV a1,a3

BL square

ADD a1,a4,a1

LDMIA sp!,{pc}

从编译的结果可以看出,将square函数定义放在sumsquares函数前,编译器可以判断寄存器a3和a4并未使用,所有在调用函数入口处并未将其压栈。这样,减少了内存访问,提高了代码执行效率。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top