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

美娱彩票官网

作者:佚名(ming)   來源(yuan):本(ben)站原(yuan)創(chuang)   點擊數:x  更新時間︰2007年(nian)09月12日   【字體︰

Keil 的mu)ㄖ?吆筒糠莞嘸都ji)巧

在前面的幾講中我們介紹(shao)了工程的建立方法,常用(yong)的調試方法,除(chu)此之外(wai),Keil 還提(ti)供 了一些(xie)輔助工具如外(wai)圍(wei)接口(kou)、性能分(fen)析、變(bian)量來源(yuan)分(fen)析、代碼作用(yong)分(fen)析等,幫助我們了解程 的性能、查(cha)找程序(xu)中的隱藏(cang)錯(cuo)誤(wu),快速查(cha)看程序(xu)變(bian)量名(ming)信(xin)息等,這一講中將對(dui)這些(xie)功工具作 一介紹(shao),另外(wai)還將介紹(shao) Keil 的部份高級調試技(ji)巧。

一、 輔助工具

這部份功能並不是(shi)直接用(yong)來進行程序(xu)調試的,但(dan)可以幫助我們進行程序(xu)的調試、程序(xu)性 能的分(fen)析,同樣(yang)是(shi)一些(xie)很有用(yong)的工具。

1、外(wai)圍(wei)接口(kou)


為了能夠比較xian)憊鄣亓私獾dan)片機中定時器、中斷(duan)、

並行端口(kou)、串行端口(kou)等常用(yong)外(wai)設的使用(yong)情況,Keil  提(ti) 供了一些(xie)外(wai)圍(wei)接口(kou)對(dui)話(hua)框,通過 Peripherals 菜(cai)單(dan)選擇, 該(gai)菜(cai)單(dan)的下拉菜(cai)單(dan)內容與你建立項目時所選的  CPU 有關,如果是(shi)選擇的 89C51 這一類“標準(zhun)”的 51 機, 那麼將會有 Interrupt(中斷(duan))、I/O Ports(並行 I/O 口(kou))、 Serial(串行口(kou))、Timer(定時/計數器)這四mu) wai)圍(wei)設

圖(tu) 1  外(wai)圍(wei)設備之並行端口(kou)


備菜(cai)單(dan)。打開這些(xie)對(dui)話(hua)框,列(lie)出了song) wei)設備的當前使用(yong)情況,各標志位的情況等,可以在這 些(xie)對(dui)話(hua)框中直觀地觀察和更改mu)魍wai)圍(wei)設備的運行情況。

下面我們通過一個簡單(dan)例子看一看並行端口(kou)的外(wai)圍(wei)設備對(dui)話(hua)框的使用(yong)。例 4︰

 

MOV

A,#0FEH

LOOP:

MOV

P1,A

 

RL

A

 

CALL

DELAY   ;延時 100 毫秒

 

JMP

LOOP

其中延時 100 毫秒的子程序(xu)請自(zi)行編(bian)寫。

編(bian)   譯   、   連   接   進   入   調   試   後(hou)   ,   點   擊 Peripherals->I/O-Ports->Port  1 打開,如圖(tu) 1 所示,全速運 行xiao) 梢鑰吹醬碭魑壞墓gou)在不斷(duan)變(bian)化(如果看不到變(bian)化, 請點擊 View->Periodic Window Updata),這樣(yang)可以形象地 看出程序(xu)執行的結果。

注︰如果你看到的變(bian)化極快,甚至看不太清楚,那麼 說明你的計算(suan)機性能好,模擬執行的速度快,你可以試著 將加(jia)長延時程序(xu)的時間以放慢速度。模擬運行速度與實際 運行的速度ren)薹ㄏ嗤 shi)軟件模擬的一個固有弱點。

點擊 Peripherals->I/O-Ports->Timer0 即出現(xian)圖(tu) 2 所示 定時/計數器 0 的外(wai)圍(wei)接口(kou)界(jie)面,可以直接選擇 Mode 組中 的下拉列(lie)表以確定定時/計數工作方式,0-3 四種(zhong)工作方式,

