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