1_GOODKeil工程文件的建立、設置與目標文件的獲得_第1頁
1_GOODKeil工程文件的建立、設置與目標文件的獲得_第2頁
1_GOODKeil工程文件的建立、設置與目標文件的獲得_第3頁
1_GOODKeil工程文件的建立、設置與目標文件的獲得_第4頁
1_GOODKeil工程文件的建立、設置與目標文件的獲得_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、Keil實例教程(一)Keil工程建立及設置作者:平凡 教程來源:本站原創(chuàng) 點擊數(shù):1700 更新時間:2008-7-23 Keil工程文件的建立、設置與目標文件的獲得單片機開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機的軟件,這從近年來

2、各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選(目前在國內(nèi)你只能買到該軟件、而你買的仿真機也很可能只支持該軟件),即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)

3、境、強大的軟件仿真調(diào)試工具也會令你事半功倍。我們將通過一些實例來學習Keil軟件的使用,在這一部份我們將學習如何輸入源程序,建立工程、對工程進行詳細的設置,以及如何將源程序變?yōu)槟繕舜a。圖1所示電路圖使用89C51單片機作為主芯片,這種單片機性屬于MCS-51系列,其內(nèi)部有4K的FLASH ROM,可以反復擦寫,非常適于做實驗。89C51的P1引腳上接8個發(fā)光二極管,P3.2P3.4引腳上接4個按鈕開關,我們的第一個任務是讓接在P1引腳上的發(fā)光二極管依次循環(huán)點亮。 一、Keil工程的建立首先啟動Keil軟件的集成開發(fā)環(huán)境,這里假設讀者已正確安裝了該軟件,可以從桌面上直接雙擊uVision的圖標

4、以啟動該軟件。UVison啟動后,程序窗口的左邊有一個工程管理窗口,該窗口有3個標簽,分別是Files、Regs、和Books,這三個標簽頁分別顯示當前項目的文件結(jié)構(gòu)、CPU的寄存器及部份特殊功能寄存器的值(調(diào)試時才出現(xiàn))和所選CPU的附加說明文件,如果是第一次啟動Keil,那么這三個標簽頁全是空的。圖1 圖1 簡單的鍵盤、顯示板1、源文件的建立 使用菜單“File->New”或者點擊工具欄的新建文件按鈕,即可在項目窗口的右側(cè)打開一個新的文本編緝窗口,在該窗口中輸入以下匯編語言源程序,例1: MOV A,#0FEHMAIN: MOV P1,A RL A LCALL DELAY AJMP

5、MAINDELAY: MOV R7,#255D1: MOV R6,#255DJNZ R6,$ DJNZ R7,D1 RETEND保存該文件,注意必須加上擴展名(匯編語言源程序一般用asm或a51為擴展名),這里假定將文件保存為exam1.asm。需要說明的是,源文件就是一般的文本文件,不一定使用Keil軟件編寫,可以使用任意文本編緝器編寫,而且,Keil的編緝器對漢字的支持不好,建議使用UltraEdit之類的編緝軟件進行源程序的輸入。2、建立工程文件在項目開發(fā)中,并不是僅有一個源程序就行了,還要為這個項目選擇CPU(Keil支持數(shù)百種CPU,而這些CPU的特性并不完全相同),確定編譯、匯編、

6、連接的參數(shù),指定調(diào)試的方式,有一些項目還會有多個文件組成等,為管理和使用方便,Keil使用工程(Project)這一概念,將這些參數(shù)設置和所需的所有文件都加在一個工程中,只能對工程而不能對單一的源程序進行編譯(匯編)和連接等操作,下面我們就一步一步地來建立工程。圖3加入文件圖2選擇目標CPU點擊“Project->New Project”菜單,出現(xiàn)一個對話框,要求給將要建立的工程起一個名字,你可以在編緝框中輸入一個名字(設為exam1),不需要擴展名。點擊“保存”按鈕,出現(xiàn)第二個對話框,如圖2所示,這個對話框要求選擇目標CPU(即你所用芯片的型號),Keil支持的CPU很多,我們選擇At

7、mel公司的89C51芯片。點擊ATMEL前面的“+”號,展開該層,點擊其中的89C51,然后再點擊“確定”按鈕,回到主界面,此時,在工程窗口的文件頁中,出現(xiàn)了“Target 1”,前面有“+”號,點擊“+”號展開,可以看到下一層的“Source Group1”,這時的工程還是一個空的工程,里面什么文件也沒有,需要手動把剛才編寫好的源程序加入,點擊“Source Group1”使其反白顯示,然后,點擊鼠標右鍵,出現(xiàn)一個下拉菜單,如圖3所示。選中其中的“Add file to Group”Source Group1”,出現(xiàn)一個對話框,要求尋找源文件,注意,該對話框下面的“文件類型”默認為C so

8、urce file(*.c),也就是以C為擴展名的文件,而我們的文件是以asm為擴展名的,所以在列表框中找不到exam1.asm,要將文件類型改掉,點擊對話框中“文件類型”后的下拉列表,找到并選中“Asm Source File(*.a51,*.asm),這樣,在列表框中就可以找到exam1.asm文件了。圖2圖3 雙擊exam1.asm文件,將文件加入項目,注意,在文件加入項目后,該對話框并不消失,等待繼續(xù)加入其它文件,但初學時常會誤認為操作沒有成功而再次雙擊同一文件,這時會出現(xiàn)如圖4所示的對話框,提示你所選文件已在列表中,此時應點擊“確定”,返回前一對話框,然后點擊“Close”即可返回主

