系統堆棧 和 用戶堆棧

 硬件堆棧:或許也可以稱作系統堆棧,是位於片內RAM區。有人說,只要能使用PUSH,POP指令的單片機,都可以說含有硬件堆棧。這樣的說法我個人覺得不是很全面。通過指令進行壓棧和出棧操作只是系統堆棧中的一種操做。系統堆棧還可以被隱含調用。例如,當調用子程序時,系統會主動把斷點壓入堆棧,並不需要用戶通過指令操作。系統堆棧可以用來保存數據,或在任務子程序間傳遞數據。通常,棧底設在內存的高端,也就是把內存的最高一段空間劃作棧區。這些都是向下生長棧。棧指針可能是專用的寄存器,也可能借用一通用寄存器。也有單片機是在數據區裏劃一塊作棧區,可能是向上生長,也可能是向下生長。
軟件棧是你自己通過編碼實現的。你在內存裏劃一塊作棧區,用一個變量作棧指針。

    軟件堆棧:也可以說是用戶堆棧。可以被定義在內部或外部 RAM中。它是用戶爲任務建立的專用數據堆棧,與系統堆棧的數據區是隔開的。它可以保存用戶想保存的任何寄存器和狀態字。

    MPLAB C18的軟件堆棧是向上生長的堆棧數據結構,編譯器把函數參數和auto存儲類別的局部變量放入軟件堆棧中。軟件堆棧與 PICmicro 單片機用於保存函數調用返回地址的硬件堆棧不同。

    棧指針 (FSR1)始終指向下一個可用的堆棧地址。 MPLAB C18 使用 FSR2 作爲幀指針,這樣可以快速訪問局部變量和參數。函數被調用時,其基於堆棧的參數以自右向左的順序壓入堆棧,然後再調用這個函數。進入函數時,最左端的函數參數位於軟件堆棧的頂端。

    幀指針指向堆棧中把基於堆棧的參數和基於堆棧的局部變量分隔開的地址。基於堆棧的參數位於幀指針的下方,而基於堆棧的局部變量位於幀指針的上方。剛進入 C 函數時,被調用函數把 FSR2 的值壓入堆棧,並把 FSR1的值複製到 FSR2,從而保存了調用函數的現場並初始化了當前函數的幀指針。然後函數基於堆棧的局部變量的總長度被加到棧指針,併爲這些變量分配堆棧空間。基於堆棧的局部變量和基於堆棧的參數則根據其相對於幀指針的偏移量來引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章