日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高级C语言教程-存储器和指针

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高级C语言教程-存储器和指针 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ATPCS即ARM-THUMB procedure call standard(ARM-Thumb過程調用標準)的簡稱

回調函數
通常情況下函數的調用是用戶的函數調用操作系統的函數,上層的函數調用底層的函數,而所謂的回調是是指操作系統來調用用戶編寫的函數,或者底層的函數調用上層的函數。
由于操作系統的代碼在用戶代碼之前就已經完成編譯,因此操作系統發起的回調一般由用戶編寫的函數的函數指針傳遞給操作系統再由操作系統實現回調。
正如嵌入式的函數的中斷等事件的函入口就是采用的回調函數的機制。
多線程
將函數的指針傳進負責建立多線程的API中。在一個任務系統中,每個任務從本質上來講可以理解為是一個擁有自己獨立堆棧的函數,在用戶需要創建一個新的任務或線程的時候,需要調用由操作系統提供的API 函數(系統調用)。
在函數中實現講一個數值轉換為字符串,相當于sprintf的使用,但是經常使用自己定義的函數當然能夠加強自己對于語言的進一步的了解,并且久而久之就自己能夠熟練的寫出一首很好的代碼。

//UnsToStr -- 將一個無符號值轉換為字符串 void UnsToStr(unsigned u,char *str) {char *sreStart = str;do*str++ = (u % 10) + '0';while((u/=10)>0);*str = '\0'; //在結束的時候加上這樣才能使用的字符串確認結尾否則將不是一個完整的字符串RenerseStr(strStart); } //C語言標準庫函數strcpy的一種典型的工業級的最簡實現。 //返回值:目標串的地址。 //對于出現異常的情況ANSI-C99標準并未定義,故由實現者決定返回值,通常為NULL。 //參數:des為目標字符串,source為原字符串。 char* strcpy(char* des,const char* source){char* r=des;assert((des != NULL) && (source != NULL));while((*r++ = *source++)!='\0');return des;} //while((*des++=*source++));的解釋:賦值表達式返回左操作數,所以在賦值'\0'后,循環停止。strcpy的實現代碼char * strcpy(char * strDest,const char * strSrc){if ((NULL==strDest) || (NULL==strSrc)) //[1]throw "Invalid argument(s)"; //[2]char * strDestCopy = strDest; //[3]while ((*strDest++=*strSrc++)!='\0'); //[4]return strDestCopy; }

利用堆棧保存函數調用的返回地址(對于中斷處理程序還包括程序狀態字寄存器)

大家都知道堆棧的這個功能,當函數調用或者中斷發生的時候,返回的地址會自動的壓入當前堆棧中(對于ARM處理器而言,這個過程不是由硬件自動完成的,硬件只負責將返回地址保存到相應的鏈接寄存器r14中去)由編譯器插入的代碼完成壓棧工作)。當程序執行流程需要返回的時候,通過調用相應的返回指令(ARM處理器沒有專門的返回指令,只能通過其他指令完成)將堆棧中保存的返回地址彈出到PC中

利用堆棧保存在被調函數中需要使用的寄存器值

當程序的控制權進入到被調函數(Callee)后,被調函數的代碼函數的代碼可能需要用到一些寄存器作為數據暫存,但是這些寄存器可能已經被(Caller)函數(調用函數)使用,為了滿足Callee的需求,而不至于損壞Caller中已經使用的數據,編譯器會在callee函數開始使用這些寄存器之前,將這些寄存器中的原有數據壓入到堆棧保存,在Callee返回Caller之前,編譯器還需要插入一段代碼將這些保存在堆棧中的數據恢復(通過退棧操作)到相關的寄存器中去;


在實際的C程序中,編譯器會根據需要插入維護這些功能的代碼,因此在函數調用的時候,編譯器會維護一個與調用相關的棧結構,通常我們將這個棧結構稱為調用棧幀(Call Stack Frame);
函數的返回值通常保存在r0中。

正如大多數管理資源分配的算法一樣,我們將在系統堆棧中構建空閑鏈表,每次的分配其實就是遍歷整個空閑鏈表的各個空閑區域,如果某個空閑區域的大小能夠滿足用戶申請的大小,系統將在高地址切一塊分出來,,動態內存的釋放就是動態申請的逆過程,釋放函數首先將遍歷整個空閑鏈表,尋找合適的位置將用戶釋放的內存塊釋放到空閑鏈表中去。

貴有恒,何必三更眠五更起;最無益,只怕一日曝十日寒!

總結

以上是生活随笔為你收集整理的高级C语言教程-存储器和指针的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。