9、界面,返回后,點擊“Source Group 1”前 圖4重復加入文件的錯誤 的加號,會發(fā)現(xiàn)exam1.asm文件已在其中。雙擊文件名,即打開該源程序。圖4二、工程的詳細設置工程建立好以后,還要對工程進行進一步的設置,以滿足要求。首先點擊左邊Project窗口的Target 1,然后使用菜單“Project->Option for target target1”即出現(xiàn)對工程設置的對話框,這個對話框可謂非常復雜,共有8個頁面,要全部搞清可不容易,好在絕大部份設置項取默認值就行了。圖5對目標進行設置設置對話框中的Target頁面,如圖5所示,Xtal后面的數(shù)值是晶振頻率值,默認值是所選目標C

10、PU的最高可用頻率值,對于我們所選的AT89C51而言是24M,該數(shù)值與最終產(chǎn)生的目標代碼無關,僅用于軟件模擬調(diào)試時顯示程序執(zhí)行時間。正確設置該數(shù)值可使顯示時間與實際所用時間一致,一般將其設置成與你的硬件所用晶振頻率相同,如果沒必要了解程序執(zhí)行的時間,也可以不設,這里設置為12。圖5Memory Model用于設置RAM使用情況,有三個選擇項,Small是所有變量都在單片機的內(nèi)部RAM中;Compact是可以使用一頁外部擴展RAM,而Larget則是可以使用全部外部的擴展RAM。Code Model用于設置ROM空間的使用,同樣也有三個選擇項,即Small模式,只用低于2K的程序空間;Comp

11、act模式,單個函數(shù)的代碼量不能超過2K,整個程序可以使用64K程序空間;Larget模式,可用全部64K空間。Use on-chip ROM選擇項,確認是否僅使用片內(nèi)ROM(注意:選中該項并不會影響最終生成的目標代碼量);Operating項是操作系統(tǒng)選擇,Keil提供了兩種操作系統(tǒng):Rtx tiny和Rtx full,關于操作系統(tǒng)是另外一個很大的話題了,通常我們不使用任何操作系統(tǒng),即使用該項的默認值:None(不使用任何操作系統(tǒng));Off Chip Code memory用以確定系統(tǒng)擴展ROM的地址范圍,Off Chip xData memory組用于確定系統(tǒng)擴展RAM的地址范圍,這些選擇

12、項必須根據(jù)所用硬件來決定,由于該例是單片應用,未進行任何擴展,所以均不重新選擇,按默認值設置。設置對話框中的OutPut頁面,如圖6所示,這里面也有多個選擇項,其中Creat Hex file用于生成可執(zhí)行代碼文件(可以用編程器寫入單片機芯片的HEX格式文件,文件的擴展名為.HEX),默認情況下該項未被選中,如果要寫片做硬件實驗,就必須選中該項,這一點是初學者易疏忽的,在此特別提醒注意。選中Debug information將會產(chǎn)生調(diào)試信息,這些信息用于調(diào)試,如果需要對程序進行調(diào)試,應當選中該項。Browse information是產(chǎn)生瀏覽信息,該信息可以用菜單view->Browse

13、來查看,這里取默認值。按鈕“Select Folder for objects”是用來選擇最終的目標文件所在的文件夾,默認是與工程文件在同一個文件夾中。Name of Executable用于指定最終生成的目標文件的名字,默認與工程的名字相同,這兩項一般不需要更改。圖6圖6對輸出進行控制工程設置對話框中的其它各頁面與C51編譯選項、A51的匯編選項、BL51連接器的連接選項等用法有關,這里均取默認值,不作任何修改。以下僅對一些有關頁面中常用的選項作一個簡單介紹。Listing標簽頁用于調(diào)整生成的列表文件選項。在匯編或編譯完成后將產(chǎn)生(*.lst)的列表文件,在連接完成后也將產(chǎn)生(*.m51)的

14、列表文件,該頁用于對列表文件的內(nèi)容和形式進行細致的調(diào)節(jié),其中比較常用的選項是“C Compile Listing”下的“Assamble Code”項,選中該項可以在列表文件中生成C語言源程序所對應的匯編代碼。圖7代碼生成控制C51標簽頁用于對Keil的C51編譯器的編譯過程進行控制,其中比較常用的是“Code Optimization”組,如圖7所示,該組中Level是優(yōu)化等級,C51在對源程序進行編譯時,可以對代碼多至9級優(yōu)化,默認使用第8級,一般不必修改,如果在編譯中出現(xiàn)一些問題,可以降低優(yōu)化級別試一試。Emphasis是選擇編譯優(yōu)先方式,第一項是代碼量優(yōu)化(最終生成的代碼量小);第二項

15、是速度優(yōu)先(最終生成的代碼速度快);第三項是缺省。默認的是速度優(yōu)先,可根據(jù)需要更改。圖7設置完成后按確認返回主界面,工程文件建立、設置完畢。三、編譯、連接圖9正確編譯、連接之后的結(jié)果圖8有關編譯、連接、項目設置的工具條在設置好工程后,即可進行編譯、連接。選擇菜單Project->Build target,對當前工程進行連接,如果當前文件已修改,軟件會先對該文件進行編譯,然后再連接以產(chǎn)生目標代碼;如果選擇Rebuild All target files將會對當前工程中的所有文件重新進行編譯然后再連接,確保最終生產(chǎn)的目標代碼是最新的,而Translate .項則僅對該文件進行編譯,不進行連接

