(玩電子(zi)) 電子(zi)技術學習與研xin)/div>
當前位置(zhi)︰單片機教(jiao)程網 >> 基礎教(jiao)程 >> 瀏覽(lan)文章

爱彩票网官网

作者:佚名   來源:本站原創   點擊(ji)數(shu):x  更新時間︰2020年02月10日(ri)   【字體︰ 小(xiao)

Keil  程序調(diao)試窗口

上(shang)一講中xing)頤茄 傲liao)幾種常用的程序調(diao)試方法,這一講中將介(jie)紹 Keil  提(ti)供各(ge)種zhi)翱諶輸出窗口、觀察窗口、存儲器(qi)窗口、反(fan)匯編窗口、串行窗口等的用途,以及這些(xie)窗口的使用 方法,並(bing)通過實例介(jie)紹這些(xie)窗口在調(diao)試中的使用。

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

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

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

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

1、存儲器(qi)窗口

?
存儲器(qi)窗口中可以顯示系(xi)統中各(ge)種內(na)存中的值,通過在 Address 後的編緝框內(na)輸入“bai)母︰數(shu)字”即可shang)允鞠嚶δna)存值,其中字母可以是 C、D、I、X,分別代表(biao)代碼存儲空(kong)間、 直接尋址的片內(na)存儲空(kong)間、間接尋址的片內(na)存儲空(kong)間、擴展(zhan)的外部 RAM 空(kong)間,數(shu)字zhi)biao)想 要查看(kan)的地(di)址。例如輸入 D︰0 即可觀察到地(di)址 0 開始(shi)的片內(na) RAM 單元值、鍵入 C︰0 即 可shang)允敬0 開始(shi)的 ROM 單元中的值,即查看(kan)程序的二進(jin)制代碼。該窗口的顯示值可以以各(ge) 種形(xing)式(shi)顯示,如十進(jin)制、十六進(jin)制、字符型等,改變顯示方式(shi)的方法是點鼠標右鍵,在彈出 的mu)旖薟說?醒xuan)擇,該菜單用分隔(ge)條分成三(san)部份,其中第一部份與第二部份的三(san)個選(xuan)項為同 一級別,選(xuan)中第一部份的任(ren)一選(xuan)項,內(na)容將以整數(shu)形(xing)式(shi)顯示,而選(xuan)中第二部份 的  Ascii  項則將以字符型式(shi)顯示,選(xuan)中 Float  項將相鄰四字節(jie)組成的浮點數(shu)形(xing) 式(shi)顯示、選(xuan)中 Double 項則將相鄰 8 字節(jie) 組成雙精(jing)度形(xing)式(shi)顯示。第一部份又(you)有多(duo) 個選(xuan)擇項,其中 Decimal 項是一個開關, 如果選(xuan)中該項,則窗口中的值將以十進(jin) 制的形(xing)式(shi)顯示,否則按(an)默認xi)氖 jin)制

方式(shi)顯示。Unsigned 和 Signed 後分別有

存儲器(qi)數(shu)值各(ge)種方式(shi)顯示選(xuan)擇

三(san)個選(xuan)項︰Char、Int、Long,分別代表(biao)以單字節(jie)方式(shi)顯示、將相鄰雙字節(jie)組成整型數(shu)方式(shi)


顯示、將相鄰四字節(jie)組成長整型tou)絞shi)顯示,而 Unsigned 和 Signed 則分別代表(biao)無(wu)符號形(xing)式(shi)和

有符號形(xing)式(shi),究竟(jing)從哪一個單元開始(shi)的相鄰單元則與你的設(she)置(zhi)有關,以整型為例,如果你輸 入的是 I:0,那(na)麼 00H 和 01H 單元的內(na)容將會(hui)組成一個整型數(shu),而如果你輸入的是 I︰1,01H和 02H 單元的內(na)容全(quan)組成一個整型數(shu),以此(ci)類推(tui)。有關數(shu)據(ju)格(ge)式(shi)與 C 語言規定相同,請參(can)

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

