資源下載:關(guān)注我們“單片機(jī)”,回復(fù)“教程”獲取單片機(jī)電子書(shū),回復(fù)“仿真”獲取Proteus仿真資料。持續(xù)更新中。。。 怎么知道堆棧使用了多少? 比如51單片機(jī),怎么查看堆棧使用情況,有沒(méi)有溢出? 最大堆棧=子程序調(diào)用最大級(jí)數(shù)+中斷最大嵌套級(jí)數(shù) 分別計(jì)算中斷級(jí)別 的最大堆棧,然后累加可確定 比如中斷級(jí)別Z1的最大 的堆棧為A; 比如中斷級(jí)別Z2的最大 的堆棧為B; 比如中斷級(jí)別Z3的最大 的堆棧為C; 那么最多為A+B+C 或者用仿真器,進(jìn)入調(diào)試狀態(tài)即可看到所有SFR... 用keil也可以: Keil 已經(jīng)自動(dòng)幫你計(jì)算了:sp_max = 使用過(guò)的最大棧頂記憶。
什么叫軟件堆棧,什么叫硬件堆棧?什么叫軟件堆棧,什么叫硬件堆棧?兩者的區(qū)別是什么? 看其棧頂指針是否和CPU具有特殊的關(guān)聯(lián),有關(guān)聯(lián)者(如SP)“硬”,而無(wú)關(guān)聯(lián)者“軟”。 單片機(jī)在執(zhí)行調(diào)用子程序的指令時(shí),一般會(huì)把返回地址自動(dòng)存入堆棧,而沒(méi)有被單片機(jī)自動(dòng)入棧但是也需要保存的內(nèi)容比如狀態(tài)寄存器、通用寄存器等,就得通過(guò)PUSH等指令把它們?nèi)藶榈乇4娴蕉褩V小?/span> 自動(dòng)入棧和“人為入?!笨赡苁褂玫氖且粋€(gè)堆棧指針。有的單片機(jī)可以分開(kāi),比如AVR,可以通過(guò)“ST -Y, R0”這樣的指令把R0存入軟件堆棧區(qū)(Y是由R28和R29兩個(gè)寄存器的值組成的16位指針),有的單片機(jī)缺少這樣的指令,就會(huì)把軟件堆棧和硬件堆棧放在一個(gè)??臻g,都使用SP,比如51. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > |
|
來(lái)自: 昵稱(chēng)29273511 > 《待分類(lèi)》