從微控制器角度看堆疊及部分延伸問題

2021-10-23 05:08:13 字數 2793 閱讀 8178

本文章為網路資源摘抄與總結,能力有限,有錯誤與漏洞希望大佬們給予提示或幫助,感謝…

一、堆疊的相關概念

(1)棧區(stack):由編譯器自動分配和釋放,存放函式的引數值、區域性變數的值等,其操作方式類似

於資料結構中的棧。

(2)堆區(heap):一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統**。分配

方式類似於資料結構中的鍊錶。

(3)全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系

統自動釋放。

(4)文字常量區:常量字串就是存放在這裡的。

(5)程式**區:存放函式體的二進位制**。

以下是概念結構圖

二、靜態、全域性變數概念 (static/extern)

普通區域性變數是再熟悉不過的變數了,在任何乙個函式內部定義的變數(不加static修飾符)都屬於這個範疇。編譯器一般不對普通區域性變數進行初始化,也就是說它的值在初始時是不確定的,除非對其顯式賦值。

普通區域性變數儲存於程序棧空間,使用完畢會立即釋放。

靜態區域性變數使用static修飾符定義,即使在宣告時未賦初值,編譯器也會把它初始化為0。且靜態區域性變數儲存於程序的全域性資料區,即使函式返回,它的值也會保持不變。

變數在全域性資料區分配記憶體空間;編譯器自動對其初始化,其作用域為區域性作用域,當定義它的函式結束時,其作用域隨之結束全域性變數定義在函式體外部,在全域性資料區分配儲存空間,且編譯器會自動對其初始化。

普通全域性變數對整個工程可見,其他檔案可以使用extern外部宣告後直接使用。也就是說其他檔案不能再定義乙個與其相同名字的變數了(否則編譯器會認為它們是同乙個變數)。

靜態全域性變數僅對當前檔案可見,其他檔案不可訪問,其他檔案可以定義與其同名的變數,兩者互不影響。

三、在程式執行下,堆疊示例

int a=0;

//全域性初始化區

char

*p1;

//全域性未初始化區

main()

按程式順序解釋操作

1、定義了a整形變數,a入棧(先入後出),全域性初始化區分配位址存入資料0,因為此操作不在括號內,所以此部分程式執行結束也不存在出棧與記憶體釋放。

2、定義了p1指標變數,p1入棧(先入後出),全域性未初始化區分配位址,因為此操作不在括號內,所以此部分程式執行結束也不存在出棧與記憶體釋放。

3、定義了b整形變數,b入棧(先入後出),棧區分配位址,因為此操作在括號內,所以此部分程式執行結束存在出棧與記憶體釋放。

4、定義了陣列s,s入棧(先入後出),棧區分配位址,存入「abc」 因為此操作在括號內,所以此部分程式執行結束存在出棧與記憶體釋放。

5、定義了字元指標p3,p3入棧(存入的是首位址),123456/0在常量區,因為此操作在括號內,所以此部分程式執行結束存在出棧與記憶體釋放。

6、定義了靜態區域性整形變數c,入棧(先入後出),靜態初始化區分配位址存入資料0,因為是靜態區域性變數,所以此部分程式執行結束不存在記憶體釋放。

7、在堆區申請長度為10位元組的連續儲存空間,並將分配到的儲存空間位址轉換為char型別位址,然後把他賦給指標變數p1。

8、拷貝123456/0在棧區,並放入到目標p3首位址中,123456/0放在常量區,因為之前存入過同樣的資料,編譯器可能會將它與p3所指向的"123456" 優化成乙個資料位址。節省了空間。

四、延伸問題

const 有什麼用途?

const:限定變數的許可權,變成唯讀(不能做左值)。左值:寫許可權 右值:讀許可權

1.基本資料型別對於const透明。

2.const修飾它的直接右邊。

const int*p=&a;=>int const *p1=&a;

*p1=1000;//出錯,*p1不能做左值

3.許可權可以同等或者縮小傳遞,但不能放大傳遞。

嵌入式c語言中volatile的用途?

乙個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:

並行裝置的硬體暫存器(如:狀態暫存器)

乙個中斷服務子程式中會訪問到的非自動變數(non-automatic variables)

多執行緒應用中被幾個任務共享的變數

大端儲存與小端儲存?

大端(儲存)模式:是指乙個資料的低位位元組序的內容放在高位址處,高位位元組序存的內容放在低位址處。

小端(儲存)模式:是指乙個資料的低位位元組序內容存放在低位址處,高位位元組序的內容存放在高位址處。(可以總結為「小小小」即低位、低位址、小端)

32位的資料0x12345678從位址0x20000000開始儲存,小端和大端的儲存區別如下圖

未完待續。。。。。。

51微控制器 堆疊

堆疊的作用是用在呼叫子程式或中斷程式時保護現場,因為51微控制器的暫存器是十分有限的,而相對來說普通資料儲存器更充足,通過入棧將暫存器中的內容臨時儲存到堆疊中 普通資料儲存器 這是乙個用時間換取空間的程式設計方式。51微控制器的堆疊是向上生長的,就是堆疊不為空時,棧底位址小於棧頂位址,當將資料入棧時...

微控制器及微控制器系統

微控制器及微控制器系統 1 什麼是微控制器?微控制器是將 處理器 cpu 隨機儲存器 ram 唯讀儲存器 rom或eprom 定時器晶元和一些輸入 輸出介面電路整合在乙個晶元上的微控制器 microcontroller 處理器包括運算器 控制器和暫存器3個主要部分,是微控制器的核心。儲存器按工作方式...

從鏈結和彙編指令看微控制器

objdump幫助理解鏈結過程。linker將各種 o的檔案鏈結在一起。使用 objdump 可以看到很多資訊。objdump d the file.o 可以看到含有彙編助記符的指令。objdump t the file.o 該檔案可以在安裝目錄c nxp s32ds power v2017.r1 ...