2、工(gong)程窗口寄存器(qi)頁(ye)


圖 3 存儲器(qi)的值的修改

圖 4 是工(gong)程窗口寄存器(qi)頁(ye)的內(na)容,寄存器(qi)頁(ye)包括了(liao)當前的工(gong)作寄存器(qi)組和系(xi)統寄存器(qi),

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

3、觀察窗口

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

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

二、各(ge)種zhi)翱讜誄絛虻diao)試中的用途

以下(xia)通過一個高級語言程序來ci)得髡廡xie)窗口的使用。例 2︰

圖 4  工(gong)程窗口寄存器(qi)頁(ye)


#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;         }

}        }

這個程序的工(gong)作過程是︰不斷xi)饔醚郵背絛潁 看(kan)ci)延時 10 毫秒,然後將變量 I 加 1,隨 後對變量 I 進(jin)行判斷,如果 I 的值等于 10,那(na)麼將 P1.0 取反(fan),並(bing)將 I 清 0,最終的執(zhi)行效果

是 P1.0 每 0.1S 取反(fan)一次(ci)。

輸入源程序並(bing)以 exam2.c 為文件(jian)名存盤(pan),建立(li)名為 exam2 的項目(mu),將 exam2.c 加入項目(mu), 編譯、連接後按(an) Ctrl+F5 進(jin)入調(diao)試,按(an) F10 單步(bu)執(zhi)行xiao)W 夤鄄齏翱冢 渲杏幸桓霰昵┬ye)為 Locals,這一頁(ye)會(hui)自動顯示當前模塊中的變量名及變量值。可以看(kan)到窗口中有名為 I 的變量, 其值隨著執(zhi)行的次(ci)數(shu)而逐漸加大,如果在執(zhi)行到 mDelay(10)行時按(an) F11 跟蹤到 mDelay 函數(shu) 內(na)部,該窗口的變量自動變為 DelayTime 和 j。另外兩(liang)個標簽頁(ye) Watch #1 和 Watch #2 可以加 入自定義的觀察變量,點擊(ji)“type F2 to edit”然後再按(an) F2 即可輸入變量,試著在 Watch #1 中輸入 I,觀察它的變化。在程序較復雜(za),變量很多(duo)的場合,這兩(liang)個自定義觀察窗口可以篩 選(xuan)出我們自己感興趣的變量加以觀察。觀察窗口中變量的值不僅可以觀察,還可以修改,以 該程序為例,I 須加 10 次(ci)才能(neng)到 10,為快速驗證是否可以正確執(zhi)行到 P1_0=!P1_0 行,點擊(ji)

I 後面(mian)的值,再按(an) F2,該值即可修改,將 I 的值改到 9,再次(ci)按(an) F10 單步(bu)執(zhi)行,即可以很快 執(zhi)行到 P1_0=!P1_0 程序行xiao)8麼翱諳允鏡謀淞恐悼梢砸允 jin)制或十六進(jin)制形(xing)式(shi)顯示,方法 是在顯示窗口點右鍵,在快捷菜單中選(xuan)擇如圖 5 所示。

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


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

程序調(diao)試中常使用設(she)置(zhi)斷xi)閎緩筧quan)速運行的 方式(shi),在斷xi)憒 梢曰竦黴ge)變量值,但卻ci)薹ㄖ道程序到達斷xi)鬩鄖熬烤jing)執(zhi)行了(liao)哪些(xie)代碼,而這 往(wang)往(wang)是需要了(liao)解(jie)的,為此(ci),Keil 提(ti)供了(liao)跟蹤功能(neng), 在運行程序之前an)蚩 diao)試工(gong)具條上(shang)xi)腦市碭俅碼開關,然後全(quan)速運行程序,當程序停止運行後, 點擊(ji)查看(kan)跟蹤代碼按(an)鈕,自動切換到反(fan)匯編窗口,


圖 5  設(she)定觀察窗的顯示方式(shi)

圖 6  反(fan)匯編窗口

