(玩電子) 電子技術學習與研究
當前位置:單片機教程網 >> 基礎教程 >> 瀏覽文章

Keil教程(3)

作者:佚名   來源:本站原創   點擊數:x  更新時間:2007年09月12日   【字體:

Keil  程序調試窗口

上一講中我們學習了幾種常用的程序調試方法,這一講中將介紹 Keil  提供各種窗口如 輸出窗口、觀察窗口、存儲器窗口、反匯編窗口、串行窗口等的用途,以及這些窗口的使用 方法,并通過實例介紹這些窗口在調試中的使用。

一、程序調試時的常用窗口

Keil 軟件在調試程序時提供了多個窗口,主要包括輸出窗口(Output  Windows)、觀察 窗口(Watch&Call Statck Windows)、存儲器窗口(Memory Window)、反匯編窗口(Dissambly Window)串行窗口(Serial Window)等。進入調試模式后,可以通過菜單 View 下的相應命 令打開或關閉這些窗口。

圖 1 是輸出窗口、觀察窗口和存儲器窗口,各窗口的大小可以使用鼠標調整。進入調試 程序后,輸出窗口自動切換到 Command 頁。該頁用于輸入調試命令和輸出調試信息。對于 初學者,可以暫不學習調試命令的使用方法。

圖 1  調試窗口(命令窗口、存儲器窗口、觀察窗口)

1、存儲器窗口

?
存儲器窗口中可以顯示系統中各種內存中的值,通過在 Address 后的編緝框內輸入“字 母:數字”即可顯示相應內存值,其中字母可以是 C、D、I、X,分別代表代碼存儲空間、 直接尋址的片內存儲空間、間接尋址的片內存儲空間、擴展的外部 RAM 空間,數字代表想 要查看的地址。例如輸入 D:0 即可觀察到地址 0 開始的片內 RAM 單元值、鍵入 C:0 即 可顯示從 0 開始的 ROM 單元中的值,即查看程序的二進制代碼。該窗口的顯示值可以以各 種形式顯示,如十進制、十六進制、字符型等,改變顯示方式的方法是點鼠標右鍵,在彈出 的快捷菜單中選擇,該菜單用分隔條分成三部份,其中第一部份與第二部份的三個選項為同 一級別,選中第一部份的任一選項,內容將以整數形式顯示,而選中第二部份 的  Ascii  項則將以字符型式顯示,選中 Float  項將相鄰四字節組成的浮點數形 式顯示、選中 Double 項則將相鄰 8 字節 組成雙精度形式顯示。第一部份又有多 個選擇項,其中 Decimal 項是一個開關, 如果選中該項,則窗口中的值將以十進 制的形式顯示,否則按默認的十六進制

方式顯示。Unsigned 和 Signed 后分別有

存儲器數值各種方式顯示選擇

三個選項:Char、Int、Long,分別代表以單字節方式顯示、將相鄰雙字節組成整型數方式


顯示、將相鄰四字節組成長整型方式顯示,而 Unsigned 和 Signed 則分別代表無符號形式和

有符號形式,究竟從哪一個單元開始的相鄰單元則與你的設置有關,以整型為例,如果你輸 入的是 I:0,那么 00H 和 01H 單元的內容將會組成一個整型數,而如果你輸入的是 I:1,01H和 02H 單元的內容全組成一個整型數,以此類推。有關數據格式與 C 語言規定相同,請參

考  C  語言書籍,默認以無符號單字節方式顯 示。第三部份的 Modify Memory at X:xx 用于 更改鼠標處的內存單元值,選中該項即出現如 圖 3 所示的對話框,可以在對話框內輸入要修 改的內容。

2、工程窗口寄存器頁


圖 3 存儲器的值的修改

圖 4 是工程窗口寄存器頁的內容,寄存器頁包括了當前的工作寄存器組和系統寄存器,

系統寄存器組有一些是實際存在的寄存器如 A、B、DPTR、SP、PSW 等,有一些是實際中 并不存在或雖然存在卻不能對其操作的如  PC、Status  等。每當程序中執行到對某寄存器的 操作時,該寄存器會以反色(藍底白字)顯示,用鼠標單擊然后按下 F2 鍵,即可修改該值。

