高级C语言教程-存储器和指针
ATPCS即ARM-THUMB procedure call standard(ARM-Thumb過程調(diào)用標準)的簡稱
回調(diào)函數(shù)
通常情況下函數(shù)的調(diào)用是用戶的函數(shù)調(diào)用操作系統(tǒng)的函數(shù),上層的函數(shù)調(diào)用底層的函數(shù),而所謂的回調(diào)是是指操作系統(tǒng)來調(diào)用用戶編寫的函數(shù),或者底層的函數(shù)調(diào)用上層的函數(shù)。
由于操作系統(tǒng)的代碼在用戶代碼之前就已經(jīng)完成編譯,因此操作系統(tǒng)發(fā)起的回調(diào)一般由用戶編寫的函數(shù)的函數(shù)指針傳遞給操作系統(tǒng)再由操作系統(tǒng)實現(xiàn)回調(diào)。
正如嵌入式的函數(shù)的中斷等事件的函入口就是采用的回調(diào)函數(shù)的機制。
多線程
將函數(shù)的指針傳進負責建立多線程的API中。在一個任務(wù)系統(tǒng)中,每個任務(wù)從本質(zhì)上來講可以理解為是一個擁有自己獨立堆棧的函數(shù),在用戶需要創(chuàng)建一個新的任務(wù)或線程的時候,需要調(diào)用由操作系統(tǒng)提供的API 函數(shù)(系統(tǒng)調(diào)用)。
在函數(shù)中實現(xiàn)講一個數(shù)值轉(zhuǎn)換為字符串,相當于sprintf的使用,但是經(jīng)常使用自己定義的函數(shù)當然能夠加強自己對于語言的進一步的了解,并且久而久之就自己能夠熟練的寫出一首很好的代碼。
利用堆棧保存函數(shù)調(diào)用的返回地址(對于中斷處理程序還包括程序狀態(tài)字寄存器)
大家都知道堆棧的這個功能,當函數(shù)調(diào)用或者中斷發(fā)生的時候,返回的地址會自動的壓入當前堆棧中(對于ARM處理器而言,這個過程不是由硬件自動完成的,硬件只負責將返回地址保存到相應(yīng)的鏈接寄存器r14中去)由編譯器插入的代碼完成壓棧工作)。當程序執(zhí)行流程需要返回的時候,通過調(diào)用相應(yīng)的返回指令(ARM處理器沒有專門的返回指令,只能通過其他指令完成)將堆棧中保存的返回地址彈出到PC中
利用堆棧保存在被調(diào)函數(shù)中需要使用的寄存器值
當程序的控制權(quán)進入到被調(diào)函數(shù)(Callee)后,被調(diào)函數(shù)的代碼函數(shù)的代碼可能需要用到一些寄存器作為數(shù)據(jù)暫存,但是這些寄存器可能已經(jīng)被(Caller)函數(shù)(調(diào)用函數(shù))使用,為了滿足Callee的需求,而不至于損壞Caller中已經(jīng)使用的數(shù)據(jù),編譯器會在callee函數(shù)開始使用這些寄存器之前,將這些寄存器中的原有數(shù)據(jù)壓入到堆棧保存,在Callee返回Caller之前,編譯器還需要插入一段代碼將這些保存在堆棧中的數(shù)據(jù)恢復(fù)(通過退棧操作)到相關(guān)的寄存器中去;
在實際的C程序中,編譯器會根據(jù)需要插入維護這些功能的代碼,因此在函數(shù)調(diào)用的時候,編譯器會維護一個與調(diào)用相關(guān)的棧結(jié)構(gòu),通常我們將這個棧結(jié)構(gòu)稱為調(diào)用棧幀(Call Stack Frame);
函數(shù)的返回值通常保存在r0中。
正如大多數(shù)管理資源分配的算法一樣,我們將在系統(tǒng)堆棧中構(gòu)建空閑鏈表,每次的分配其實就是遍歷整個空閑鏈表的各個空閑區(qū)域,如果某個空閑區(qū)域的大小能夠滿足用戶申請的大小,系統(tǒng)將在高地址切一塊分出來,,動態(tài)內(nèi)存的釋放就是動態(tài)申請的逆過程,釋放函數(shù)首先將遍歷整個空閑鏈表,尋找合適的位置將用戶釋放的內(nèi)存塊釋放到空閑鏈表中去。
貴有恒,何必三更眠五更起;最無益,只怕一日曝十日寒!
總結(jié)
以上是生活随笔為你收集整理的高级C语言教程-存储器和指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据分析与应用技术国家工程实验室项目通
- 下一篇: 作者:王志强(1975-),男,中国标准