2014-01-17 315 views
2

我在尋找8051嵌入式處理器系列(特別是80C32)的一個很好的參考資料,它將解釋內部存儲器映射,以及它在家族中處理器之間的差異。8051系列內存映射 - 堆棧指針的用法

我目前正在閱讀堆棧指針在復位到07H時如何初始化。但我在文檔(例如here)中看到,該系列中的所有處理器的內部RAM(從地址00H開始)映射Bank 0的R7以用於位置07H中的內部寄存器。

我對內部寄存器和堆棧如何映射有誤解?

enter image description here

+1

也許您的重置處理程序的第一個操作是希望將SP設置爲實際有用的地址?也許Bank 0是已知存在於同一地址的所有族變體中的唯一RAM,這導致了默認情況下,SP已知在復位後指向現有存儲器。但我只是猜測基於大量的8位微體驗,幾乎沒有一個是8051系列的。 – RBerteig

+1

我不太瞭解該設備,但我記得8051上的索引內存訪問無法觸及SFR,而是進入下面的通用RAM別名,因此將棧指向0x7F或更高是合理的並期待一個明智的結果。但是隻能在廣告超過128字節的內部RAM的設備上使用。 – sh1

+0

你說得對。我知道有關於這個「陰影」,但忘記了這是如何工作,或如何我從一開始就學會了。我把這個堆棧工作混淆了。 80C32具有256字節的內部RAM。任何內存訪問指令都可訪問低128位。但是高128只能通過間接尋址訪問。 MOV R0,#90h/MOV A,@ R0在90H時獲得RAM的內容。 MOV A,90h在90H讀取SRF的內容。 – Jim

回答

2

答案在頁面給你鏈接到:

編程提示:默認情況下,8051初始化堆棧指針 (SP)當單片機引導到07H。這意味着 堆棧將從地址08h開始向上擴展。如果您使用備用寄存器組(bank 1,2或3)將爲 ,則必須將 初始化堆棧指針,使其高於最高寄存器 ,否則該堆棧將覆蓋您的 備用寄存器組。同樣,如果您要使用位 變量,通常會將堆棧指針初始化爲 某個大於2Fh的值以保證您的位變量爲 受保護。

+0

感謝您的快速回答。 (RBerteig也是)。這是有道理的。我只是有一種不舒服的感覺,我錯過了一些信息。 – Jim

+0

啊,堆棧增長不下來,在PUSH上預先遞增。所以選擇0x07是有道理的,因爲真正簡單的代碼可能只需要幾個字節的堆棧,並且可能不需要那些允許RAM被保存的寄存器。 – RBerteig