3、觀察窗口

?
觀察窗口是很重要的一個窗口,工程窗口中僅可以觀察到工作寄存器和有限的寄存器如 A、B、DPTR 等,如果需要觀 察其它的寄存器的值或者在高級語言編程時需要直接觀察變 量,就要借助于觀察窗口了。

其它窗口將在以下的實例中介紹。 一般情況下,我們僅在單步執行時才對變量的值的變化感興趣,全速運行時,變量的值是不變的,只有在程序停下來之 后,才會將這些值最新的變化反映出來,但是,在一些特殊場 合下我們也可能需要在全速運行時觀察變量的變化,此時可以 點擊 View->Periodic Window Updata(周期更新窗口),確認該 項處于被選中狀態,即可在全速運行時動態地觀察有關值的變 化。但是,選中該項,將會使程序模擬執行的速度變慢。

二、各種窗口在程序調試中的用途

以下通過一個高級語言程序來說明這些窗口的使用。例 2:

圖 4  工程窗口寄存器頁


#include "reg51.h"

sbit P1_0=P1^0;                       //定義 P1.0

void mDelay(unsigned char DelayTime)

{     unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{   for(j=0;j<125;j++)    {;}     }

}

void main()


{     unsigned int i;

for(;;){              mDelay(10);                    // 延時  10

毫秒

i++;

if(i==10)

{       P1_0=!P1_0;

i=0;         }

}        }

這個程序的工作過程是:不斷調用延時程序,每次延時 10 毫秒,然后將變量 I 加 1,隨 后對變量 I 進行判斷,如果 I 的值等于 10,那么將 P1.0 取反,并將 I 清 0,最終的執行效果

是 P1.0 每 0.1S 取反一次。

輸入源程序并以 exam2.c 為文件名存盤,建立名為 exam2 的項目,將 exam2.c 加入項目, 編譯、連接后按 Ctrl+F5 進入調試,按 F10 單步執行。注意觀察窗口,其中有一個標簽頁為 Locals,這一頁會自動顯示當前模塊中的變量名及變量值?梢钥吹酱翱谥杏忻麨 I 的變量, 其值隨著執行的次數而逐漸加大,如果在執行到 mDelay(10)行時按 F11 跟蹤到 mDelay 函數 內部,該窗口的變量自動變為 DelayTime 和 j。另外兩個標簽頁 Watch #1 和 Watch #2 可以加 入自定義的觀察變量,點擊“type F2 to edit”然后再按 F2 即可輸入變量,試著在 Watch #1 中輸入 I,觀察它的變化。在程序較復雜,變量很多的場合,這兩個自定義觀察窗口可以篩 選出我們自己感興趣的變量加以觀察。觀察窗口中變量的值不僅可以觀察,還可以修改,以 該程序為例,I 須加 10 次才能到 10,為快速驗證是否可以正確執行到 P1_0=!P1_0 行,點擊

I 后面的值,再按 F2,該值即可修改,將 I 的值改到 9,再次按 F10 單步執行,即可以很快 執行到 P1_0=!P1_0 程序行。該窗口顯示的變量值可以以十進制或十六進制形式顯示,方法 是在顯示窗口點右鍵,在快捷菜單中選擇如圖 5 所示。

?
點擊  View->Dissambly  Window  可 以打開反匯編窗口,該窗口可以顯示反 匯編后的代碼、源程序和相應反匯編代 碼的混合代碼,可以在該窗口進行在線


匯編、利用該窗口跟蹤已找行的代碼、 在該窗口按匯編代碼的方式單步執行, 這也是一個重要的窗口。打開反匯編窗口,點擊 鼠標右鍵,出現快捷菜單,如圖 6 所示,其中 Mixed Mode 是以混合方式顯示,Assembly Mode 是以反 匯編碼方式顯示。

