最近在用430開發一款產品,在軟件調試的時候發現Watch窗口中無法觀察局部變量的值,總是顯示<unavailable>,下面通過一個簡答的例子說明一下現象:
#include "msp430g2553.h" /* Global variable */ unsigned char ReceiveGlobal; unsigned char addxy(unsigned char x,unsigned char y) { unsigned char z; z = x+y; return z; } void main() { /* Local variable */ unsigned char Receive0; static unsigned char Receive1; volatile unsigned char Receive2; Receive0 = addxy(0,1); Receive1 = addxy(1,2); Receive2 = addxy(3,4); ReceiveGlobal = addxy(5,6); while(1); }
在while(1)處設一斷點,在Debug模式下通過Watch窗口觀察變量:
現在回過頭去看IAR中的"Options — c/c++ compiler — Optimization[ˌɔptimaiˈzeiʃən] — Level" 選項:
Level的缺省值為Low,當我把Level選為None之后,即不執行任何優化時,全局變量、靜態局部變量、局部變量的值都可以看到,如下圖所示。
當我把優化等級選為Midium或者High之后,全局變量、靜態局部變量、局部變量的值都不可見了。
結論:要想觀察局部變量的值,調試的時候可以把優化等級設為None.
補充幾個知識點:
- 堆棧(stack)——由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。
- 靜態存儲區(static)—— 全局變量和靜態變量的存儲是放在一塊的。初始化的全局變量和靜態變量在一塊區域;未初始化的全局變量和靜態變量在相鄰的另一塊區域。程序結束后由系統釋放。