成品網(wǎng)站開發(fā)手機(jī)百度提交入口
一、單片機(jī)存儲(chǔ)區(qū)域
如圖所示位STM32F103ZET6的參數(shù):
單片機(jī)的ROM(內(nèi)部FLASH):512KB,用來(lái)存放程序代碼的空間。
單片機(jī)的RAM:64KB,一般都被分配為堆、棧、變量等的空間。
二、堆和棧的概念
單片機(jī)中的堆和棧是用來(lái)存儲(chǔ)程序運(yùn)行時(shí)的數(shù)據(jù)的兩個(gè)重要區(qū)域。堆和棧都存在于單片機(jī)的RAM(隨機(jī)存儲(chǔ)器)中。
堆是用來(lái)存儲(chǔ)動(dòng)態(tài)分配的內(nèi)存空間的區(qū)域。在單片機(jī)中,堆的大小取決于程序的需求,但是總大小不能超過(guò)單片機(jī)硬件的實(shí)際RAM大小。堆的分配和釋放是由程序員手動(dòng)控制的,通常使用malloc()和free()等函數(shù)來(lái)進(jìn)行操作。
棧是用來(lái)存儲(chǔ)函數(shù)調(diào)用和局部變量的區(qū)域。每當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),函數(shù)的參數(shù)、返回地址和局部變量等信息都會(huì)被壓入棧中。當(dāng)函數(shù)執(zhí)行完畢后,這些信息會(huì)被彈出棧。棧的大小是由編譯器在編譯時(shí)確定的,通常是根據(jù)函數(shù)的嵌套深度和局部變量的大小來(lái)決定的。
堆和棧都是用來(lái)存儲(chǔ)程序運(yùn)行時(shí)的數(shù)據(jù)的區(qū)域,但是它們的分配和使用方式有所不同。
三、堆和棧的位置與分配方式
堆棧位置
棧:向低地址擴(kuò)展,從上往下擴(kuò)展;
堆:向高地址擴(kuò)展,從下網(wǎng)上擴(kuò)展;
設(shè)置堆棧的空間大小時(shí)要根據(jù)程序需求合理調(diào)整,如果堆或棧的空間分配不足,導(dǎo)致堆棧溢出,程序跑飛。
合理分配堆棧
可以通過(guò)編譯后生成的后綴為.htm的文件查看所需的棧的大小:
如圖所示為某程序的.htm文件的內(nèi)容:
最大的??臻g=800bytes+未知
未知的空間去800的20%就足夠了。
那么棧空間的大小可以設(shè)置為800+160=960byte
堆的分配和釋放是由程序員手動(dòng)控制的,通常使用malloc()和free()等函數(shù)來(lái)進(jìn)行操作。棧空間的大小根據(jù)我們?cè)诔绦蛑蟹峙涞淖畲蟮亩训拇笮?lái)決定。當(dāng)然,最好也預(yù)留一些預(yù)留,如果在程序中分配了100byte,那么,可以設(shè)置堆大小為110bytes。
四、案例分析
打開KEIL工程中的Map File文件后,在文件內(nèi)容最下方可以看到如下統(tǒng)計(jì)。
圖中,各代號(hào)含義如下,
Code:代碼存儲(chǔ)區(qū)。這部分是存放代碼的。
RO-Data:只讀數(shù)據(jù)區(qū)。這部分保存程序中用 const 定義的全局常量數(shù)據(jù)和字符串。
RW-Data:已初始化的讀寫數(shù)據(jù)。程序中定義的已經(jīng)初始化的全局變量和靜態(tài)變量。
ZI-Data:未初始化的讀寫數(shù)據(jù)。程序中定義的未初始化的全局變量和靜態(tài)變量。這部分內(nèi)容是在程序運(yùn)行的時(shí)候保存在RAM中的。
五、STM32堆棧設(shè)置
六、PC指針與SR指針
SP(Stack Pointer,堆棧指針寄存器)
堆棧是一個(gè)用于存儲(chǔ)臨時(shí)數(shù)據(jù)和函數(shù)調(diào)用信息的數(shù)據(jù)結(jié)構(gòu)。SP 指向堆棧的當(dāng)前頂部,當(dāng)數(shù)據(jù)被推入或彈出堆棧時(shí),SP 會(huì)相應(yīng)地遞減或遞增。
PC(Program Counter,程序計(jì)數(shù)器)
概念:程序計(jì)數(shù)器通常有32位或64位,能表示232或264個(gè)內(nèi)存地址,程序計(jì)數(shù)器某一時(shí)刻只能存儲(chǔ)一個(gè)地址,該地址指向下一條將要執(zhí)行的指令。
功能:是控制指令執(zhí)行流程的關(guān)鍵,確保指令按照正確的順序執(zhí)行。
單片機(jī)程序執(zhí)行過(guò)程:
1、首先開辟堆棧:初始化堆棧指針 SP
2、初始化程序計(jì)數(shù)器指針:初始化 PC 指針
3、從FLASH啟動(dòng),執(zhí)行程序: