PIC硬件堆棧與軟件堆棧
軟件棧是你自己通過編碼實(shí)現(xiàn)的。你在內(nèi)存里劃一塊作棧區(qū),用一個(gè)變量作棧指針。
本文引用地址:http://m.butianyuan.cn/article/201611/316247.htm軟件堆棧:也可以說是用戶堆棧??梢员欢x在內(nèi)部或外部RAM中。它是用戶為任務(wù)建立的專用數(shù)據(jù)堆棧,與系統(tǒng)堆棧的數(shù)據(jù)區(qū)是隔開的。它可以保存用戶想保存的任何寄存器和狀態(tài)字。
MPLAB C18的軟件堆棧是向上生長的堆棧數(shù)據(jù)結(jié)構(gòu),編譯器把函數(shù)參數(shù)和auto存儲(chǔ)類別的局部變量放入軟件堆棧中。軟件堆棧與PICmicro單片機(jī)用于保存函數(shù)調(diào)用返回地址的硬件堆棧不同。
棧指針(FSR1)始終指向下一個(gè)可用的堆棧地址。MPLAB C18使用FSR2作為幀指針,這樣可以快速訪問局部變量和參數(shù)。函數(shù)被調(diào)用時(shí),其基于堆棧的參數(shù)以自右向左的順序壓入堆棧,然后再調(diào)用這個(gè)函數(shù)。進(jìn)入函數(shù)時(shí),最左端的函數(shù)參數(shù)位于軟件堆棧的頂端。
幀指針指向堆棧中把基于堆棧的參數(shù)和基于堆棧的局部變量分隔開的地址。基于堆棧的參數(shù)位于幀指針的下方,而基于堆棧的局部變量位于幀指針的上方。剛進(jìn)入C函數(shù)時(shí),被調(diào)用函數(shù)把FSR2的值壓入堆棧,并把FSR1的值復(fù)制到FSR2,從而保存了調(diào)用函數(shù)的現(xiàn)場并初始化了當(dāng)前函數(shù)的幀指針。然后函數(shù)基于堆棧的局部變量的總長度被加到棧指針,并為這些變量分配堆??臻g。基于堆棧的局部變量和基于堆棧的參數(shù)則根據(jù)其相對(duì)于幀指針的偏移量來引用。
評(píng)論