inline函数在IAR中的使用
1、什么叫inline函数
inline其实是是C++关键字(但是IAR支持),在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。用空间换效率。在调用inline函数时,编译器将函数在调用处展开,而不是直接调用。这种方式有点儿类似于宏定义。
优点是可以减少函数调用时间,和入栈出栈操作,也减少了栈空间的使用。
缺点是增加了代码空间,因此通常不在inline函数中执行太多的代码。也不能在inline函数中进行递归(自己调用自己)。
2. IAR中的inline函数
inline函数传统上只有C++支持,但IAR EW也支持在C代码中使用inline.
#pragma inline:建议编译器对紧随其后的函数进行inline处理
#pragma inline:建议编译器对紧随其后的函数进行inline处理
#pragma
inline = forced: 强制编译器对紧随其后的函数进行inline处理
// tft.c中定义内联函数
#pragma inline = forced //强制inline
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// tft.h中声明函数
void TFT_Write_Colour(const RGB_COLOUR *rgb);
// main.c中调用函数
// 编译报错:main中引用了未定义的外部函数TFT_Write_Colour。
// tft.h中“定义函数”
#pragma inline = forced //在IAR EW430中,这里必须用强制inline;用inline可能导致编译器忽略内联,而定义成普通函数而出错。
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// main.c中包含tft.h,并调用函数
// 结果:编译正确
不过在IAR IDE下使用inline 定义的函数很多时候不会如程序设计者所愿的内联到代码中,会仍旧以函数调用的形式存在。inline关键词本身就是推荐编译器进行内联,不过编译器不接受推荐,那么自然就没用了。IAR IDE在采用默认设置时是不接受inline建议的,想让其按照程序设计者的意愿内联函数的话,需要在优化选项中进行设置。
设置选项在:Options->C/C++ Compiler->Optimizations。
只有把优化等级开到High才能在右边的Enable复选框中选择Function inlining。选择这两个之后inline定义的函数就可以正常的在汇编代码中结合在一起,不过因为是开了优化,有些并没有inline定义的函数也会被内联。不过编译器的智能程度还是比较喜人的,目前没发现什么特别差的优化结果。