16、。以上操作也可以通過工具欄按鈕直接進行。圖8是有關編譯、設置的工具欄按鈕,從左到右分別是:編譯、編譯連接、全部重建、停止編譯和對工程進行設置。圖8編譯過程中的信息將出現(xiàn)在輸出窗口中的Build頁中,如果源程序中有語法錯誤,會有錯誤報告出現(xiàn),雙擊該行,可以定位到出錯的位置,對源程序反復修改之后,最終會得到如圖9所示的結(jié)果,提示獲得了名為exam1.hex的文件,該文件即可被編程器讀入并寫到芯片中,同時還產(chǎn)生了一些其它相關的文件,可被用于Keil的仿真與調(diào)試,這時可以進入下一步調(diào)試的工作。圖9教程錄入:平凡 責任編輯:平凡 · 上一篇教程: C語言綜合練習(2)··

17、下一篇教程: Keil的調(diào)試命令、在線匯編與斷點設置Keil的調(diào)試命令、在線匯編與斷點設置作者:平凡 教程來源:本站原創(chuàng) 點擊數(shù):2100 更新時間:2008-7-24 上 一講中我們學習了如何建立工程、匯編、連接工程,并獲得目標代碼,但是做到這一步僅僅代表你的源程序沒有語法錯誤,至于源程序中存在著的其它錯誤,必須通 過調(diào)試才能發(fā)現(xiàn)并解決,事實上,除了極簡單的程序以外,絕大部份的程序都要通過反復調(diào)試才能得到正確的結(jié)果,因此,調(diào)試是軟件開發(fā)中重要的一個環(huán)節(jié),這一 講將介紹常用的調(diào)試命令、利用在線匯編、各種設置斷點進行程序調(diào)試的方法,并通過實例介紹這些方法的使用。一、常用調(diào)試命令在對工程成功地進行

18、匯編、連接以后,按Ctrl+F5或者使用菜單Debug->Start/Stop Debug Session即可進入調(diào)試狀態(tài),Keil內(nèi)建了一個仿真CPU用來模擬執(zhí)行程序,該仿真CPU功 能強大,可以在沒有硬件和仿真機的情況下進行程序的調(diào)試,下面將要學的就是該模擬調(diào)試功能。不過在學習之前必須明確,模擬畢竟只是模擬,與真實的硬件執(zhí)行 程序肯定還是有區(qū)別的,其中最明顯的就是時序,軟件模擬是不可能和真實的硬件具有相同的時序的,具體的表現(xiàn)就是程序執(zhí)行的速度和各人使用的計算機有關,計 算機性能越好,運行速度越快。圖1調(diào)試工具條進入調(diào)試狀態(tài)后,界面與編緝狀態(tài)相比有明顯的變化,Debug菜單項中原來不能

19、用的命令現(xiàn)在已可以使用了,工具欄會多出一個用于運行和調(diào)試的工具條,如圖1所示,Debug菜單上的大部份命令可以在此找到對應的快捷按鈕,從左到右依次是復位、運行、暫停、單步、過程單步、執(zhí)行完當前子程序、運行到當前行、下一狀態(tài)、打開跟蹤、觀察跟蹤、反匯編窗口、觀察窗口、代碼作用范圍分析、1串行窗口、內(nèi)存窗口、性能分析、工具按鈕等命令。圖1 調(diào)試工具條 圖2調(diào)試窗口學 習程序調(diào)試,必須明確兩個重要的概念,即單步執(zhí)行與全速運行。全速執(zhí)行是指一行程序執(zhí)行完以后緊接著執(zhí)行下一行程序,中間不停止,這樣程序執(zhí)行的速度很 快,并可以看到該段程序執(zhí)行的總體效果,即最終結(jié)果正確還是錯誤,但如果程序有錯,則難以確認錯

20、誤出現(xiàn)在哪些程序行。單步執(zhí)行是每次執(zhí)行一行程序,執(zhí)行完 該行程序以后即停止,等待命令執(zhí)行下一行程序,此時可以觀察該行程序執(zhí)行完以后得到的結(jié)果,是否與我們寫該行程序所想要得到的結(jié)果相同,借此可以找到程序 中問題所在。程序調(diào)試中,這兩種運行方式都要用到。使用菜單STEP或相應的命令按鈕或使用快捷鍵F11可以單步執(zhí)行程序,使用菜單STEP OVER或功能鍵F10可以以過程單步形式執(zhí)行命令,所謂過程單步,是指將匯編語言中的子程序或高級語言中的函數(shù)作為一個語句來全速執(zhí)行。按下F11鍵,可以看到源程序窗口的左邊出現(xiàn)了一個黃色調(diào)試箭頭,指向源程序的第一行,如圖2所示。每按一次F11,即執(zhí)行該箭頭所指程序行,

21、然后箭頭指向下一行,當箭頭指向LCALL DELAY行時,再次按下F11,會發(fā)現(xiàn),箭頭指向了延時子程序DELAY的第一行。不斷按F11鍵,即可逐步執(zhí)行延時子程序。圖2 單步執(zhí)行通過單步執(zhí)行程序,可以找出一些問題的所在,但是僅依靠單步執(zhí)行來查錯有時是困難的,或雖能查出錯誤但效率很低,為此必須輔之以其它的方法,如本例中的延時程序是通過將D2: DJNZ R6,D2這一行程序執(zhí)行六萬多次來達到延時的目的,如果用按F11六萬多次的方法來執(zhí)行完該程序行,顯然不合適,為此,可以采取以下一些方法,第一,用鼠標在子程序的最后一行(ret)點一下,把光標定位于該行,然后用菜單Debug->Run to C

