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定義的函數也會被內聯。不過編譯器的智能程度還是比較喜人的,目前沒發現什么特別差的優化結果。