圖(tu) 2  外(wai)圍(wei)設備之定時器


設定定時初值(zhi)等,點擊選中 TR0,status 後(hou)的 stop 就變(bian)成了 run,如果全速運行程序(xu),此時

th0,tl0 後(hou)的值(zhi)也快速地開始變(bian)化(同樣(yang)要求 Periodic Window Updata 處于選中狀態(tai)),直觀地 演示了定時/計數器的工作情況(當然,由(you)于你的程序(xu)未對(dui)此寫任(ren)何代碼,所以程序(xu)不會對(dui) 此定時/計數器的工作進行處理(li))。

2、性能分(fen)析

Keil 提(ti)供了一個性能分(fen)析工具,利用(yong)該(gai)工具,我們可以了解程序(xu)中哪些(xie)部份的執行時間 最長,調用(yong)次數最多,從而(er)了解影響整(zheng)個程序(xu)中執行速度的瓶頸。下面通過一個實例來看一 看這個工具如何使用(yong),例 5︰

#include "reg51.h"

sbit P1_0=P1^0;                       //定義(yi) P1.0

void mDelay(unsigned char DelayTime)

{     unsigned int j=0;

for(;DelayTime>0;DelayTime--)

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

}

void mDelay1(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; mDelay1(10);}

} }

編(bian)譯連接。進入調試狀態(tai)後(hou)使用(yong)菜(cai)單(dan) View->Performance Analyzer Window,打開性能分(fen) 析對(dui)話(hua)框,進入該(gai)對(dui)話(hua)框後(hou),只(zhi)有一項 unspecified,點鼠標右鍵,在快捷菜(cai)單(dan)中選擇 Setup PA 即chuang)蚩 閱芊fen)析設置對(dui)話(hua)框,對(dui)于 C 語言程序(xu),該(gai)對(dui)話(hua)框右側的“Function  Symbol”下的 列(lie)表框給出函數符號(hao),雙擊某一符號(hao),該(gai)符號(hao)即出現(xian)在 Define Performance Analyzer 下的編(bian) 緝框中xiao) mei)輸(shu)入一個符號(hao)名(ming)字,點擊 Define  按鈕,即將該(gai)函數加(jia)入其上的分(fen)析列(lie)表框。對(dui) 于匯編(bian)語言源(yuan)程序(xu),Function  Symbol  下的列(lie)表框中不會出現(xian)子程序(xu)名(ming),可以直接在編(bian)緝框 中輸(shu)入子程序(xu)名(ming),點擊 Close 關閉窗口(kou),回到性能分(fen)析窗口(kou),此時窗口(kou)共有 4 個選項。全速 執行程序(xu),可以看到 mDelay 和 mDelay1 後(hou)出現(xian)一個藍(lan)色(se)指示條,配合上面的標尺可以直觀 地看出每(mei)個函數佔整(zheng)個執行時間的比例,點擊相應(ying)的函數名(ming),可以在該(gai)窗口(kou)的狀態(tai)欄看到更 詳細的數據(ju),其中各項的含義(yi)如下︰

Min︰該(gai)段程序(xu)執行所需的最短時間;Max︰該(gai)段程序(xu)執行所需的最長時間;Avg︰該(gai) 段程序(xu)執行所花(hua)平均時間;Total︰該(gai)段程序(xu)到目前為目總(zong)共執行的時間;%︰佔整(zheng)個執行時 間的百分(fen)比;count︰被(bei)調用(yong)的次數。

本(ben)程序(xu)中xiao)  mDelay 和 mDelay1 每(mei)次被(bei)調用(yong)都花(hua)費(fei)同樣(yang)的時間,看不出 Min、Max、

和 Avg  的意義(yi),實際上,由(you)于條件的變(bian)化,某些(xie)函數執行的時間不一定是(shi)一個固定的值(zhi), 借助于這些(xie)信(xin)息,可以對(dui)程序(xu)有更詳細的了解。下面將 mDelay1 函數略作修改作一演示。