22、ursor line(執(zhí)行到光標所在行),即可全速執(zhí)行完黃色箭頭與光標之間的程序行。第二,在進入該子程序后,使用菜單Debug->Step Out of Current Function(單步執(zhí)行到該函數(shù)外),使用該命令后,即全速執(zhí)行完調(diào)試光標所在的子程序或子函數(shù)并指向主程序中的下一行程序(這里是JMP LOOP行)。第三種方法,在開始調(diào)試的,按F10而非F11,程序也將單步執(zhí)行,不同的是,執(zhí)行到lcall delay行時,按下F10鍵,調(diào)試光標不進入子程序的內(nèi)部,而是全速執(zhí)行完該子程序,然后直接指向下一行“JMP LOOP”。靈活應用這幾種方法,可以大大提高查錯的效率。二、在線匯編圖3

23、在線匯編窗口在進入Keil的調(diào)試環(huán)境以后,如果發(fā)現(xiàn)程序有錯,可以直接對源程序進行修改,但是要使修改后的代碼起作用,必須先退出調(diào)試環(huán)境,重新進行編譯、連接后再次進入調(diào)試,如果只是需要對某些程序行進行測試,或僅需對源程序進行臨時的修改,這樣的過程未免有些麻煩,為此Keil軟件提供了在線匯編的能力,將光標定位于需要修改的程序行上,用菜單Debug->Inline Assambly即可出現(xiàn)如圖3的對話框,在Enter New后面的編緝框內(nèi)直接輸入需更改的程序語句,輸入完后鍵入回車將自動指向下一條語句,可以繼續(xù)修改,如果不再需要修改,可以點擊右上角的關閉按鈕關閉窗口。圖3 在線匯編三、斷點設置程

24、序調(diào)試時,一些程序行必須滿足一定的條件才能被執(zhí)行到(如程序中某變量達到一定的值、按鍵被按下、串口接收到數(shù)據(jù)、有中斷產(chǎn)生等),這些條件往往是異步發(fā) 生或難以預先設定的,這類問題使用單步執(zhí)行的方法是很難調(diào)試的,這時就要使用到程序調(diào)試中的另一種非常重要的方法斷點設置。斷點設置的方法有多種,常 用的是在某一程序行設置斷點,設置好斷點后可以全速運行程序,一旦執(zhí)行到該程序行即停止,可在此觀察有關變量值,以確定問題所在。在程序行設置/移除斷點的方法是將光標定位于需要設置斷點的程序行,使用菜單Debug->Insert/Remove BreakPoint設置或移除斷點(也可以用鼠標在該行雙擊實現(xiàn)同樣的功

25、能);Debug->Enable/Disable Breakpoint是開啟或暫停光標所在行的斷點功能;Debug->Disable All Breakpoint暫停所有斷點;Debug->Kill All BreakPoint清除所有的斷點設置。這些功能也可以用工具條上的快捷按鈕進行設置。除了在某程序行設置斷點這一基本方法以外,Keil軟件還提供了多種設置斷點的方法,按Debug->Breakpoints即出現(xiàn)一個對話框,該對話框用于對斷點進行詳細的設置,如圖4所示。圖4中Expression后的編緝框內(nèi)用于輸入表達式,該表達式用于確定程序停止運行的條件,這里表達式的

26、定義功能非常強大,涉及到Keil內(nèi)置的一套調(diào)試語法,這里不作詳細說明,僅舉若干實例,希望讀者可以舉一反三。圖4 斷點表達式1) 在Experssion中鍵入a=0xf7,再點擊Define即定義了一個斷點, 注意,a后有兩個等號,意即相等。該表達式的含義是:如果a的值到達0xf7則停止程序運行。除使用相等符號之外,還可以使用>,>=,<,<=,!=(不等于),&(兩值按位與),&&(兩值相與)等運算符號。2) 在Experssion后中鍵入Delay再點擊Define,其含義是如果執(zhí)行標號為Delay的行則中斷。3) 圖4斷點設置對話框在Expe

27、rssion后中鍵入Delay,按Count后的微調(diào)按鈕,將值調(diào)到3,其意義是當?shù)谌螆?zhí)行到Delay時才停止程序運行。4) 在Experssion后鍵入Delay,在Command后鍵入printf(“SubRoutine Delay has been Calledn”)主程序每次調(diào)用Delay程序時并不停止運行,但會在輸出窗口Command頁輸出一行字符,即SubRoutine Delay has been Called。其中“n”的用途是回車換行,使窗口輸出的字符整齊。5) 設置斷點前先在輸出窗口的Command頁中鍵入DEFINE int I,然后在斷點設置時同4),但是Command

28、后鍵入printf(“SubRoutine Delay has been Called %d timesn”,+I),則主程序每次調(diào)用Delay時將會在Command窗口輸出該字符及被調(diào)用的次數(shù),如SubRoutine Delay has been Called 10 times。對于使用C源程序語言的調(diào)試,表達式中可以直接使用變量名,但必須要注意,設置時只能使用全局變量名和調(diào)試箭頭所指模塊中的局部變量名。四、實例調(diào)試為進行程序的調(diào)試,我們首先給源程序制造一個錯誤,將延時子程序的第三行(D2:DJNZ R6,D2)后的D2改為D1,而將下一行的D1改為D2,然后重新編譯,這樣并無語法錯誤,所以

