新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC硬件堆棧與軟件堆棧

        PIC硬件堆棧與軟件堆棧

        作者: 時間:2016-11-13 來源:網絡 收藏
        硬件堆棧:或許也可以稱作系統堆棧,是位于片內RAM區。有人說,只要能使用PUSH,POP指令的單片機,都可以說含有硬件堆棧。這樣的說法我個人覺得不是很全面。通過指令進行壓棧和出棧操作只是系統堆棧中的一種操做。系統堆棧還可以被隱含調用。例如,當調用子程序時,系統會主動把斷點壓入堆棧,并不需要用戶通過指令操作。系統堆??梢杂脕肀4鏀祿?,或在任務子程序間傳遞數據。通常,棧底設在內存的高端,也就是把內存的最高一段空間劃作棧區。這些都是向下生長棧。棧指針可能是專用的寄存器,也可能借用一通用寄存器。也有單片機是在數據區里劃一塊作棧區,可能是向上生長,也可能是向下生長。

        軟件棧是你自己通過編碼實現的。你在內存里劃一塊作棧區,用一個變量作棧指針。

        本文引用地址:http://www.104case.com/article/201611/316247.htm

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

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

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

        幀指針指向堆棧中把基于堆棧的參數和基于堆棧的局部變量分隔開的地址?;诙褩5膮滴挥趲羔樀南路?,而基于堆棧的局部變量位于幀指針的上方。剛進入C函數時,被調用函數把FSR2的值壓入堆棧,并把FSR1的值復制到FSR2,從而保存了調用函數的現場并初始化了當前函數的幀指針。然后函數基于堆棧的局部變量的總長度被加到棧指針,并為這些變量分配堆??臻g?;诙褩5木植孔兞亢突诙褩5膮祫t根據其相對于幀指針的偏移量來引用。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 新疆| 遂平县| 乌兰浩特市| 繁峙县| 盈江县| 洪雅县| 石嘴山市| 龙川县| 子长县| 江阴市| 茂名市| 丽江市| 正安县| 周至县| 上栗县| 宿松县| 永顺县| 都兰县| 商洛市| 东安县| 清流县| 明光市| 万载县| 朝阳市| 阿鲁科尔沁旗| 永丰县| 长海县| 贡嘎县| 东宁县| 阿图什市| 布拖县| 滨海县| 保山市| 金山区| 惠东县| 西畴县| 察雅县| 图木舒克市| 乡宁县| 巧家县| 弥渡县|