如圖 6  所示,其中前面(mian)標有xiao)”號的行xin)褪侵卸弦鄖爸zhi)行的代碼,可以按(an)窗口邊的上(shang)卷按(an) 鈕向上(shang)翻查看(kan)代碼執(zhi)行記錄。

利用工(gong)程窗口可以觀察程序執(zhi)行的時間,下(xia)面(mian)我們觀察一下(xia)該例中延時程序的延時時間 是否滿(man)足我們的要求,即是否確實延時 10 毫秒,展(zhan)開工(gong)程窗口 Regs 頁(ye)中的 Sys 目(mu)錄樹,其 中的 Sec 項記錄了(liao)從ying)絛蚩 shi)執(zhi)行到當前程序流逝的秒數(shu)。點擊(ji) RST 按(an)鈕以復ci)懷絛潁ec 的值回零,按(an)下(xia) F10 鍵,程序窗口中的黃色(se)箭頭(tou)指向 mDelay(10)行,此(ci)時,記錄下(xia) Sec 值為

0.00038900,然後再按(an) F10 執(zhi)行完該段(duan)程序,再次(ci)查看(kan) Sec 的值為 0.01051200,兩(liang)者相減大 約是 0.01 秒,所以延時時間大致是正確的。讀(du)者可以試著將延時程序中的 unsigned int 改為 unsigned char 試試看(kan)時間是否仍正確。注意,使用這一功能(neng)的na)疤ti)是在項目(mu)設(she)置(zhi)中正確設(she)置(zhi) 晶振的數(shu)值。

Keil 提(ti)供了(liao)串行窗口,我們可以直接在串行窗口中鍵入字符,該字符雖不會(hui)被顯示出來, 但卻能(neng)傳遞(di)到仿真(zhen) CPU 中,如果仿真(zhen) CPU 通過串行口發送(song)字符,那(na)麼這些(xie)字符會(hui)在串行窗 口顯示出來,用該窗口可以在沒(mei)有硬件(jian)的na)榭魷xia)用鍵盤(pan)模擬串口通訊(xun)。下(xia)面(mian)通過一個例子(zi)說

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

口中xiao)1喑痰姆椒ㄊ峭 jian)測 RI 是否等于 1 來判斷串行口是否有字符輸入,如果有字符輸

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

MOV                SP,#5FH               ;堆棧(zhan)初(chu)始(shi)化

CALL            SER_INIT ;串行口初(chu)始(shi)化

LOOP:

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

JMP              LOOP                ;否則等待接收字符

NEXT:

MOV            A,SBUF                ;從 SBUF 中取字符

MOV            SBUF,A    ;回送(song)到發送(song) SBUF 中

SEND:

JBC           TI,LOOP                ;發送(song)完成,轉 LOOP


JMP           SEND                    ;否則等待發送(song)完

SER_INIT:                                             ;中斷初(chu)始(shi)化

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

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

SETB                    TR1              ;定時器(qi) 1 開始(shi)運行

SETB                    REN            ;允許接收

SETB       SM2

RET END

輸入源程序,並(bing)建立(li)項目(mu),正確編譯、連接,進(jin)入調(diao)試後,全(quan)速運行,點擊(ji)串行窗口 1 按(an)鈕,即在原源程序窗口位置(zhi)出現一個空(kong)白(bai)窗口,擊(ji)鍵,相應的字母就會(hui)出現在該窗口中xiao)在窗口中擊(ji)鼠標右鍵,出現一個彈出式(shi)菜單,選(xuan)擇“Ascii  Mode”即以 Ascii 碼的方式(shi)顯示 接收到的數(shu)據(ju);選(xuan)擇“Hex Mode”以十六進(jin)制碼方式(shi)顯示接收到的數(shu)據(ju);選(xuan)擇“Clear Window” 可以清除窗口中顯示的內(na)容。

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

小(xiao)技巧︰凡是鼠標單擊(ji)然後按(an) F2 的地(di)方都(du)可以za)檬蟊炅 ?ji)兩(liang)次(ci)(注意︰不是雙擊(ji)) 來替代。

爱彩票网官网

爱彩票网官网 | 下一页