29、不會有任何出錯提示,但由于轉(zhuǎn)移目的地出錯,所以子程序?qū)⑾萑霟o限循環(huán)中。進入調(diào)試狀態(tài)后,按F10以過程單步的形式執(zhí)行程序,當執(zhí)行到LCALL DELAY行時,程序不能繼續(xù)往下執(zhí)行,同時發(fā)現(xiàn)調(diào)試工具條上的Halt按鈕變成了紅色,說明程序在此不斷地執(zhí)行著,而我們預期這一行程序也將執(zhí)行完后停止,這個結(jié)果與預期不同,可以看出調(diào)用的子程序出了差錯。為查明出錯原因,按Halt按鈕使程序停止執(zhí)行,然后按RST按鈕使程序復位,再次按下F10單步執(zhí)行,但在執(zhí)行到LCALL DELAY行時,改按F11鍵跟蹤到子程序內(nèi)部(如果按下F11鍵沒有反應,請在源程序窗口中用鼠標點一下),單步執(zhí)行程序,可以發(fā)現(xiàn)在執(zhí)行到D2:D

30、JNZ R6,D2行時,程序不斷地從這一行轉(zhuǎn)移到上一行,同時觀察左側(cè)的寄存器的值,會發(fā)現(xiàn)R6的值始終在FFH和FEH之間變化,不會減小,而我們的預期是R6的值不斷減小,減到0后往下執(zhí)行,因此這個結(jié)果與預期不符,通過這樣的觀察,不難發(fā)現(xiàn)問題是因為標號寫錯而產(chǎn)生的,發(fā)現(xiàn)問題即可以修改,為了驗證即將進行的修改是否正確,可以先使用在線匯編功能測試一下。把光標定位于程序行D2:DJNZ R6,D1,打開在線匯編的對話框,將程序改為DJNZ R7,D2,回車后再鍵入DJNZ R6,D1,然后關閉窗口,再進行調(diào)試,發(fā)現(xiàn)程序能夠正確地執(zhí)行了,這說明修改是正確的。注意,這時候的源程序并沒有修改,此時應該退出調(diào)試

31、程序,將源程序更改過來,并重新編譯連接,以獲得正確的目標代碼。教程錄入:平凡 責任編輯:平凡 · 上一篇教程: Keil工程建立及設置·· 下一篇教程: Keil 程序調(diào)試窗口Keil 程序調(diào)試窗口作者:平凡 教程來源:本站原創(chuàng) 點擊數(shù):2720 更新時間:2008-7-24 上一講中我們學習了幾種常用的程序調(diào)試方法,這一講中將介紹Keil提供各種窗口如輸出窗口、觀察窗口、存儲器窗口、反匯編窗口、串行窗口等的用途,以及這些窗口的使用方法,并通過實例介紹這些窗口在調(diào)試中的使用。一、程序調(diào)試時的常用窗口Keil軟件在調(diào)試程序時提供了多個窗口,主要包括輸出窗口(Outp

32、ut Windows)、觀察窗口(Watch&Call Statck Windows)、存儲器窗口(Memory Window)、反匯編窗口(Dissambly Window)串行窗口(Serial Window)等。進入調(diào)試模式后,可以通過菜單View下的相應命令打開或關閉這些窗口。圖1是輸出窗口、觀察窗口和存儲器窗口,各窗口的大小可以使用鼠標調(diào)整。進入調(diào)試程序后,輸出窗口自動切換到Command頁。該頁用于輸入調(diào)試命令和輸出調(diào)試信息。對于初學者,可以暫不學習調(diào)試命令的使用方法。圖1 輸出窗口、觀察窗口和存儲器窗口 圖1調(diào)試窗口(命令窗口、存儲器窗口、觀察窗口)1、存儲器窗口 圖2存

33、儲器數(shù)值各種方式顯示選擇存儲器窗口中可以顯示系統(tǒng)中各種內(nèi)存中的值,通過在Address后的編緝框內(nèi)輸入“字母:數(shù)字”即可顯示相應內(nèi)存值,其中字母可以是C、D、I、X,分別代表代碼存儲空間、直接尋址的片內(nèi)存儲空間、間接尋址的片內(nèi)存儲空間、擴展的外部RAM空間,數(shù)字代表想要查看的地址。例如輸入D:0即可觀察到地址0開始的片內(nèi)RAM單元值、鍵入C:0即可顯示從0開始的ROM單 元中的值,即查看程序的二進制代碼。該窗口的顯示值可以以各種形式顯示,如十進制、十六進制、字符型等,改變顯示方式的方法是點鼠標右鍵,在彈出的快捷菜 單中選擇,該菜單用分隔條分成三部份,其中第一部份與第二部份的三個選項為同一級別,

34、選中第一部份的任一選項,內(nèi)容將以整數(shù)形式顯示,而選中第二部份的Ascii項則將以字符型式顯示,選中Float項將相鄰四字節(jié)組成的浮點數(shù)形式顯示、選中Double項則將相鄰8字節(jié)組成雙精度形式顯示。第一部份又有多個選擇項,其中Decimal項是一個開關,如果選中該項,則窗口中的值將以十進制的形式顯示,否則按默認的十六進制方式顯示。Unsigned和Signed后分別有三個選項:Char、Int、Long,分別代表以單字節(jié)方式顯示、將相鄰雙字節(jié)組成整型數(shù)方式顯示、將相鄰四字節(jié)組成長整型方式顯示,而Unsigned和Signed則分別代表無符號形式和有符號形式,究竟從哪一個單元開始的相鄰單元則與你的