void mDelay1(unsigned char DelayTime)

{     static unsigned char k;

unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{   for(;j<k;j++)

{;}

}     k++; }

程序(xu)中定義(yi)了一個靜態(tai)變(bian)量 K,每(mei)次調用(yong)該(gai)變(bian)量kao)1,而(er) j 的循環條件與 k 的大小有關,


這使每(mei)次執行該(gai)程序(xu)所花(hua)的時間不一樣(yang)。編(bian)譯、執行該(gai)程序(xu),再(zai)次觀察性能分(fen)析窗口(kou),可以

看出 Min、Max、Avg 的意義(yi)。

3、變(bian)量來源(yuan)瀏覽(lan)

該(gai)窗口(kou)用(yong)于觀察程序(xu)中變(bian)量名(ming)的有關信(xin)息,如該(gai)變(bian)量名(ming)在那一個函數中被(bei)定義(yi)、在哪里 被(bei)調用(yong),共出現(xian)多少次等。在 Source Browse 窗口(kou)中提(ti)供了song)晟頻墓guan)理(li)方法,如過濾器可以 分(fen)門別類地列(lie)出各種(zhong)類別的變(bian)量名(ming),可以對(dui)這些(xie)變(bian)量按  Class(組)、Type(類型)、Space

(所在空間)、Use(調用(yong)次數)排序(xu),點擊變(bian)量名(ming),可以在窗口(kou)的右側看到該(gai)變(bian)量名(ming)的mu)詳細的信(xin)息。

4、代碼作用(yong)範圍(wei)分(fen)析

在你寫的程序(xu)中xiao) 行xie)代碼可能永遠不會被(bei)執行到(這是(shi)無效的代碼),也有一些(xie)代碼 必須(xu)在滿足一定條件後(hou)才(cai)能被(bei)執行到,借助于代碼範圍(wei)分(fen)析工具,可以快速地了解代碼的執 行情況。

進入調試後(hou),全速運行xiao) 緩hou)按停止按鈕,停下來後(hou),可以看到在源(yuan)程序(xu)的左列(lie)有三種(zhong) 顏(yan)色(se),灰、淡(dan)灰和綠,其中淡(dan)灰所指的行並不是(shi)可執行代碼,如變(bian)量或函數定義(yi)、注釋(shi)行等 等,而(er)灰色(se)行是(shi)可執行但(dan)從未執行過的代碼,而(er)綠色(se)則(ze)是(shi)已執行過的程序(xu)行。使用(yong)調試工具 條上的 Code Coverage Window 可打開代碼作用(yong)範圍(wei)分(fen)析的對(dui)話(hua)框,里面有各個模塊代碼執 行情況的mu) 傅姆fen)析。如果你發(fa)現(xian)全速運行後(hou)有一些(xie)未被(bei)執行到的代碼,那麼就要仔細分(fen) 析,這些(xie)代碼究竟是(shi)無效的代碼還是(shi)因(yin)為條件沒有滿足而(er)沒有被(bei)執行到。

二、部份高級調試技(ji)巧

Keil 內置了一套調試語言,很多高級調試技(ji)巧與此有關,但(dan)是(shi)全面學習這套語言並不現(xian) 實,這不是(shi)這麼幾期(qi)連載可以勝任(ren)的,這里僅(jin)介紹(shao)部份較為實用(yong)的功能,如要獲得更詳細的 信(xin)息,請參考(kao) Keil 自(zi)帶的幫助文件 GS51.PDF。

1、串行窗口(kou)與實際硬件相連

Keil 的串行窗口(kou)除(chu)可以模擬串行口(kou)的輸(shu)入和輸(shu)出功能外(wai)還可以與 PC 機上實際的串口(kou)相 連,接受串口(kou)輸(shu)入的內容,並將輸(shu)出送(song)到串口(kou)。這需要在 Keil  中進行設置。方法是(shi)首先在 輸(shu)出窗口(kou)的 Command 頁用(yong) MODE 命令設置串口(kou)的工作方式,然後(hou)用(yong) ASSIGN 命令將串行 窗口(kou)與實際的串口(kou)相關聯,下面我們通過一個實例來說明如何操作。例 6︰


