怎么知道堆棧使用了多少? 比如51單片機,怎么查看堆棧使用情況,有沒有溢出?
最大堆棧=子程序調用最大級數+中斷最大嵌套級數
分別計算中斷級別 的最大堆棧,然后累加可確定
比如中斷級別Z1的最大 的堆棧為A;
比如中斷級別Z2的最大 的堆棧為B;
比如中斷級別Z3的最大 的堆棧為C;
那么最多為A+B+C
或者用仿真器,進入調試狀態(tài)即可看到所有SFR...
用keil也可以:
Keil 已經自動幫你計算了:sp_max = 使用過的最大棧頂記憶。
什么叫軟件堆棧,什么叫硬件堆棧?
什么叫軟件堆棧,什么叫硬件堆棧?兩者的區(qū)別是什么?
看其棧頂指針是否和CPU具有特殊的關聯,有關聯者(如SP)“硬”,而無關聯者“軟”。
單片機在執(zhí)行調用子程序的指令時,一般會把返回地址自動存入堆棧,而沒有被單片機自動入棧但是也需要保存的內容比如狀態(tài)寄存器、通用寄存器等,就得通過PUSH等指令把它們人為地保存到堆棧中。
自動入棧和“人為入棧”可能使用的是一個堆棧指針。有的單片機可以分開,比如AVR,可以通過“ST -Y, R0”這樣的指令把R0存入軟件堆棧區(qū)(Y是由R28和R29兩個寄存器的值組成的16位指針),有的單片機缺少這樣的指令,就會把軟件堆棧和硬件堆棧放在一個??臻g,都使用SP,比如51.