35、設置有關,以整型為例,如果你輸入的是I:0,那么00H和01H單元的內(nèi)容將會組成一個整型數(shù),而如果你輸入的是I:1,01H和02H單元的內(nèi)容全組成一個整型數(shù),以此類推。有關數(shù)據(jù)格式與C語言規(guī)定相同,請參考C語言書籍,默認以無符號單字節(jié)方式顯示。第三部份的Modify Memory at X:xx用于更改鼠標處的內(nèi)存單元值,選中該項即出現(xiàn)如圖3所示的對話框,可以在對話框內(nèi)輸入要修改的內(nèi)容。圖2 內(nèi)存窗口圖3 修改內(nèi)存值圖3存儲器的值的修改2、工程窗口寄存器頁 圖4是工程窗口寄存器頁的內(nèi)容,寄存器頁包括了當前的工作寄存器組和系統(tǒng)寄存器,系統(tǒng)寄存器組有一些是實際存在的寄存器如A、B、DPTR、SP、

36、PSW等,有一些是實際中并不存在或雖然存在卻不能對其操作的如PC、Status等。每當程序中執(zhí)行到對某寄存器的操作時,該寄存器會以反色(藍底白字)顯示,用鼠標單擊然后按下F2鍵,即可修改該值。圖4 工程窗口寄存器3、觀察窗口圖4工程窗口寄存器頁觀察窗口是很重要的一個窗口,工程窗口中僅可以觀察到工作寄存器和有限的寄存器如A、B、DPTR等,如果需要觀察其它的寄存器的值或者在高級語言編程時需要直接觀察變量,就要借助于觀察窗口了。其它窗口將在以下的實例中介紹。一般情況下,我們僅在單步執(zhí)行時才對變量的值的變化感興趣,全速運行時,變量的值是不變的,只有在程序停下來之后,才會將這些值最新的變化反映出來,但

37、是,在一些特殊場合下我們也可能需要在全速運行時觀察變量的變化,此時可以點擊View->Periodic Window Updata(周期更新窗口),確認該項處于被選中狀態(tài),即可在全速運行時動態(tài)地觀察有關值的變化。但是,選中該項,將會使程序模擬執(zhí)行的速度變慢。二、各種窗口在程序調(diào)試中的用途以下通過一個高級語言程序來說明這些窗口的使用。例2: #include "reg51.h"sbit P1_0=P10; /定義P1.0void mDelay(unsigned char DelayTime) unsigned int j=0; for(;DelayTime>0;D

38、elayTime-) 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; 這個程序的工作過程是:不斷調(diào)用延時程序,每次延時10毫秒,然后將變量I加1,隨后對變量I進行判斷,如果I的值等于10,那么將P1.0取反,并將I清0,最終的執(zhí)行效果是P1.0每0.1S取反一次。輸入源程序并以exam2.c為文件名存盤,建立名為exam2的項目,將exam2.c加入項目,編譯、連接后按Ctrl+F5進入調(diào)試,按F10單步執(zhí)行。注意觀察窗口,其中

39、有一個標簽頁為Locals,這一頁會自動顯示當前模塊中的變量名及變量值??梢钥吹酱翱谥杏忻麨镮的變量,其值隨著執(zhí)行的次數(shù)而逐漸加大,如果在執(zhí)行到mDelay(10)行時按F11跟蹤到mDelay函數(shù)內(nèi)部,該窗口的變量自動變?yōu)镈elayTime和j。另外兩個標簽頁Watch #1和Watch #2可以加入自定義的觀察變量,點擊“type F2 to edit”然后再按F2即可輸入變量,試著在Watch #1中輸入I,觀察它的變化。在程序較復雜,變量很多的場合,這兩個自定義觀察窗口可以篩選出我們自己感興趣的變量加以觀察。觀察窗口中變量的值不僅可以觀察,還可以修改,以該程序為例,I須加10次才能到1

40、0,為快速驗證是否可以正確執(zhí)行到P1_0=!P1_0行,點擊I后面的值,再按F2,該值即可修改,將I的值改到9,再次按F10單步執(zhí)行,即可以很快執(zhí)行到P1_0=!P1_0程序行。該窗口顯示的變量值可以以十進制或十六進制形式顯示,方法是在顯示窗口點右鍵,在快捷菜單中選擇如圖5所示。圖5 設定觀察窗的顯示方式圖6反匯編窗口圖5設定觀察窗的顯示方式點擊View->Dissambly Window可以打開反匯編窗口,該窗口可以顯示反匯編后的代碼、源程序和相應反匯編代碼的混合代碼,可以在該窗口進行在線匯編、利用該窗口跟蹤已找行的代碼、在該窗口按匯編代碼的方式單步執(zhí)行,這也是一個重要的窗口。打開反匯

41、編窗口,點擊鼠標右鍵,出現(xiàn)快捷菜單,如圖6所示,其中Mixed Mode是以混合方式顯示,Assembly Mode是以反匯編碼方式顯示。程序調(diào)試中常使用設置斷點然后全速運行的方式,在斷點處可以獲得各變量值,但卻無法知道程序到達斷點以前究竟執(zhí)行了哪些代碼,而這往往是需要了解的,為此,Keil提供了跟蹤功能,在運行程序之前打開調(diào)試工具條上的允許跟蹤代碼開關,然后全速運行程序,當程序停止運行后,點擊查看跟蹤代碼按鈕,自動切換到反匯編窗口,如圖6所示,其中前面標有“-”號的行就是中斷以前執(zhí)行的代碼,可以按窗口邊的上卷按鈕向上翻查看代碼執(zhí)行記錄。k圖6 反匯編窗口 利用工程窗口可以觀察程序執(zhí)行的時間,