ORG       0000H JMP START

ORG       3+4*8     ;串行中斷(duan)入口(kou)

JMP SER_INT START:

MOV      SP,#5FH    ;堆yan)懷跏薊/p>

CALL    SER_INIT ;串行口(kou)初始化 A SETB              EA   ;


SETB      ES   ;

JMP $                ;主(zhu)程序(xu)到此結束

SER_INT:

JBC      RI,NEXT  ; 如果串口(kou)接收(shou)到字 符,轉

JMP              SEND                     ;否(fu)則(ze)轉發(fa)送(song)處理(li)

NEXT:

MOV            A,SBUF                ;從 SBUF 中取字zhi)/p>



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

JMP   OVER SEND:

clr   ti

OVER:

reti

SER_INIT:                 ;中斷(duan)初始化

MOV                       SCON,#50H


ORL         TMOD,#20H

ORL         PCON,#80H

MOV         TH1,#0FDH ;設定波特率 SETB TR1      ;定時器 1 開始運行 SETB        REN     ;允許接收(shou)

SETB       SM2

RET END


這個程序(xu)使用(yong)了中斷(duan)方式編(bian)寫chuang) 鋅kou)輸(shu)入/輸(shu)出程序(xu),它的功能是(shi)將接串行口(kou)收(shou)到的字 符回送(song),即再(zai)通過串行口(kou)發(fa)送(song)出去(qu)。

正確輸(shu)入源(yuan)文件、建立工程、編(bian)譯連接yong)揮寫cuo)後(hou),可進行調試,使用(yong) Keil  自(zi)帶的串行 窗口(kou)測試功能是(shi)否(fu)正確,如果正確,可以進行下一步的連機試驗。

為簡單(dan)實用(yong),我們不借助于其它的硬件,而(er)是(shi)讓 PC 機上的兩個串口(kou)互換數據(ju),即 COM1 發(fa)送(song) COM2 接收(shou),而(er) COM2 發(fa)送(song)則(ze)由(you) COM1 接收(shou),為此,需要做(zuo)一根(gen)連接線將這兩個串口(kou) 連起來,做(zuo)法很簡單(dan),找兩個可以插入 PC 機串口(kou)的 DIN9 插座(母(mu)),然後(hou)用(yong)一根(gen) 3 芯線將 它們連起來,連線的方法是(shi)︰

2——3

3——2

5——5

接好線把兩個插頭分(fen)別插入 PC 機上的串口(kou) 1 與串口(kou) 2。找一個 PC 機上的串口(kou)終端調 試軟件,如串口(kou)精靈之類,運行該(gai)軟件,設置好串口(kou)參數,其中串口(kou)選擇 2,串口(kou)參數設置 為︰

19200,n,8,1 其含義(yi)是(shi)波特率為 19200,無奇偶校(xiao)驗,8 位數據(ju),1 位停止位。 在 Keil 調試yuan)翱kou)的 command 頁中輸(shu)入︰

>mode com1 19200,0,8,1

>assign com1 <sin>sout

注意兩行最前面的“>”是(shi)提(ti)示符,不要輸(shu)入,第(di)二行中的“<”和“>”即“小于”和 “大于”符號(hao),中間的是(shi)字母(mu)“s”和“input”的前兩個字母(mu),最後(hou)是(shi)字母(mu)“s”和“output” 的前三個字母(mu)。

第(di)一行命令定義(yi)串口(kou) 1 的波特率為 19200,無奇偶校(xiao)驗,8 位數據(ju),1 位停止位。第(di)二 行是(shi)將串口(kou) 1(com1)分(fen)配給串行窗口(kou)。

全速運行程序(xu),然後(hou)切換串口(kou)精靈,開始發(fa)送(song),會看到發(fa)送(song)後(hou)的數據(ju)會立即回顯到窗口(kou) 中xiao) 得饕呀郵shou)到了發(fa)送(song)過來的數據(ju)。切換到 uVison,查(cha)看chuang) 寫翱kou) 1,會看到這里的確接 收(shou)到了串口(kou)精靈送(song)來的內容。

