粵嵌教育
                    gzyueqian
                    13352868059

                    嵌入式開發:嵌入式系統編程—函數和堆棧

                    更新時間: 2022-12-11 09:08:53來源: 粵嵌教育瀏覽量:934

                      在嵌入式開發中,你查看過堆棧內存,觀察過當一個函數被調用并且稍后返回時到底發生了什么嗎?

                      C語言中的函數(以及其他編程語言中的過程、子例程或子程序)是計算機科學中最偉大的發明,它使程序比任何編程語言的任何其他特性都更容易理解。

                      函數保持代碼DRY

                      創建函數的一個明顯原因是避免重復代碼,也稱為DRY(不要重復自己)原則。你可以通過分離一段代碼并提供一個接口來實現這一點,該接口允許你從程序中的不同位置輸入(調用)代碼。當然,你需要編程語言支持來建立這樣的接口以及從函數調用和返回的機制。

                      


                      堆棧的關鍵作用

                      對函數和返回的簡單調用似乎足夠簡單。返回地址可以存儲在寄存器中,例如ARM Cortex-M中的LR(鏈接寄存器)。但是在嵌入式開發中當被調用的函數調用另一個函數時,事情就變得復雜了。一個LR寄存器不能“記住”兩個返回地址。解決方案是將所有這樣的嵌套返回地址存儲在內存中——存儲在一個稱為堆棧的數據結構中。堆??梢员4娣祷氐刂泛秃瘮祪炔渴褂玫木植孔兞?。

                      函數調用堆棧的一個很好的比喻是一堆菜,你可以在堆棧的當前頂部添加或刪除菜。為了支持這樣的數據結構,CPU只需要記住堆棧的當前頂部,在ARM Cortex-M中,這是SP(堆棧指針)寄存器的工作。

                      開銷函數

                      ARM Cortex-M處理器上的開銷函數銷非常低。調用本身是一條BL指令,而返回是一條BX LR指令。除此之外,還要準備函數參數,這些參數在寄存器R0-R3中傳遞。

                      結束注釋

                      函數非常重要,不僅是為了避免重復,而且是降低復雜性的主要機制,因為你可以關注正在做的事情,而不是如何做。此外,在嵌入式開發中,在底層理解函數調用/返回機制和堆棧是通向其他關鍵概念的途徑,如中斷、RTOS(實時操作系統)中的上下文切換和單獨編譯。

                    免費預約試聽課

                    推薦閱讀

                    18禁男女污污污午夜网站免费,国产成人夜色高潮福利影视,午夜男女真人做爽爽爽视频