程序調試中常使用設置斷點然后全速運行的 方式,在斷點處可以獲得各變量值,但卻無法知 道程序到達斷點以前究竟執行了哪些代碼,而這 往往是需要了解的,為此,Keil 提供了跟蹤功能, 在運行程序之前打開調試工具條上的允許跟蹤代 碼開關,然后全速運行程序,當程序停止運行后, 點擊查看跟蹤代碼按鈕,自動切換到反匯編窗口,


圖 5  設定觀察窗的顯示方式

圖 6  反匯編窗口

如圖 6  所示,其中前面標有“-”號的行就是中斷以前執行的代碼,可以按窗口邊的上卷按 鈕向上翻查看代碼執行記錄。

利用工程窗口可以觀察程序執行的時間,下面我們觀察一下該例中延時程序的延時時間 是否滿足我們的要求,即是否確實延時 10 毫秒,展開工程窗口 Regs 頁中的 Sys 目錄樹,其 中的 Sec 項記錄了從程序開始執行到當前程序流逝的秒數。點擊 RST 按鈕以復位程序,Sec 的值回零,按下 F10 鍵,程序窗口中的黃色箭頭指向 mDelay(10)行,此時,記錄下 Sec 值為

0.00038900,然后再按 F10 執行完該段程序,再次查看 Sec 的值為 0.01051200,兩者相減大 約是 0.01 秒,所以延時時間大致是正確的。讀者可以試著將延時程序中的 unsigned int 改為 unsigned char 試試看時間是否仍正確。注意,使用這一功能的前提是在項目設置中正確設置 晶振的數值。

Keil 提供了串行窗口,我們可以直接在串行窗口中鍵入字符,該字符雖不會被顯示出來, 但卻能傳遞到仿真 CPU 中,如果仿真 CPU 通過串行口發送字符,那么這些字符會在串行窗 口顯示出來,用該窗口可以在沒有硬件的情況下用鍵盤模擬串口通訊。下面通過一個例子說

明 Keil  串行窗口的應用。該程序實現一個行編緝功能,每鍵入一個字母,會立即回顯到窗

口中。編程的方法是通過檢測 RI 是否等于 1 來判斷串行口是否有字符輸入,如果有字符輸

入,則將其送到 SBUF,這個字符就會在串行窗口中顯示出來。其中 ser_init 是串行口初始 化程序,要使用串行口,必須首先對串行口進行初始化。例 3:

MOV                SP,#5FH               ;堆棧初始化

CALL            SER_INIT ;串行口初始化

LOOP:

JBC      RI,NEXT  ; 如果串口接收到字 符,轉

JMP              LOOP                ;否則等待接收字符

NEXT:

MOV            A,SBUF                ;從 SBUF 中取字符

MOV            SBUF,A    ;回送到發送 SBUF 中

SEND:

JBC           TI,LOOP                ;發送完成,轉 LOOP


JMP           SEND                    ;否則等待發送完

SER_INIT:                                             ;中斷初始化

MOV        SCON,#50H ORL         TMOD,#20H ORL          PCON,#80H

MOV         TH1,#0FDH ;設定波特率

SETB                    TR1              ;定時器 1 開始運行

SETB                    REN            ;允許接收

SETB       SM2

RET END

輸入源程序,并建立項目,正確編譯、連接,進入調試后,全速運行,點擊串行窗口 1 按鈕,即在原源程序窗口位置出現一個空白窗口,擊鍵,相應的字母就會出現在該窗口中。 在窗口中擊鼠標右鍵,出現一個彈出式菜單,選擇“Ascii  Mode”即以 Ascii 碼的方式顯示 接收到的數據;選擇“Hex Mode”以十六進制碼方式顯示接收到的數據;選擇“Clear Window” 可以清除窗口中顯示的內容。

由于部份 CPU 具有雙串口,故 Keil 提供了兩個串行窗口,我們選用的 89C51 芯片只有 一個串行口,所以 Serial 2 串行窗口不起作用。

小技巧:凡是鼠標單擊然后按 F2 的地方都可以用鼠標連續單擊兩次(注意:不是雙擊) 來替代。

發表評論】【告訴好友】【收藏此文】【關閉窗口
上一篇:Keil教程(4)

文章評論

爱干AV