2、從端口(kou)送(song)入信(xin)號(hao)

程序(xu)調試中如果需要有信(xin)號(hao)輸(shu)入,比如數據(ju)采集類程序(xu),需要從外(wai)界(jie)獲得數據(ju),由(you)于 Keil 的調試完全是(shi)一個軟件調試工具,沒有硬件與之相連,所以不可能直接獲得數據(ju),為此 必須(xu)采用(yong)一些(xie)替代的方法,例如,某電(dian)路用(yong) P1 口(kou)作為數據(ju)采集口(kou),那麼可以使用(yong)的一種(zhong)方 法是(shi)利用(yong)外(wai)圍(wei)接口(kou),打開 PORT 1,用(yong)鼠標在點擊相應(ying)端口(kou)位,使其變(bian)為高電(dian)平或低電(dian)平, 就能輸(shu)入數據(ju)。顯然,這種(zhong)方法對(dui)于要輸(shu)獲得數據(ju)而(er)不是(shi)作位處理(li)來說太麻煩了,另一種(zhong)方 法是(shi)直接在 command 頁輸(shu)入 port1=數值(zhi),以下是(shi)一個小小的驗證程序(xu)。例 7︰

LOOP:    MOV      A,P1


 

JZ          NEXT

MOV      R0,#55H JMP          LOOP

NEXT:    MOV      R0,#0AAH JMP        LOOP

END

該(gai)程序(xu)從 P1 口(kou)獲得數據(ju),如果 P1 口(kou)的值(zhi)是(shi) 0,那麼就讓 R0 的值(zhi)為 0AAH,否(fu)則(ze)讓 R0 的值(zhi)為 55H。輸(shu)入源(yuan)程序(xu)並建立工程,進入調試後(hou),在觀察窗口(kou)加(jia)入 R0,然後(hou)全速運行程 序(xu),注意確保  View->Periodic  Window  Updata  處于選中狀態(tai),然後(hou)在  Command  後(hou)輸(shu)入 PORT1=0 回車後(hou)可以發(fa)現(xian)觀察窗口(kou)中的 R0 的值(zhi)變(bian)成了 0AAH,然後(hou)再(zai)輸(shu)入 PORT1=1 或其 它非零值(zhi),則(ze) R0 的值(zhi)會變(bian)為 55H。

同樣(yang)的道lan)恚 梢雜yong) port0、port2、port3 分(fen)別向端口(kou) 0、2、3 輸(shu)入信(xin)號(hao)。

3、直接更改內存值(zhi)

在程序(xu)運行中xiao) 硪恢zhong)輸(shu)入數據(ju)的方法是(shi)直接更改相應(ying)的內存單(dan)元的值(zhi),例如,某數據(ju) 采集程序(xu),使用(yong) 30H 和 31H 作為存儲單(dan)元,采入的數據(ju)由(you)這兩個單(dan)元保存,那麼我們更改

了 30H 和 31H 單(dan)元的值(zhi)就相當于這個數據(ju)采集程序(xu)采集到了數據(ju),這可以在內存窗口(kou)中直 接修改(參考(kao)上一講),也可以通過命令進行修改,命令的形式是(shi)︰ _WBYTE (地址(zhi),數據(ju)),

其中地 址(zhi)是(shi) 指待寫 入內 存單(dan)元 的地 址(zhi),而(er) 數據(ju) 則(ze)是(shi)待 寫入 該(gai)地址(zhi) 的數 據(ju)。例 如

_WBYTE(0x30,11)會將值(zhi) 11 寫入內存地址(zhi)十(shi)六進制 30H 單(dan)元中。

现金购彩网官网發(fa)表評論(lun)】【告訴好友】【收(shou)藏(cang)此文】【關閉窗口(kou)

美娱彩票官网

美娱彩票官网 | 下一页