STM32 进阶教程 5 - 内联函数
前言
在計算機科學(xué)中,內(nèi)聯(lián)函數(shù)(有時稱作在線函數(shù)或編譯時期展開函數(shù))是一種編程語言結(jié)構(gòu),用來建議編譯器對一些特殊函數(shù)進行內(nèi)聯(lián)擴展(有時稱作在線擴展);也就是說建議編譯器將指定的函數(shù)體插入并取代每一處調(diào)用該函數(shù)的地方(上下文),從而節(jié)省了每次調(diào)用函數(shù)帶來的額外時間開支。但在選擇使用內(nèi)聯(lián)函數(shù)時,必須在程序占用空間和程序執(zhí)行效率之間進行權(quán)衡,因為過多的比較復(fù)雜的函數(shù)進行內(nèi)聯(lián)擴展將帶來很大的存儲資源開支。另外還需要特別注意的是對遞歸函數(shù)的內(nèi)聯(lián)擴展可能引起部分編譯器的無窮編譯。
內(nèi)聯(lián)擴展是一種特別的用于消除調(diào)用函數(shù)時所造成的固有的時間消耗方法。一般用于能夠快速執(zhí)行的函數(shù),因為在這種情況下函數(shù)調(diào)用的時間消耗顯得更為突出。這種方法對于很小的函數(shù)也有空間上的益處,并且它也使得一些其他的優(yōu)化成為可能。
通常,在C語言中,內(nèi)聯(lián)展開的功能可由帶參宏(Macros)在源碼級實現(xiàn)。內(nèi)聯(lián)提供了幾個更好的方法:
1,宏調(diào)用并不執(zhí)行類型檢查,甚至連正常參數(shù)也不檢查,但是函數(shù)調(diào)用卻要檢查。
2,C語言的宏使用的是文本替換,可能導(dǎo)致無法預(yù)料的后果,因為需要重新計算參數(shù)和操作順序。
3,在宏中的編譯錯誤很難發(fā)現(xiàn),因為它們引用的是擴展的代碼,而不是程序員鍵入的。
許多結(jié)構(gòu)體使用宏或者使用不同的語法來表達很難理解。內(nèi)聯(lián)函數(shù)使用與普通函數(shù)相同的語言,可以隨意的內(nèi)聯(lián)和不內(nèi)聯(lián)。
4,內(nèi)聯(lián)代碼的調(diào)試信息通常比擴展的宏代碼更有用。
?
對于基于C的編譯系統(tǒng),內(nèi)聯(lián)函數(shù)的使用可能大大增加編譯時間,因為每個調(diào)用該函數(shù)的地方都需要替換成函數(shù)體,代碼量的增加也同時帶來了潛在的編譯時間的增加。
本節(jié)我們將基于“STM32 進階教程 3 -? 軟件實現(xiàn)高精度延時 1”內(nèi)能來介紹內(nèi)聯(lián)函數(shù)的命定義與使用,以及其帶來的差別。
示例詳解
基于硬件平臺: STM32F10C8T6最小系統(tǒng)板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產(chǎn)生的配置工程,使用KEIL5編譯代碼。
?
?
本示例所用的最小系統(tǒng)板原理圖:
?
?
?
?
?
Delay.h文件放在INC文件夾下即可。
?
?
?
編譯后的代碼大小:
對應(yīng)的匯編代碼:
?
接下來我們在delay_us函數(shù)實現(xiàn)前加上inline 關(guān)鍵字(也可以是 __inline 或 __INLINE)再次編譯。
執(zhí)行效果和代碼大小均不變:
仿真查看其匯編代碼:
發(fā)現(xiàn)并沒有像宏一將展開,其實現(xiàn)還是一樣,并沒有實現(xiàn)內(nèi)聯(lián)展開,這里因為?inline只適合涵數(shù)體內(nèi)代碼簡單的函數(shù)數(shù)使用,不能包含復(fù)雜的結(jié)構(gòu)控制語句例如while、switch,并且內(nèi)聯(lián)函數(shù)本身不能是直接遞歸函數(shù)(自己內(nèi)部還調(diào)用自己的函數(shù))。
同時在keil的幫助文檔中不有如下說明
接下來我們在main.c的USER CODE BEGIN 0區(qū)加入如下代碼:
在USER CODE BEGIN 3中加入如下代碼:
重新編譯,仿真,查看對應(yīng)匯編代碼,發(fā)現(xiàn)其已經(jīng)實現(xiàn)了內(nèi)聯(lián),g函數(shù)中的f(x),與 f(y)對應(yīng)的源碼直接在g函數(shù)中:
?
通過上面的實例,我們已基本學(xué)會基于keil MDK平臺的stm32 中內(nèi)聯(lián)函數(shù)的使用,了解決了其使用的基本方法(更多關(guān)于inline的說明可以查看對應(yīng)的幫助文檔):
?
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內(nèi)容,也歡迎大家留言!!最后喜歡這個公眾號的同學(xué)們記得加關(guān)注了,會有不定期技術(shù)干貨推出!!
文中源碼資料下載,在公眾號里給十三發(fā)消息:
下載|STM32進階教程5
?
關(guān)注十三公眾號
?
總結(jié)
以上是生活随笔為你收集整理的STM32 进阶教程 5 - 内联函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KEIL MDK 仿真时程序”乱跑“问题
- 下一篇: STM32 进阶教程 6 - 汇编与C