42、下面我們觀察一下該例中延時程序的延時時間是否滿足我們的要求,即是否確實延時10毫秒,展開工程窗口Regs頁中的Sys目錄樹,其中的Sec項記錄了從程序開始執(zhí)行到當前程序流逝的秒數(shù)。點擊RST按鈕以復位程序,Sec的值回零,按下F10鍵,程序窗口中的黃色箭頭指向mDelay(10)行,此時,記錄下Sec值為0.00038900,然后再按F10執(zhí)行完該段程序,再次查看Sec的值為0.01051200,兩者相減大約是0.01秒,所以延時時間大致是正確的。讀者可以試著將延時程序中的unsigned int改為unsigned char試試看時間是否仍正確。注意,使用這一功能的前提是在項目設置中正確設置

43、晶振的數(shù)值。Keil提供了串行窗口,我們可以直接在串行窗口中鍵入字符,該字符雖不會被顯示出來,但卻能傳遞到仿真CPU中,如果仿真CPU通過串行口發(fā)送字符,那么這些字符會在串行窗口顯示出來,用該窗口可以在沒有硬件的情況下用鍵盤模擬串口通訊。下面通過一個例子說明Keil串行窗口的應用。該程序?qū)崿F(xiàn)一個行編緝功能,每鍵入一個字母,會立即回顯到窗口中。編程的方法是通過檢測RI是否等于1來判斷串行口是否有字符輸入,如果有字符輸入,則將其送到SBUF,這個字符就會在串行窗口中顯示出來。其中ser_init是串行口初始化程序,要使用串行口,必須首先對串行口進行初始化。例3: MOV SP,#5FH ;堆棧初始

44、化CALL SER_INIT ;串行口初始化LOOP: JBC RI,NEXT ;如果串口接收到字符,轉(zhuǎn)JMP LOOP ;否則等待接收字符NEXT:MOV A,SBUF ;從SBUF中取字符MOV SBUF,A ;回送到發(fā)送SBUF中SEND: JBC TI,LOOP ;發(fā)送完成,轉(zhuǎn)LOOPJMP SEND ;否則等待發(fā)送完SER_INIT: ;中斷初始化 MOV SCON,#50H ORL TMOD,#20H ORL PCON,#80H MOV TH1,#0FDH ;設定波特率 SETB TR1 ;定時器1開始運行 SETB REN ;允許接收 SETB SM2 RET END 輸入源程序

45、,并建立項目,正確編譯、連接,進入調(diào)試后,全速運行,點擊串行窗口1按鈕,即在原源程序窗口位置出現(xiàn)一個空白窗口,擊鍵,相應的字母就會出現(xiàn)在該窗口中。在窗口中擊鼠標右鍵,出現(xiàn)一個彈出式菜單,選擇“Ascii Mode”即以Ascii碼的方式顯示接收到的數(shù)據(jù);選擇“Hex Mode”以十六進制碼方式顯示接收到的數(shù)據(jù);選擇“Clear Window”可以清除窗口中顯示的內(nèi)容。由于部份CPU具有雙串口,故Keil提供了兩個串行窗口,我們選用的89C51芯片只有一個串行口,所以Serial 2串行窗口不起作用。小技巧:凡是鼠標單擊然后按F2的地方都可以用鼠標連續(xù)單擊兩次(注意:不是雙擊)來替代。教程錄入:

46、平凡 責任編輯:平凡 · 上一篇教程: Keil的調(diào)試命令、在線匯編與斷點設置·· 下一篇教程: Keil的輔助工具和部份高級技巧Keil的輔助工具和部份高級技巧作者:平凡 教程來源:本站原創(chuàng) 點擊數(shù):2331 更新時間:2008-7-24 在前面的幾講中我們介紹了工程的建立方法,常用的調(diào)試方法,除此之外,Keil還提供了一些輔助工具如外圍接口、性能分析、變量來源分析、代碼作用分析等,幫助我們了解程的性能、查找程序中的隱藏錯誤,快速查看程序變量名信息等,這一講中將對這些功工具作一介紹,另外還將介紹Keil的部份高級調(diào)試技巧。一、 輔助工具這部份功能并不是直接用來進

47、行程序調(diào)試的,但可以幫助我們進行程序的調(diào)試、程序性能的分析,同樣是一些很有用的工具。1、外圍接口圖1外圍設備之并行端口為了能夠比較直觀地了解單片機中定時器、中斷、并行端口、串行端口等常用外設的使用情況,Keil提供了一些外圍接口對話框,通過Peripherals菜單選擇,該菜單的下拉菜單內(nèi)容與你建立項目時所選的CPU有關,如果是選擇的89C51這一類“標準”的51機,那么將會有Interrupt(中斷)、I/O Ports(并行I/O口)、Serial(串行口)、Timer(定時/計數(shù)器)這四個外圍設備菜單。打開這些對話框,列出了外圍設備的當前使用情況,各標志位的情況等,可以在這些對話框中直觀

48、地觀察和更改各外圍設備的運行情況。圖1外圍設備之并行端口下面我們通過一個簡單例子看一看并行端口的外圍設備對話框的使用。例4: MOV A,#0FEHLOOP: MOV P1,A RL A CALL DELAY ;延時100毫秒 JMP LOOP 其中延時100毫秒的子程序請自行編寫。圖2外圍設備之定時器編譯、連接進入調(diào)試后,點擊Peripherals->I/O-Ports->Port 1打開,如圖1所示,全速運行,可以看到代表各位的勾在不斷變化(如果看不到變化,請點擊View->Periodic Window Updata),這樣可以形象地看出程序執(zhí)行的結(jié)果。注:如果你看到的

