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