編譯器如何規劃存儲
在C++中,內存分成5個區,他們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區
1.棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的存儲區。裡面的變數通常是局部變數、函數參數等。
2.堆,就是那些由new分配的內存塊,他們的釋放編譯器不去管,由我們的應用程序去控制,一般一個new就要對應一個delete。如果程序員沒有釋放掉,那麼在程序結束後,操作系統會自動回收。
3.自由存儲區,就是那些由malloc等分配的內存塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。
4.全局/靜態存儲區,全局變數和靜態變數被分配到同一塊內存中,在以前的C語言中,全局變數又分為初始化的和未初始化的,在C++裡面沒有這個區分了,他們共同佔用同一塊內存區。
5.常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改)
2. 在ARM匯編編程中如何指定某段程序的存儲地址
在要指定代碼的存儲空間不是一件特別簡單的事情,尤其是你想為某個或某幾個函數指定具體的地址。
1,編譯器只有在最終的Link階段才會為代碼和數據分配內存地址,因此指定代碼段的地址一般是通過寫一個link腳本來進行的。Link階段時,編譯器的Linker會讀取你寫的Link腳本,並且按照腳本的規定給代碼分配地址。
2,根據ARM開發工具的不同,link腳本的語法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等開發工具都支持Link腳本。
如果你英文還可以,建議你直接找到開發工具的Help手冊去研究。如果你英語實在不行,也可以把開發工具名稱和你代碼的具體情況告訴我,我幫你看看。
3. 內存的分配方式有哪幾種
內存的三種分配方式:
1. 從靜態存儲區分配:此時的內存在程序編譯的時候已經分配好,並且在程序的整個運行期間都存在。全局變數,static變數等在此存儲。
2. 在棧區分配:相關代碼執行時創建,執行結束時被自動釋放。局部變數在此存儲。棧內存分配運算內置於處理器的指令集中,效率高,但容量有限。
3. 在堆區分配:動態分配內存。用new/malloc時開辟,delete/free時釋放。生存期由用戶指定,靈活。但有內存泄露等問題。
常見內存錯誤及對策
1. 內存分配未成功,卻被使用。
對策:使用內存之前檢查是否分配成功。用p!=NULL判斷。
2. 內存分配成功,未初始化就被使用。
內存的預設值沒有統一的標准。大部分編譯器以0作為初始值,但不完全是。
對策:內存初始化時賦初值。
3. 內存操作越界。
對策:只能是小心了。
4. 釋放了內存,仍然使用。
(1) 使用顯示delete和free的野指針。
對策:釋放完內存,將指針置為NULL。
(2) 使用隱式delete和free的野指針。主要是指函數返回指向棧內存的指針或引用。
對策:當然是不要返回就可以了。
5. 未釋放內存,導致內存泄露。
用new/malloc開辟了內存,沒用delete/free釋放.
對策:new和delete的個數一定相同;malloc和free的個數一定相同;new[]和[]delete一定對應。
4. 如何在mcu中,編譯兩個共存的工程文件
在MCU中編譯兩個共存的工程文件,可以通過以下步驟實現:
1. 創建兩個獨立的工程文件:每個工程文件對應一個獨立的應用程序或模塊。
2. 將兩個工程文件分別配置好編譯環境:這包括選擇適當的編譯器、設置編譯選項、包含必要的頭文件和庫文件等。
3. 確保兩個工程文件的文件名、變數名和函數名等不會發生沖突:這是為了避免編譯過程中出現命名沖突的錯誤。
4. 配置連接器腳本文件:連接器腳本用於將編譯後的目標文件鏈接成可執行文件。在連接器腳本中,需要指定兩個工程文件的輸出文件名和存放位置。
5. 配置構建順序:如果兩個工程文件之間存在依賴關系,需要確保先編譯依賴的工程文件,再編譯被依賴的工程文件,以確保編譯順序正確。
原因解釋:編譯兩個共存的工程文件是為了實現不同的功能模塊或應用程序在同一個MCU上運行。每個工程文件獨立編譯,可以確保各個模塊之間的相互影響最小化,並且可以靈活地進行修改和維護。
拓展內容:在編譯兩個共存的工程文件時,還需要注意以下幾點:
- 確保兩個工程文件之間的資源沖突問題:例如,如果兩個工程文件都使用了同一個外設資源,需要在編譯過程中進行資源的分配和沖突解決。
- 需要在系統初始化階段對兩個工程文件進行正確的初始化配置:這包括對時鍾、外設、中斷等進行正確的配置,以確保兩個工程文件能夠正常運行。
- 在調試過程中,需要對兩個工程文件進行適當的排錯和調試:這包括使用合適的調試工具、觀察變數和寄存器的值、通過列印信息等方式進行調試。
總之,編譯兩個共存的工程文件需要注意解決資源沖突、正確配置初始化和調試等問題,以確保兩個工程文件能夠正常運行並共存於MCU中。