49、變化極快,甚至看不太清楚,那么說明你的計算機性能好,模擬執(zhí)行的速度快,你可以試著將加長延時程序的時間以放慢速度。模擬運行速度與實際運行的速度無法相同是軟件模擬的一個固有弱點。點擊Peripherals->I/O-Ports->Timer0即出現(xiàn)圖2所示定時/計數(shù)器0的外圍接口界面,可以直接選擇Mode組中的下拉列表以確定定時/計數(shù)工作方式,0-3四種工作方式,設定定時初值等,點擊選中TR0,status后的stop就變成了run,如果全速運行程序,此時th0,tl0后的值也快速地開始變化(同樣要求Periodic Window Updata處于選中狀態(tài)),直觀地演示了定時/計數(shù)器的

50、工作情況(當然,由于你的程序未對此寫任何代碼,所以程序不會對此定時/計數(shù)器的工作進行處理)。圖2外圍設備之定時器 2、性能分析Keil提供了一個性能分析工具,利用該工具,我們可以了解程序中哪些部份的執(zhí)行時間最長,調(diào)用次數(shù)最多,從而了解影響整個程序中執(zhí)行速度的瓶頸。下面通過一個實例來看一看這個工具如何使用,例5: #include "reg51.h"sbit P1_0=P10; /定義P1.0void mDelay(unsigned char DelayTime) unsigned int j=0; for(;DelayTime>0;DelayTime-) for(j=

51、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); 編譯連接。進入調(diào)試狀態(tài)后使用菜單View->Performance Analyzer Window,打開性能分析對話框,進入該對話框后,只有一

52、項unspecified,點鼠標右鍵,在快捷菜單中選擇Setup PA即打開性能分析設置對話框,對于C語言程序,該對話框右側(cè)的“Function Symbol”下的列表框給出函數(shù)符號,雙擊某一符號,該符號即出現(xiàn)在Define Performance Analyzer下的編緝框中,每輸入一個符號名字,點擊Define按鈕,即將該函數(shù)加入其上的分析列表框。對于匯編語言源程序,F(xiàn)unction Symbol下的列表框中不會出現(xiàn)子程序名,可以直接在編緝框中輸入子程序名,點擊Close關閉窗口,回到性能分析窗口,此時窗口共有4個選項。全速執(zhí)行程序,可以看到mDelay和mDelay1后出現(xiàn)一個藍色指示條

53、,配合上面的標尺可以直觀地看出每個函數(shù)占整個執(zhí)行時間的比例,點擊相應的函數(shù)名,可以在該窗口的狀態(tài)欄看到更詳細的數(shù)據(jù),其中各項的含義如下:Min:該段程序執(zhí)行所需的最短時間;Max:該段程序執(zhí)行所需的最長時間;Avg:該段程序執(zhí)行所花平均時間;Total:該段程序到目前為目總共執(zhí)行的時間;%:占整個執(zhí)行時間的百分比;count:被調(diào)用的次數(shù)。本程序中,函數(shù)mDelay和mDelay1每次被調(diào)用都花費同樣的時間,看不出Min、Max、和Avg的意義,實際上,由于條件的變化,某些函數(shù)執(zhí)行的時間不一定是一個固定的值,借助于這些信息,可以對程序有更詳細的了解。下面將mDelay1函數(shù)略作修改作一演示。v

54、oid mDelay1(unsigned char DelayTime) static unsigned char k; unsigned int j=0; for(;DelayTime>0;DelayTime-) for(;j<k;j+) ; k+; 程序中定義了一個靜態(tài)變量K,每次調(diào)用該變量加1,而j的循環(huán)條件與k的大小有關,這使每次執(zhí)行該程序所花的時間不一樣。編譯、執(zhí)行該程序,再次觀察性能分析窗口,可以看出Min、Max、Avg的意義。3、變量來源瀏覽該窗口用于觀察程序中變量名的有關信息,如該變量名在那一個函數(shù)中被定義、在哪里被調(diào)用,共出現(xiàn)多少次等。在Source Brows

55、e窗口中提供了完善的管理方法,如過濾器可以分門別類地列出各種類別的變量名,可以對這些變量按Class(組)、Type(類型)、Space(所在空間)、Use(調(diào)用次數(shù))排序,點擊變量名,可以在窗口的右側(cè)看到該變量名的更詳細的信息。4、代碼作用范圍分析在你寫的程序中,有些代碼可能永遠不會被執(zhí)行到(這是無效的代碼),也有一些代碼必須在滿足一定條件后才能被執(zhí)行到,借助于代碼范圍分析工具,可以快速地了解代碼的執(zhí)行情況。進入調(diào)試后,全速運行,然后按停止按鈕,停下來后,可以看到在源程序的左列有三種顏色,灰、淡灰和綠,其中淡灰所指的行并不是可執(zhí)行代碼,如變量或函數(shù)定義、注釋行等等,而灰色行是可執(zhí)行但從未執(zhí)行過的代碼,而綠色則是已執(zhí)行過的程序行。使用調(diào)試工具條上的Code Coverage Window可打開代碼作用范圍分析的對話框,里面有各個模塊代碼執(zhí)行情況的更詳細的分析。如果你發(fā)現(xiàn)全速運行后有一些未被執(zhí)行到的代碼,那么就要仔細分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論