keil使用詳解
第一節(jié) 系統(tǒng)概述
本文引用地址:http://m.butianyuan.cn/article/201611/317802.htmKeil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會(huì)更加深刻。Keil C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。下面詳細(xì)介紹Keil C51開發(fā)系統(tǒng)各部分功能和使用。
第二節(jié) Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu)
C51工具包的整體結(jié)構(gòu),如圖(1)所示,其中uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及A51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。
第三節(jié) Keil C51工具包的安裝
1. C51 for Dos
在Windows下直接運(yùn)行軟件包中DOS/C51DOS.exe然后選擇安裝目錄即可。完畢后欲使系統(tǒng)正常工作須進(jìn)行以下操作(設(shè)C:/C51為安裝目錄):修改Autoexec.bat,加入path=C:/C51/BinSet C51LIB=C:/C51/LIBSet C51INC=C:/C51/INC然后運(yùn)行Autoexec.bat
2. C51 for Windows的安裝及注意事項(xiàng):
在Windows下運(yùn)行軟件包中WIN/Setup.exe,最好選擇安裝目錄與C51 for Dos相同,這樣設(shè)置最簡單(設(shè)安裝于C:/C51目錄下)。然后將軟件包中crack目錄中的文件拷入C:/C51/Bin目錄下。
第四節(jié) Keil C51工具包各部分功能及使用簡介
1. C51與A51
(1) C51
C51是C語言編譯器,其使用方法為:C51 sourcefile[編譯控制指令]或者C51 @ commandfile其中sourcefile為C源文件(.C)。大量的編譯控制指令完成C51編譯器的全部功能。包控C51輸出文件C.LST,.OBJ,.I和.SRC文件的控制。源文件(.C)的控制等,詳見第五部分的具體介紹。而Commandfile為一個(gè)連接控制文件其內(nèi)容包括:.C源文件及各編譯控制指令,它沒有固定的名字,開發(fā)人員可根據(jù)自己的習(xí)慣指定,它適于用控制指令較多的場合。
(2) A51
A51是匯編語言編譯器,使用方法為:A51 sourcefile[編譯控制指令]或A51 @ commandfile其中sourcefile為匯編源文件(.asm或.a51),而編譯控制指令的使用與其它匯編如ASM語言類似,可參考其他匯編語言材料。Commandfile同C51中的Commandfile類似,它使A51使用和修改方便。
2. L51和BL51
(1) L51
L51是Keil C51軟件包提供的連接/定位器,其功能是將編譯生成的OBJ文件與庫文件連接定位生成絕對目標(biāo)文件(.ABS),其使用方法為: L51 目標(biāo)文件列表[庫文件列表] [to outputfile] [連接控制指令]或 L51 @Commandfile源程序的多個(gè)模塊分別經(jīng)C51與A51編譯后生成多個(gè)OBJ文件,連接時(shí),這些文件全列于目標(biāo)文件列表中,作為輸入文件,如果還需與庫文件(.LiB)相連接,則庫文件也必須列在其后。outputfile為輸文件名,缺少時(shí)為第一模塊名,后綴為.ABS。連接控制指令提供了連接定位時(shí)的所有控制功能。Commandfile為連接控制文件,其具體內(nèi)容是包括了目標(biāo)文件列表,庫文件列表及輸出文件、連接控制命令,以取代第一種繁瑣的格式,由于目標(biāo)模塊庫文件大多不止1個(gè),因而第2種方法較多見,這個(gè)文件名字也可由使用者隨意指定。
(2) Bl51
BL51也是C51軟件包的連接/定位器,其具有L51的所有功能,此外它還具有以下3點(diǎn)特別之處: a. 可以連接定位大于64kBytes的程序。 b. 具有代碼域及域切換功能(CodeBanking & Bank Switching) c. 可用于RTX51操作系統(tǒng)RTX51是一個(gè)實(shí)時(shí)多任務(wù)操作系統(tǒng),它改變了傳統(tǒng)的編程模式,甚至不必用main( )函數(shù),單片機(jī)系統(tǒng)軟件向RTOS發(fā)展是一種趨勢,這種趨勢對于186和386及68K系列CPU更為明顯和必須,對8051因CPU較為簡單,程序結(jié)構(gòu)等都不太復(fù)雜,RTX51作用顯得不太突出,其專業(yè)版軟件PK51軟件包甚至不包括RTX51Full,而只有一個(gè)RTX51TINY版本的RTOS。RTX51 TINY適用于無外部RAM的單片機(jī)系統(tǒng),因而可用面很窄,在本文中不作介紹。Bank switching技術(shù)因使用很少也不作介紹。
3. DScope51,Tscope51及Monitor51
(1) dScope51
dScope51是一個(gè)源級調(diào)試器和模擬器,它可以調(diào)試由C51編譯器、A51匯編器、PL/M-51編譯器及ASM-51匯編器產(chǎn)生的程序。它不需目標(biāo)板(for windows也可通過mon51接目標(biāo)板),只能進(jìn)行軟件模擬,但其功能強(qiáng)大,可模擬CPU及其外圍器件,如內(nèi)部串口,外部I/O及定時(shí)器等,能對嵌入式軟件功能進(jìn)行有效測試。其使用方法為: DS51[debugfile][INIT(initfile)]其中debugfile是一個(gè)Hex格式的8051文件,即待調(diào)試的文件其為可選的,可在進(jìn)入dScope51后用load命令裝入。Initfile為一個(gè)初使化文件,它在啟動(dòng)dScope51后,在debugfile裝入前裝入,裝有一些dScope的初使化參數(shù)及常用調(diào)試函數(shù)等。下面是一個(gè)dScope.ini文件(for dos)的內(nèi)容: Load ../../ds51/8051.iof Map 0,0xffffdScope51 for Windows則直接用鼠標(biāo)進(jìn)入,然后用load裝入待調(diào)文件。
(2) tScope51
與dScope51不同的是Scope51必須帶目標(biāo)板,目前它可以通過兩種方式訪問目標(biāo)板。(1) 通過EMul51在線仿真器,tScope51為該仿真器準(zhǔn)備了一個(gè)動(dòng)態(tài)連接文件EMUL51.IOT,但該方法必須配合該仿真器。(2) 通過Monitov51監(jiān)控程序,這種方法是可行的,tScope51為訪問Monitor51專門帶有MON51.IOT連接程序,使用時(shí)可通過串口及監(jiān)控程序來調(diào)試目標(biāo)板。其使用方法為: TS51[INIT(file_name.ini)]其中file_name.ini為一個(gè)初使化文件。進(jìn)入TS51后,必須裝入IOT文件,可用的有MON51.IOT及EMUL51.IOT兩種,如裝入MON51.IOT:Load.C:/C51/TS51/MON51.IOT CPUTYPE(80517)可惜的是tScope51只有for Dos的版本。
(3) Monitor 51
Monitor51是一個(gè)監(jiān)控程序通過PC機(jī)的串口與目標(biāo)板進(jìn)行通信,Monitor操作需要MON51或dScope51 for Windows,后面部分將對Monitor51做較為詳細(xì)的介紹。
4. Ishell及uVision
(1) Ishell for Dos
這是一個(gè)for Dos的IDE,直接在命令行鍵入Ishell,則進(jìn)入該環(huán)境,它使用簡單方便。其命令行與DOS命令行具有同樣的功能,對單模塊的Project直接由菜單進(jìn)行編譯連接,對多模塊的project。則通過批處理,BAT文件進(jìn)行編譯連接,然后通過菜單控制由dScope51或tScope51對程序進(jìn)行調(diào)試,因?yàn)槭莊or dos的,不做太詳細(xì)介紹。
(2) uVision for Windows
uVision for Windows是一個(gè)標(biāo)準(zhǔn)的Windows應(yīng)用程序,它是C51的一個(gè)集成軟件開發(fā)平臺(tái),具有源代碼編輯、project管理、集成的make等功能,它的人機(jī)界面友好,操作方便,是開發(fā)者的首選,具體配置及使用見第五部分。
第二章 Keil C51軟件使用詳解
第一節(jié) Keil C51編譯器的控制指令
C51編譯器的控制指令分為三類:源文件控制類,目標(biāo)文件控制類及列表控制類。
1. 源文件控制類
NOEXTEND:C51源文件不允許使用ANSI C擴(kuò)展功能。DEFINE(DF):定義預(yù)處理(在C51命令行)。
2. 目標(biāo)文件(Object)控制類:
COMPACT LARGE SMALL 選編譯模式 DEBUG(DB) 包含調(diào)試信息,以供仿真器或dSCope51使用。 NOAMAKE(NOAM) 禁止AutoMake信息記錄 NOREGPARMS 禁止用寄存器傳遞參數(shù) OBJECTEXTEND(OE) Object文件包含附加變量類型信息 OPTIMIZE(OT) 指定優(yōu)化級別 REGFILE(RF) 指定一個(gè)寄存器使用的文件以供整體優(yōu)化用 REGISTERBANK(RB) 指定一個(gè)供絕對寄存器訪問的寄存器區(qū)名 SRC 不生成目標(biāo)文件只生成匯編源文件 其它控件不常用。
3. 列表文件(listing)控制類:
CODE(CD):向列表文件加入?yún)R編列表 LISTINCLUDE(LC):顯示indude文件 SYMBOLS(SB):列表文件包括模塊內(nèi)所有符號的列表 WARNINGLEVEL(WL):選擇“警告”級別
第二節(jié) dScope51的使用
1. dScope51 for Dos
總的來說dScope51具有以下特性:l 高級語言顯示模式l 集成硬件環(huán)境模擬l 單步或“GO”執(zhí)行模式l 存儲(chǔ)器、寄存器及變量訪問l Watch表達(dá)式之值l 函數(shù)與信號功能下面,具體說明在進(jìn)入dScope51 for Dos之后,如何實(shí)現(xiàn)上述功能,dScope51采用下拉菜單格式和窗口顯示控制,共有l(wèi)anguage、serial、exe、register四個(gè)窗口,其中exe為命令行窗口,language為程序窗口,serial為串口窗,register為寄存器窗。
(1) 高級語言顯示模式
單擊主菜單中的“View”,第一欄中的三條命令“Highlevel”、“Mixed”、“Assembly”分別對所裝入的程序按照“高級”、“混合級”及“匯編級”三種方式顯示,以方便調(diào)試使用。
(2) 集成硬件環(huán)境模擬顯示
主菜單中“Peripheral”各條能顯示模擬硬件環(huán)境的狀態(tài),其中:i/o Port:顯示各I/O口之值,對8031而言SFR中的P1、P2、P3、P0與引腳之值分別列出:Interrupt:顯示5個(gè)中斷源的入口模式是否允許,優(yōu)先級等中斷狀態(tài)。Timer:顯示各定時(shí)/計(jì)數(shù)器的模式,初始值狀態(tài)等。int Message:中斷信息允許,如為允許(“>>”出現(xiàn)),則當(dāng)中斷申請時(shí),顯示中斷源信息。比如當(dāng)中斷發(fā)生時(shí)會(huì)顯示: “interrupt Timer 0 occured”等 A/D converter: 顯示A/D轉(zhuǎn)換器狀態(tài)無時(shí),則提示“無”。 Serial:串口信息顯示,包括串口模式、波特產(chǎn)等 Other:其它器件,如為8031則顯示“ 無”
(3) 單步或“Go”執(zhí)行
“F8”單步執(zhí)行,“F5”全速執(zhí)行到斷點(diǎn)。或選主菜單中Trace單步執(zhí)行CPU中的Go全速執(zhí)行。
(4) 存儲(chǔ)器寄存器及變量訪問
外部存儲(chǔ)器管理MAP菜單:設(shè)置(set)、取消(reset)、顯示(Display)處理可用存儲(chǔ)空間。修改Code代碼:ASM命令存儲(chǔ)器顯示命令:D 類別為(X、D、I、B、C)修改存儲(chǔ)器命令:E 有以下幾種命令EB、EC、EI、EL、EF、EP復(fù)雜數(shù)據(jù)類型顯示:Object命令;用以顯示結(jié)構(gòu)或數(shù)組的內(nèi)容。欲使此命令有效,C51編譯器必須有DB及OBJECTEXTEND兩條。反匯編命令:U
(5) “Watch”表達(dá)式之值
在View菜單的“Watch”一欄中有四項(xiàng):其中包括定義Watch Point(Define)、刪除Watch Point(remove,kill all),及自動(dòng)更新選項(xiàng)。也可用WS、WK等命令代替,下面具體看“表達(dá)式”類型:dScope51一次最多可設(shè)16個(gè)WtchPoint表達(dá)式,顯示于Watch Window之中,表達(dá)式可以是簡單變量,也可是復(fù)雜數(shù)據(jù)類型如結(jié)構(gòu)、數(shù)組和指向結(jié)構(gòu)的指針等,例如:>WS *ptime>WS ptime→hour>WS some_record[o],analog等等
(6) 關(guān)于.IOF文件
啟動(dòng)DS51后必須裝入.IOF文件才能使CPU及Peripheral各項(xiàng)起作用,這個(gè)函數(shù)的使用是依據(jù)8051系列CPU的不同特點(diǎn),裝入8051各CPU硬件設(shè)備模擬驅(qū)動(dòng)文件,比如8031CPU就必須load DS51目錄下的8051.IOF。
2. dScope for Windows
dScope for windows具有dScope for dos的全部功能,此外,它還具有以下明顯的優(yōu)點(diǎn): (1) 標(biāo)準(zhǔn)的Windows界面,操作更容易更簡單; (2) 常用操作多用對話框,而非Dos的行命令方式; (3) 窗口資源更加豐富:存儲(chǔ)器窗口、覆蓋率分析、運(yùn)行狀態(tài)分析窗口,加強(qiáng)了調(diào)試功能;因?yàn)閐Scope for Windows功能強(qiáng)大,具體操作在第八章詳細(xì)介紹。
第三節(jié) Monitor51及其使用
1. Monitor51對硬件的要求
(1) 硬件系統(tǒng)為51系列CPU; (2) 帶5K外部程序存儲(chǔ)器(從O地址開始),存放Monitor51程序; (3) 256Bytes的外部數(shù)據(jù)存儲(chǔ)器以及5K的跟蹤緩沖區(qū),此外,外部數(shù)據(jù)存儲(chǔ)器必須足夠容納所有應(yīng)用程序代碼及數(shù)據(jù),且所有外部數(shù)據(jù)存儲(chǔ)器必須為馮·諾伊曼存儲(chǔ)器,即能一致訪問XDATA與Code空間。 (4) 一個(gè)定時(shí)器作為波特率發(fā)生器供串口使用; (5) 6 Bytes的空余堆棧。
2. Mon51的使用
Mon51的使用途徑有三種方式: (1) Dos行命令方式 即先用install對MON51進(jìn)行配置,然后用MON51進(jìn)入Monitor狀態(tài),啟用各種命令對Monitor51進(jìn)行調(diào)試。 (2) tScope51方式 啟動(dòng)tScope51裝入TS51目錄下的MON51.IOT驅(qū)動(dòng)文件,與目標(biāo)板通信。 (3) dScope51 for Windows方式 在選CPU驅(qū)動(dòng)文件時(shí),選“MON51.dll”,則檢查目標(biāo)板并進(jìn)入MON51狀態(tài)。
3. MON51的配置
(1) MON51 for Dos的配置 運(yùn)行install文件(在MON51目錄下),不同的參數(shù)可以配置不同的硬件環(huán)境。INSTALL Serialtype [xdstastart[codestart[bank][PROMCHECK]]],具體說明見MON51幫助文件或使用手冊。 (2) MON51 for Windows的配置 在啟用MON51.dll時(shí),會(huì)使得系統(tǒng)自動(dòng)檢查目標(biāo)板連接,如配置不對,則彈出“Configuration”對話框,設(shè)置PC串口,波特率等,完畢單擊“apply”有效。
4. 串口連接圖:
收發(fā)交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。
5. MON51命令及使用
詳細(xì)的MON51命令可參閱幫助。
第四節(jié) 集成開發(fā)環(huán)境(IDE)的使用
1. Ishell for Dos的使用
進(jìn)入Ishell之后看到兩個(gè)窗口:一個(gè)是文件窗口,一個(gè)是Dos命令行窗口,窗口上方是下拉式的命令菜單,其中的Files控制文件窗口的顯隱。使用Ishell,第一步就是配置系統(tǒng),即要學(xué)習(xí)兩個(gè)文件的修改與創(chuàng)建:
(1) Ishell.CFG文件
每一個(gè)project都有一個(gè)Ishell.CFG,其中存放有“Option菜單和Setup菜單下的部分信息;Bell enabled、Monochrome enabled、Editor Selected、CRT Lines、target enviroment、name of user edit、Automatic load for configuration enabled、file window enabled、file specification for file window、translate command line controls、project name等。對每個(gè)project都必須設(shè)置以上信息,然后存盤“setup”的的“save”,這樣才可正式開始下面工作。
(2) IShell.col文件
對IDE顏色設(shè)置,如不改動(dòng),可以缺省為主。
(3) CDF文件
該文件位于BIN目錄下,每一文件定義一組外部函數(shù)工具包,即定義外部環(huán)境如8051.CDF,USER.CDF等,開發(fā)者可修改CDF文件,供自己使用,至于CDF文件內(nèi)容可查看一下8051.CDF即可知道。注意.CDF文件是Ishell系統(tǒng)的核心所在,不同的CDF文件可使本IDE適用于不同的編譯、連接系統(tǒng),即本IDE并不僅適于C51。下面談一談Automake工具:C51的Automake是一個(gè)project管理器,在8051工具包中以O(shè)BJECT文件形式保留了一個(gè)project的信息,AutoMake用這些信息來進(jìn)行project管理,一旦手工建立一個(gè)project,Automake可生成一個(gè)新的OBJECT,AutoMake利用此文件來編譯那些修改過的文件。Automake支持C51、A51、L51/BL51、C166、A166、L166等編譯連接器。點(diǎn)中主菜單中的Automake即運(yùn)行本工具。Ishell for Dos使用比較繁瑣,推薦使用uVision for windows。
2. uVision for windows的使用
uVision是一個(gè)標(biāo)準(zhǔn)的windows應(yīng)用程序,其編譯功能、文件處理功能、project處理功能、窗口功能以及工具引用功能(如A51、C51、PL/M41、BL51 dScope等)等都較Ishell for Dos要強(qiáng)得多。uVision采用BL51作連接器,因?yàn)锽L51兼容L51,所以一切能在Dos下工作的project都可以到uVision中進(jìn)行連接調(diào)試。uVision采用dScope for windows作調(diào)試器,該調(diào)試器支持MON51及系統(tǒng)模擬兩種方式,功能較for DOS要強(qiáng)大好用,調(diào)試功能強(qiáng)大。注意:(1) Option菜單下的各項(xiàng)要會(huì)使用,其中A51、C51、PL/M51、BL51定義各文件所使用的編譯、連接控制指令,dScope定義一個(gè)dScope初始化文件。Make則是定義一個(gè)make文件。(2) 進(jìn)入調(diào)試是在RUN菜單下運(yùn)行dScope。(3) project中包括新建、打開、修改、更新、編譯、連接等poject處理,具體使用可參考后面的例子。
第三章 Keil C51 vs 標(biāo)準(zhǔn)C
深入理解并應(yīng)用C51對標(biāo)準(zhǔn)ANSIC的擴(kuò)展是學(xué)習(xí)C51的關(guān)鍵之一。因?yàn)榇蠖鄶?shù)擴(kuò)展功能都是直接針對8051系列CPU硬件的。大致有以下8類:l 8051存儲(chǔ)類型及存儲(chǔ)區(qū)域l 存儲(chǔ)模式l 存儲(chǔ)器類型聲明l 變量類型聲明l 位變量與位尋址l 特殊功能寄存器(SFR)l C51指針l 函數(shù)屬性具體說明如下(8031為缺省CPU)。
第一節(jié) Keil C51擴(kuò)展關(guān)鍵字
C51 V4.0版本有以下擴(kuò)展關(guān)鍵字(共19個(gè)):_at_ idata sfr16 alien interrupt smallbdata large _task_ Code bit pdatausing reentrant xdata compact sbit data sfr
第二節(jié) 內(nèi)存區(qū)域(Memory Areas):
1. Pragram Area:
由Code說明可有多達(dá)64kBytes的程序存儲(chǔ)器
2. Internal Data Memory:
內(nèi)部數(shù)據(jù)存儲(chǔ)器可用以下關(guān)鍵字說明:data:直接尋址區(qū),為內(nèi)部RAM的低128字節(jié) 00H~7FHidata:間接尋址區(qū),包括整個(gè)內(nèi)部RAM區(qū) 00H~FFHbdata:可位尋址區(qū), 20H~2FH
3. External Data Memory
外部RAM視使用情況可由以下關(guān)鍵字標(biāo)識:xdata:可指定多達(dá)64KB的外部直接尋址區(qū),地址范圍0000H~0FFFFHpdata:能訪問1頁(25bBytes)的外部RAM,主要用于緊湊模式(Compact Model)。
4. Speciac Function Register Memory
8051提供128Bytes的SFR尋址區(qū),這區(qū)域可位尋址、字節(jié)尋址或字尋址,用以控制定時(shí)器、計(jì)數(shù)器、串口、I/O及其它部件,可由以下幾種關(guān)鍵字說明:sfr:字節(jié)尋址 比如 sfr P0=0x80;為PO口地址為80H,“=”后H~FFH之間的常數(shù)。sfr16:字尋址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCDsbit:位尋址,如sbit EA=0xAF;指定第0xAF位為EA,即中斷允許還可以有如下定義方法:sbit 0V=PSW^2;(定義0V為PSW的第2位)sbit 0V=0XDO^2;(同上)或bit 0V-=0xD2(同上)。
第三節(jié) 存儲(chǔ)模式
存儲(chǔ)模式?jīng)Q定了沒有明確指定存儲(chǔ)類型的變量,函數(shù)參數(shù)等的缺省存儲(chǔ)區(qū)域,共三種:
1. Small模式
所有缺省變量參數(shù)均裝入內(nèi)部RAM,優(yōu)點(diǎn)是訪問速度快,缺點(diǎn)是空間有限,只適用于小程序。
2. Compact模式
所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由P2口指定,在STARTUP.A51文件中說明,也可用pdata指定,優(yōu)點(diǎn)是空間較Small為寬裕速度較Small慢,較large要快,是一種中間狀態(tài)。
3. large模式
所有缺省變量可放在多達(dá)64KB的外部RAM區(qū),優(yōu)點(diǎn)是空間大,可存變量多,缺點(diǎn)是速度較慢。提示:存儲(chǔ)模式在C51編譯器選項(xiàng)中選擇。
第四節(jié) 存儲(chǔ)類型聲明
變量或參數(shù)的存儲(chǔ)類型可由存儲(chǔ)模式指定缺省類型,也可由關(guān)鍵字直接聲明指定。各類型分別用:code,data,idata,xdata,pdata說明,例:data uar1char code array[ ]=“hello!”;unsigned char xdata arr[10][4][4];
第五節(jié) 變量或數(shù)據(jù)類型
C51提供以下幾種擴(kuò)展數(shù)據(jù)類型:bit 位變量值為0或1sbit 從字節(jié)中定義的位變量 0或1sfr sfr字節(jié)地址 0~255sfr16 sfr字地址 0~65535其余數(shù)據(jù)類型如:char,enum,short,int,long,float等與ANSI C相同。
第六節(jié) 位變量與聲明
1. bit型變量
bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM20H~2FH。注意:(1) 用#pragma disable說明函數(shù)和用“usign”指定的函數(shù),不能返回bit值。(2) 一個(gè)bit變量不能聲明為指針,如bit *ptr;是錯(cuò)誤的(3) 不能有bit數(shù)組如:bit arr[5];錯(cuò)誤。
2. 可位尋址區(qū)說明20H-2FH
可作如下定義:int bdata i;char bdata arr[3],然后:sbit bito=in0;sbit bit15=I^15;sbit arr07=arr[0]^7;sbit arr15=arr[i]^7;
第七節(jié) Keil C51指針
C51支持一般指針(Generic Pointer)和存儲(chǔ)器指針(Memory_Specific Pointer).
1. 一般指針
一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時(shí)還可以說明指針的存儲(chǔ)類型,例如:long * state;為一個(gè)指向long型整數(shù)的指針,而state本身則依存儲(chǔ)模式存放。char * xdata ptr;ptr為一個(gè)指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲(chǔ)器中。一般指針本身用3個(gè)字節(jié)存放,分別為存儲(chǔ)器類型,高位偏移,低位偏移量。
2. 存儲(chǔ)器指針
基于存儲(chǔ)器的指針說明時(shí)即指定了存貯類型,例如:char data * str;str指向data區(qū)中char型數(shù)據(jù)int xdata * pow; pow指向外部RAM的int型整數(shù)。這種指針存放時(shí),只需一個(gè)字節(jié)或2個(gè)字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?/p>
3. 指針轉(zhuǎn)換
即指針在上兩種類型之間轉(zhuǎn)化:l 當(dāng)基于存儲(chǔ)器的指針作為一個(gè)實(shí)參傳遞給需要一般指針的函數(shù)時(shí),指針自動(dòng)轉(zhuǎn)化。l 如果不說明外部函數(shù)原形,基于存儲(chǔ)器的指針自動(dòng)轉(zhuǎn)化為一般指針,導(dǎo)致錯(cuò)誤,因而請用“#include”說明所有函數(shù)原形。l 可以強(qiáng)行改變指針類型。
第八節(jié) Keil C51函數(shù)
C51函數(shù)聲明對ANSI C作了擴(kuò)展,具體包括:
1. 中斷函數(shù)聲明:
中斷聲明方法如下:void serial_ISR () interrupt 4 [using 1]{/* ISR */}為提高代碼的容錯(cuò)能力,在沒用到的中斷入口處生成iret語句,定義沒用到的中斷。/* define not used interrupt, so generate "IRET" in their entrance */void extern0_ISR() interrupt 0{} /* not used */void timer0_ISR () interrupt 1{} /* not used */void extern1_ISR() interrupt 2{} /* not used */void timer1_ISR () interrupt 3{} /* not used */void serial_ISR () interrupt 4{} /* not used */
2. 通用存儲(chǔ)工作區(qū)
3. 選通用存儲(chǔ)工作區(qū)由using x聲明,見上例。
4. 指定存儲(chǔ)模式
由small compact 及l(fā)arge說明,例如:void fun1(void) small { }提示:small說明的函數(shù)內(nèi)部變量全部使用內(nèi)部RAM。關(guān)鍵的經(jīng)常性的耗時(shí)的地方可以這樣聲明,以提高運(yùn)行速度。
5. #pragma disable
在函數(shù)前聲明,只對一個(gè)函數(shù)有效。該函數(shù)調(diào)用過程中將不可被中斷。
6. 遞歸或可重入函數(shù)指定
在主程序和中斷中都可調(diào)用的函數(shù),容易產(chǎn)生問題。因?yàn)?1和PC不同,PC使用堆棧傳遞參數(shù),且靜態(tài)變量以外的內(nèi)部變量都在堆棧中;而51一般使用寄存器傳遞參數(shù),內(nèi)部變量一般在RAM中,函數(shù)重入時(shí)會(huì)破壞上次調(diào)用的數(shù)據(jù)??梢杂靡韵聝煞N方法解決函數(shù)重入:a、在相應(yīng)的函數(shù)前使用前述“#pragma disable”聲明,即只允許主程序或中斷之一調(diào)用該函數(shù);b、將該函數(shù)說明為可重入的。如下:void func(param...) reentrant;KeilC51編譯后將生成一個(gè)可重入變量堆棧,然后就可以模擬通過堆棧傳遞變量的方法。由于一般可重入函數(shù)由主程序和中斷調(diào)用,所以通常中斷使用與主程序不同的R寄存器組。另外,對可重入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“#pragma noaregs”,以禁止編譯器使用絕對寄存器尋址,可生成不依賴于寄存器組的代碼。
7. 指定PL/M-51函數(shù)
由alien指定。
第四章 Keil C51高級編程
本章討論以下內(nèi)容:l 絕對地址訪問l C與匯編的接口l C51軟件包中的通用文件l 段名轉(zhuǎn)換與程序優(yōu)化
第一節(jié) 絕對地址訪問
C51提供了三種訪問絕對地址的方法:
1. 絕對宏:
在程序中,用“#include”即可使用其中定義的宏來訪問絕對地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具體使用可看一看absacc.h便知例如:rval=CBYTE[0x0002];指向程序存貯器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址
2. _at_關(guān)鍵字
直接在數(shù)據(jù)定義后加上_at_ const即可,但是注意:(1)絕對變量不能被初使化;(2)bit型函數(shù)及變量不能用_at_指定。例如:idata struct link list _at_ 0x40;指定list結(jié)構(gòu)從40h開始。xdata char text[25b] _at_0xE000;指定text數(shù)組從0E000H開始提示:如果外部絕對變量是I/O端口等可自行變化數(shù)據(jù),需要使用volatile關(guān)鍵字進(jìn)行描述,請參考absacc.h。
3. 連接定位控制
此法是利用連接控制指令code xdata pdata /data bdata對“段”地址進(jìn)行,如要指定某具體變量地址,則很有局限性,不作詳細(xì)討論。
第二節(jié) Keil C51與匯編的接口
1. 模塊內(nèi)接口
方法是用#pragma語句具體結(jié)構(gòu)是:#pragma asm匯編行#pragma endasm這種方法實(shí)質(zhì)是通過asm與ndasm告訴C51編譯器中間行不用編譯為匯編行,因而在編譯控制指令中有SRC以控制將這些不用編譯的行存入其中。
2. 模塊間接口
C模塊與匯編模塊的接口較簡單,分別用C51與A51對源文件進(jìn)行編譯,然后用L51將obj文件連接即可,關(guān)鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞問題,C51中有兩種參數(shù)傳遞方法。(1) 通過寄存器傳遞函數(shù)參數(shù)最多只能有3個(gè)參數(shù)通過寄存器傳遞,規(guī)律如下表:
參數(shù)數(shù)目 | char | int | long,float | 一般指針 |
123 | R7R5R3 | R6 & R7R4 & R5R2 & R3 | R4~R7R4~R7 | R1~R3R1~R3R1~R3 |
return type | Registev | 說明 |
bit | 標(biāo)志位 | 由具體標(biāo)志位返回 |
char/unsigned char 1_byte指針 | R7 | 單字節(jié)由R7返回 |
int/unsigned int 2_byte指針 | R6 & R7 | 雙字節(jié)由R6和R7返回,MSB在R6 |
long&unsigned long | R4~R7 | MSB在R4, LSB在R7 |
float | R4~R7 | 32Bit IEEE格式 |
一般指針 | R1~R3 | 存儲(chǔ)類型在R3 高位R2 低R1 |
第三節(jié) Keil C51軟件包中的通用文件
在C51/LiB目錄下有幾個(gè)C源文件,這幾個(gè)C源文件有非常重要的作用,對它們稍事修改,就可以用在自己的專用系統(tǒng)中。
1. 動(dòng)態(tài)內(nèi)存分配
init_mem.C:此文件是初始化動(dòng)態(tài)內(nèi)存區(qū)的程序源代碼。它可以指定動(dòng)態(tài)內(nèi)存的位置及大小,只有使用了init_mem( )才可以調(diào)回其它函數(shù),諸如malloc calloc,realloc等。calloc.c:此文件是給數(shù)組分配內(nèi)存的源代碼,它可以指定單位數(shù)據(jù)類型及該單元數(shù)目。malloc.c:此文件是malloc的源代碼,分配一段固定大小的內(nèi)存。realloc.c:此文件是realloc.c源代碼,其功能是調(diào)整當(dāng)前分配動(dòng)態(tài)內(nèi)存的大小。
2. C51啟動(dòng)文件STARTUP.A51
啟動(dòng)文件STARTUP.A51中包含目標(biāo)板啟動(dòng)代碼,可在每個(gè)project中加入這個(gè)文件,只要復(fù)位,則該文件立即執(zhí)行,其功能包括:l 定義內(nèi)部RAM大小、外部RAM大小、可重入堆棧位置l 清除內(nèi)部、外部或者以此頁為單元的外部存儲(chǔ)器l 按存儲(chǔ)模式初使化重入堆棧及堆棧指針l 初始化8051硬件堆棧指針l 向main( )函數(shù)交權(quán)開發(fā)人員可修改以下數(shù)據(jù)從而對系統(tǒng)初始化 常數(shù)名 意義IDATALEN 待清內(nèi)部RAM長度XDATA START 指定待清外部RAM起始地址XDATALEN 待清外部RAM長度IBPSTACK 是否小模式重入堆棧指針需初始化標(biāo)志,1為需要。缺省為0IBPSTACKTOP 指定小模式重入堆棧頂部地址XBPSTACK 是否大模式重入堆棧指針需初始化標(biāo)志,缺省為0XBPSTACKTOP 指定大模式重入堆棧頂部地址PBPSTACK 是否Compact重入堆棧指針,需初始化標(biāo)志,缺省為0PBPSTACKTOP 指定Compact模式重入堆棧頂部地址PPAGEENABLE P2初始化允許開關(guān)PPAGE 指定P2值PDATASTART 待清外部RAM頁首址PDATALEN 待清外部RAM頁長度提示:如果要初始化P2作為緊湊模式高端地址,必須:PPAGEENAGLE=1,PPAGE為P2值,例如指定某頁1000H-10FFH,則PPAGE=10H,而且連接時(shí)必須如下:L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一個(gè)值。以下是STARTUP.A51代碼片斷,紅色是經(jīng)??赡苄枰薷牡牡胤剑?------------------------------------------------------------------------------; This file is part of the C51 Compiler package; Copyright KEIL ELEKTRONIK GmbH 1990;------------------------------------------------------------------------------; STARTUP.A51: This code is executed after processor reset.;; To translate this file use A51 with the following invocation:;; A51 STARTUP.A51;; To link the modified STARTUP.OBJ file to your application use the following; L51 invocation:;; L51
3. 標(biāo)準(zhǔn)輸入輸出文件
putchar.cputchar.c是一個(gè)低級字符輸出子程,開發(fā)人員可修改后應(yīng)用到自己的硬件系統(tǒng)上,例如向CLD或LEN輸出字符。缺省:putchar.c是向串口輸出一個(gè)字符XON|XOFF是流控標(biāo)志,換行符“/*n”自動(dòng)轉(zhuǎn)化為回車/換行“/r/n”。getkey.cgetkey函數(shù)是一個(gè)低級字符輸入子程,該程序可用到自己硬件系統(tǒng),如矩陣鍵盤輸入中,缺省時(shí)通過串口輸入字符。
4. 其它文件
還包括對Watch-Dog有獨(dú)特功能的INIT.A51函數(shù)以及對8×C751適用的函數(shù),可參考源代碼。
第四節(jié) 段名協(xié)定與程序優(yōu)化
1. 段名協(xié)定(Segment Naming Conventions)
C51編譯器生成的目標(biāo)文件存放于許多段中,這些段是代碼空間或數(shù)據(jù)空間的一些單元,一個(gè)段可以是可重定位的,也可以是絕對段,每一個(gè)可重定位的段都有一個(gè)類型和名字,C51段名有以下規(guī)定:每個(gè)段名包括前綴與模塊名兩部分,前綴表示存儲(chǔ)類型,模塊名則是被編譯的模塊的名字,例如:?CO?main1 :表示main1模塊中的代碼段中的常數(shù)部分?PR?function1?module 表module模塊中函數(shù)function1的可執(zhí)行段,具體規(guī)定參閱手冊。
2. 程序優(yōu)化
C51編譯器是一個(gè)具有優(yōu)化功能的編譯器,它共提供六級優(yōu)化功能。確保生成目標(biāo)代碼的最高效率(代碼最少,運(yùn)行速度最快)。具體六級優(yōu)化的內(nèi)容可參考幫助。在C51中提供以下編譯控制指令控制代碼優(yōu)化:OPTIMIZE(SJXE):盡量采用子程序,使程序代碼減少。NOAREGS:不使用絕對寄存器訪問,程序代碼與寄存器段獨(dú)立。NOREGPARMS:參數(shù)傳遞總是在局部數(shù)據(jù)段實(shí)現(xiàn),程序代碼與低版本C51兼容。OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6級優(yōu)化功能,缺省為: OPTIMIZE(6,SPEED)。
第五章 Keil C51庫函數(shù)參考
C51強(qiáng)大功能及其高效率的重要體現(xiàn)之一在于其豐富的可直接調(diào)用的庫函數(shù),多使用庫函數(shù)使程序代碼簡單,結(jié)構(gòu)清晰,易于調(diào)試和維護(hù),下面介紹C51的庫函數(shù)系統(tǒng)。
第一節(jié) 本征庫函數(shù)(intrinsic routines)和非本征證庫函數(shù)
C51提供的本征函數(shù)是指編譯時(shí)直接將固定的代碼插入當(dāng)前行,而不是用ACALL和LCALL語句來實(shí)現(xiàn),這樣就大大提供了函數(shù)訪問的效率,而非本征函數(shù)則必須由ACALL及LCALL調(diào)用。C51的本征庫函數(shù)只有9個(gè),數(shù)目雖少,但都非常有用,列如下:_crol_,_cror_:將char型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回_iror_,_irol_:將int型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回_lrol_,_lror_:將long型變量循環(huán)向左(右)移動(dòng)指定位數(shù)后返回_nop_: 相當(dāng)于插入NOP_testbit_: 相當(dāng)于JBC bitvar測試該位變量并跳轉(zhuǎn)同時(shí)清除。_chkfloat_: 測試并返回源點(diǎn)數(shù)狀態(tài)。使用時(shí),必須包含#inclucle
第二節(jié) 幾類重要庫函數(shù)
1. 專用寄存器include文件
例如8031、8051均為REG51.h其中包括了所有8051的SFR及其位定義,一般系統(tǒng)都必須包括本文件。
2. 絕對地址include文件absacc.h
該文件中實(shí)際只定義了幾個(gè)宏,以確定各存儲(chǔ)空間的絕對地址。
3. 動(dòng)態(tài)內(nèi)存分配函數(shù),位于stdlib.h中
4. 緩沖區(qū)處理函數(shù)位于“string.h”中
其中包括拷貝比較移動(dòng)等函數(shù)如:memccpy memchr memcmp memcpy memmove memset這樣很方便地對緩沖區(qū)進(jìn)行處理。
5. 輸入輸出流函數(shù),位于“stdio.h”中
流函數(shù)通8051的串口或用戶定義的I/O口讀寫數(shù)據(jù),缺省為8051串口,如要修改,比如改為LCD顯示,可修改lib目錄中的getkey.c及putchar.c源文件,然后在庫中替換它們即可。
第三節(jié) Keil C51庫函數(shù)原型列表
1. CTYPE.H
bit isalnum(char c); bit isalpha(char c); bit iscntrl(char c); bit isdigit(char c); bit isgraph(char c); bit islower(char c); bit isprint(char c); bit ispunct(char c); bit isspace(char c); bit isupper(char c); bit isxdigit(char c); bit toascii(char c); bit toint(char c); char tolower(char c); char __tolower(char c); char toupper(char c); char __toupper(char c);
2. INTRINS.H
unsigned char _crol_(unsigned char c,unsigned char b); unsigned char _cror_(unsigned char c,unsigned char b); unsigned char _chkfloat_(float ual); unsigned int _irol_(unsigned int i,unsigned char b); unsigned int _iror_(unsigned int i,unsigned char b); unsigned long _irol_(unsigned long l,unsigned char b); unsigned long _iror_(unsigned long L,unsigned char b); void _nop_(void); bit _testbit_(bit b);
3. STDIO.H
char getchar(void); char _getkey(void); char *gets(char * string,int len); int printf(const char * fmtstr[,argument]…); char putchar(char c); int puts (const char * string); int scanf(const char * fmtstr.[,argument]…); int sprintf(char * buffer,const char *fmtstr[;argument]); int sscanf(char *buffer,const char * fmtstr[,argument]); char ungetchar(char c); void vprintf (const char *fmtstr,char * argptr); void vsprintf(char *buffer,const char * fmtstr,char * argptr);
4. STDLIB.H
float atof(void * string); int atoi(void * string); long atol(void * string); void * calloc(unsigned int num,unsigned int len); void free(void xdata *p); void init_mempool(void *data *p,unsigned int size); void *malloc (unsigned int size); int rand(void); void *realloc (void xdata *p,unsigned int size); void srand (int seed);
5. STRING.H
void *memccpy (void *dest,void *src,char c,int len); void *memchr (void *buf,char c,int len); char memcmp(void *buf1,void *buf2,int len); void *memcopy (void *dest,void *SRC,int len); void *memmove (void *dest,void *src,int len); void *memset (void *buf,char c,int len); char *strcat (char *dest,char *src); char *strchr (const char *string,char c); char strcmp (char *string1,char *string2); char *strcpy (char *dest,char *src); int strcspn(char *src,char * set); int strlen (char *src); char *strncat (char 8dest,char *src,int len); char strncmp(char *string1,char *string2,int len); char strncpy (char *dest,char *src,int len); char *strpbrk (char *string,char *set); int strpos (const char *string,char c); char *strrchr (const char *string,char c); char *strrpbrk (char *string,char *set); int strrpos (const char *string,char c); int strspn(char *string,char *set);
第六章 Keil C51例子:Hello.c
Hello位于/C51/excmples/Hello/目錄,其功能是向串口輸出“Hello,world”整個(gè)程序如下:#pragma DB OE CD#indule
第一節(jié) uVision for Windows的使用步驟
(1) file_new新建一個(gè)hello.c文件,輸入如上內(nèi)容或直接用目錄下源文件。(2) file_save或工具欄將文件存盤。(3) project_new project創(chuàng)建一個(gè)project名為hello,并在其中加入hello.c。這時(shí)該project已是打開狀態(tài),或用open project打開已存在的project。(4) option_C51 compiler中選出至少包括兩項(xiàng)DB OE。(5) option_dscope Debugger選中hello/DS51.INI查看DS51.INI看其是否為: “load…/…/BIN/8051.DLL map 0, 0xffff”否則修改。(6) 在option_make選make文件順序。(7) project選Build project,看是否有語法錯(cuò)誤,若無則生成HEX文件,若有則修改源文件后重復(fù)以上部分步驟。(8) run_dScope debugger進(jìn)入dScope51后裝入hello則可用go直接運(yùn)行看serial窗口有無輸出,正常每系統(tǒng)運(yùn)行一次,serial窗口均出現(xiàn)一個(gè)“Hello,world”表明運(yùn)行無誤。
第二節(jié) Ishell for Dos使用步驟
(1) 進(jìn)入Ishell 用Setup editer選擇編輯器。然后單擊Edit或用Edit命令編輯hello.c源文件,存盤,也可以在files窗口中直接選中hello.c。(2) 用cd改換project目錄至hello目錄。(3) 在setup_target一項(xiàng)目選8051。(4) 在setup_C51中輸出DB OE。(5) 在setup_project輸入project名hello。(6) 在setup_save保存Ishell.CFG文件。(7) 編輯一個(gè)Link文件hello.lin中有“hell.obj”一行。(8) 由光標(biāo)落在files菜單中的Hello.c上,單擊“translate”,如無語法錯(cuò),再擊“link”,則Hex文件生成。(9) 單擊Simulate如在8051.CDF中選Simulate為dScope則進(jìn)入dScope調(diào)試直接“Go”,看serial窗口輸出為“Hello.world”。(10) 如程序有誤修改源代碼后不必再translate或link了,只要一步Amake即可。若project中包括不止一個(gè)文件,在DOS的Ishell中不能用Translate編譯,而應(yīng)建立bat文件,直接在命令窗編譯,然后link連接。如還需用Translate則只能多個(gè)文件分別編譯,然后連接。
第七章 Keil C51的代碼效率
C51程序編譯生成匯編代碼的效率,是由許多因素共同決定的,對于Keil C51,主要受以下兩種因素影響:
第一節(jié) 存儲(chǔ)模式的影響
存儲(chǔ)模式?jīng)Q定了缺省變量的存儲(chǔ)空間,而訪問各空間變量的匯編代碼的繁簡程度決定了代碼率的高低。例如:一個(gè)整形變量i,如放于內(nèi)存18H、19H空間,則++i的操作編譯成四條語句:INC 0x19MOV A,0x19JNZ 0x272DINC 0x180x272D:而如果放于外存空間0000H、0001H則++i的操作編譯成九條語句:MOV DPTR,0001MOVX A,@ DPTRINC AMOVX @ DPTR,AJNz #5MOV OPTR,#0000MOVX A,@DPTRINC AMOVX @ DPTR,A就匯編之后的語句而言,對外部存儲(chǔ)器的操作較內(nèi)部存儲(chǔ)器操作代碼率要低得多,生成的語句為內(nèi)存的兩倍以上,而程序中有大量的這種操作,可見存儲(chǔ)模式對代碼率的響了。因此程序設(shè)計(jì)的原則是1、存儲(chǔ)模式從small-Compact-large依次選擇,實(shí)在是變量太多,才選large模式。2、即使選擇了large模式,對一些常用的局部的或者可放于內(nèi)存中的變量,最好放于內(nèi)存中,以盡量提高程序的代碼率。
第二節(jié) 程序結(jié)構(gòu)的影響
程序的結(jié)構(gòu)單元包括模塊、函數(shù)等等。同樣的功能,如果結(jié)構(gòu)越復(fù)雜,其所涉及的操作、變量、功能模塊函數(shù)等就越多,較之結(jié)構(gòu)性好,代碼簡單的程序其代碼率自然就低得多。此外程序的運(yùn)行控制語句,也是影響代碼率的關(guān)鍵因素,例如:switch -case語句,許多編譯器都把它們譯得非常復(fù)雜,Keil C51也不例外,相對較為簡易的Switch-case語句,編譯成跳轉(zhuǎn)指令形式,代碼率較高,但對較為復(fù)雜的Switch-Case,則要調(diào)用一個(gè)系統(tǒng)庫函數(shù)?C?ICASE進(jìn)行處理,非常復(fù)雜。再如if( ),while( ),等語句也是代碼相對較低的語句,但編譯以后比switch-case要高得多。因此建議設(shè)計(jì)者盡量少用switch-case之類語句來控制程序結(jié)構(gòu),以提高代碼率。除以上兩點(diǎn)外,其它因素也會(huì)對代碼率產(chǎn)生影響,例如:是否用寄存器傳遞參數(shù) 即NOAREGS選項(xiàng)是否有是否包括調(diào)試信息:即DEBUG選項(xiàng)是否包括擴(kuò)展的調(diào)試信息:即BJECTEXTEND
第八章 dScope for Windows使用詳解
第一節(jié) 概述
1. 主窗口(Mainframe Window)
可設(shè)置其它各種調(diào)試窗口,設(shè)置斷點(diǎn)、觀察點(diǎn),修改地址空間,加載文件等等;
2. 調(diào)試窗口(DEBUG Window)
支持用戶程序的各種顯示方式,可連續(xù)運(yùn)行,單步運(yùn)行用戶程序,并可在線 匯編;
3. 命令窗口(Command Window)
支持命令行的輸入;
4. 觀察窗口(Watch Window)
可設(shè)置所要觀察的變量、表達(dá)式等;
5. 寄存器窗口(Registe Window)
顯示內(nèi)部寄存器的內(nèi)容,程序運(yùn)行次數(shù)等;
6. 串口窗口(Serical Windows)
顯示串口接收和發(fā)送的數(shù)據(jù);
7. 性能分析窗口
顯示所要觀察的各程序段占用CPU的空間;
8. 內(nèi)存窗口(Memory Window)
顯示所選擇的內(nèi)存中的數(shù)據(jù);
9. 符號瀏覽窗口(Symbol Browser Window)
顯示各種符號名稱,包括專有符號,用戶自定義符號(函數(shù)名、變量、標(biāo)號)等;
10. 調(diào)用線窗口(Call-Stack Window)
動(dòng)態(tài)顯示當(dāng)前執(zhí)行的程序段的函數(shù)調(diào)用關(guān)系;
11. 代碼覆蓋窗口
提供當(dāng)前模塊內(nèi)各程序段中被執(zhí)行代碼的比率;。
12. 外圍設(shè)備窗口(peripherals)
可顯示I/O口,定時(shí)器,中斷,串口等外圍設(shè)備狀態(tài);
第二節(jié) dScope for Windows基本操作
1. 指定初始化文件
在uVision的Option菜單dScope Debugger中指定dScope的初始化文件,用uVision的RUN啟動(dòng)dScope將自動(dòng)加載此初始化文件,自動(dòng)執(zhí)行其中命令;下面是一個(gè)例子,可以看出調(diào)入一個(gè)調(diào)試代碼的過程。Ds51.ini:load 8051.dllload testslog>>test.logxtal=11.0592define button "go to main","g,main"ws RevCounterws rm.rg,mainPA RESETPA serialPA timer0
2. 觀察變量
方法1:命令行WS expression [, numberbase ] [ LINE ]其中numberbase為顯示數(shù)制,10對應(yīng)10進(jìn)制,16對應(yīng)16進(jìn)制,缺省為16進(jìn)制。LINE為單行顯示,缺省為多行顯示。方法2:setup->Watchpoints,在對話框中輸入變量
3. 顯示RAM的值
d i(x,d):起始地址,終止地址d 變量名
4. 觀察堆棧
View->Call-stack->Show invocation,可以跟蹤調(diào)用過程;
5. 中斷處理程序調(diào)試
在裝入8051.dll后,在dScope的主菜單中將增加Peripherial,其有4個(gè)字菜單:I/0 port:Pi端口狀態(tài)Interrupt:中斷設(shè)置Timer:定時(shí)器中斷狀態(tài)Serial:串口中斷狀態(tài)設(shè)置相應(yīng)的中斷請求標(biāo)志位即可產(chǎn)生中斷。
6. 性能分析(Performance Analyzer:PA)
PA用來分析一段代碼執(zhí)行占用CPU的百分比。定義:命令行 PA func_name
第三節(jié) dScope for Windows命令文件的編制
dScope除了用命令行的方式進(jìn)行調(diào)試以外,還可將各種調(diào)試命令匯集于一個(gè)調(diào)試文件中,然后調(diào)用該文件,就可達(dá)到自動(dòng)測試用戶源代碼的目的。dScope的命令文件支持C/PL/M的格式,因而編制調(diào)試命令文件與編制C語言程序有些類似。
1. 地址空間及地址空間類型
(1) 地址空間分段
dScope提供的最大可用空間為16M,實(shí)際上我們只用以下三段:① 內(nèi)部數(shù)據(jù)空間段(0X00段或D段)0X00:0X0000~0X00:0XFFFF(對MSC51而言為0X00:0X00FF)② 外部數(shù)據(jù)空間段(0X01段式或X段)0X01:0X0000~0X01~0XFFFF③ 程序空間段(0XFF段或C段)0XFF:0X0000~0XFF:0XFFFF
(2) 地址空間類型
C:代碼空間D:內(nèi)部直接尋址空間I: 內(nèi)部間接尋址空間X:外部數(shù)據(jù)空間B:位尋址空間P:I/O口EB:擴(kuò)展的位尋址空間(MCS251專有)ED:擴(kuò)展的數(shù)據(jù)空間(MCS251專有)CO:常數(shù)空間(MCS251專有)HC:正常數(shù)空間(MCS251專有)
2. 常量
dScope支持十六進(jìn)制、八進(jìn)制、十進(jìn)制、二進(jìn)制常數(shù),其后綴分別為H、Q(O)、T(或無)、Y;dScope不區(qū)分常量的大、小寫。
(1) 整型常量
分為整型(int),無符號整型(uint,00rd),長整型(long),無符號長整型(Wlong、Word)。
(2) 浮點(diǎn)型常量
與ANSI C相同。
(3) 字符串常量
與ANSI C相同
(4) 字符常量
分為字符型(Char)和無符號字符型(Uchar)一種。
(5) 行號常數(shù)
指用戶程序中的行號,實(shí)際上是個(gè)地址
(6) 位常量(Bit):
0和1
(7) 地址常數(shù)
地址常數(shù)的種類很多,地址常數(shù)不同于行號常數(shù),行號常數(shù)就是一個(gè)地址,而地址數(shù)被引用時(shí),實(shí)際上是取該地址中的數(shù)據(jù)。C:代碼地址常數(shù),如C:0X0012或0XFF:0X0012D:內(nèi)部直接尋址地址常數(shù),如D:0X0068或0X00:0X0068I:內(nèi)部間按尋址地址常數(shù),如I:0X0010或0X00:0X0010X:外部數(shù)據(jù)空間地址常數(shù),如X:0X0028或0X01:0X0028B:位地址常數(shù),如B:0X20或B:0X24.0EB:擴(kuò)展的位地址常數(shù)(MCS251專有), ED:擴(kuò)展的數(shù)據(jù)空間地址常數(shù)(MCS251專有)CO:常數(shù)空間地址常數(shù)(MCS251專有)HC:正常數(shù)空間地址常數(shù)(MCS251專有)
(8) 標(biāo)識符常量
即用戶源程序中的標(biāo)號、函數(shù)名等,實(shí)際上代表某一地址。
(9) 用戶源程序中定義的常數(shù)
3. 變量
dScope所支持的變量名或標(biāo)識符最多可由31個(gè)字符組成,第一個(gè)字母為A~Z,a~z,下劃線或問號,后續(xù)字符可為字母、數(shù)字、下劃線和問號。除CPU變量和系統(tǒng)變量外,dScope不支持全局變量,但可視“define”命令定義的變量為全局變量。Dscope所, 支持的變量分為以下幾種(變量名稱不區(qū)分大、小寫),支持類型轉(zhuǎn)換:
(1) 整型變量
分為整型變量(int)、無符號整型變量(uint/word),長整型(Long) 、無符號長整型(Ulong/dword)。
(2) 浮點(diǎn)型變量(float)
與ANSI C相同。
(3) 字符型變量L
分為字符型(char)變量和無符號字符型(Uchar)
(4) 位變量(Bit)
(5) 系統(tǒng)變量
dScope自己定義了一系列內(nèi)部變量,用戶可對這些變量進(jìn)行讀或讀/寫操作, 可被用戶自定義數(shù)所引用。a. Cycles (Read Only)32位變量(Ulong),指示當(dāng)前程序執(zhí)行已花費(fèi)的指令周期(cycle)。b. Ramsize(R/W)16位變量(Uint),指示內(nèi)部可直接尋址的數(shù)據(jù)空間大小。c. Radix(R/N)8位變量(Uchar),決定輸出的數(shù)制Radix=0X0A (10進(jìn)制),Radix=0X10 (16進(jìn)制)d. -IIP-(R/W)8位變量(Uchar),指示當(dāng)前的中斷嵌套數(shù)目。e. $ (R/W)32位變量(Ulong),指出PC值,通過對其進(jìn)行寫操作,可改變程序執(zhí)行的流程。f. Itrace (R/W)8位變量(Uchar),決定是否對程序運(yùn)行情況進(jìn)行記錄 Itrace=1,使能記錄操作 Itrace=0,根本上記錄操作g. __Break__(R/W)8位變量(Uchar) __Break__=1,中止程序的運(yùn)行h. __Mode__和__Frame size__是MCS 251專有的變量。
(6) CPU變量
即R0~R7、A、C(位變量)、B、DPTR及特殊功能寄存器變量,對這些變量均可進(jìn)行讀、寫操作。
(7) 用戶源程序中定義的變量、數(shù)組、結(jié)構(gòu)等
4. 運(yùn)算符
dScope支持ANSI C的運(yùn)算符,包括算術(shù)運(yùn)算符,邏輯運(yùn)算符,關(guān)系運(yùn)算符。
5. 表達(dá)式
以運(yùn)算符將dScope所支持的常量、變量、函數(shù)等連接在一起,就構(gòu)成了dScope的表達(dá)式。
6. 數(shù)組
dScope不支持在命令文件中定義數(shù)組,但可引用用戶程序中的數(shù)組,引用方式如同C。
7. 結(jié)構(gòu)和聯(lián)合
dScope不支持在命令文件中定義結(jié)構(gòu)和聯(lián)合,但可引用用戶程序中的結(jié)構(gòu)和聯(lián)合,引用方式如同C,但如要輸出整個(gè)結(jié)構(gòu)或聯(lián)合的結(jié)果,就要用命令“OBJ”。
8. 指針:
不可自定義指針,但支持用戶源程序中的指針變量。
9. dScope命令語句
dScope提供了一系列調(diào)試命令。在命令文件中,dScope只支持這些語句及前述定義的表達(dá)式,C語言的語句均不被支持,但在命令文件所包含的用戶自定義函數(shù)(非用戶源程序中的函數(shù))中支持C語句,但用戶自定義函數(shù)中同樣不支持?jǐn)?shù)組、結(jié)構(gòu)、聯(lián)合和指針。
(1) ASM
在線匯編命令,格式如下:ASM C:0Xnnnn (或標(biāo)號);設(shè)定插入匯編指令的地址ASM 匯編指令A(yù)SM 匯編指令插入完畢后,在debug窗口內(nèi)選擇“Assemble->Assemble”完成編譯。
(2) Assign
串行口分配指令,格式如下:Assign channel
(3) Define
用戶自定義變量指令,格式如下:Define <類型> <變量名>類型一為如前所述的變量類型,Define指令定義的變量可能為全局變量,可為用戶自定義函數(shù)所引用。
(4) Display
內(nèi)存顯示命令,格式如下二:D 起始地址,結(jié)束地址地址如前所述的地址常數(shù),標(biāo)識符常量。
(5) Enter
內(nèi)存修改指令,格式如下:E 類型地址=表達(dá)式 [表達(dá)式2],[……]類型如前所述,地址如前所述的地址常數(shù)。表達(dá)式如前所述,但如果是函數(shù)名稱(含標(biāo)號、指針變量),則關(guān)鍵字E→EP
(6) Map/Reset map
Map為內(nèi)存段修改指令,Reset map將內(nèi)存段復(fù)位或缺省值。
(7) Object
用以引用用戶源程序中的結(jié)構(gòu)(聯(lián)合)、數(shù)組、格式如下:Obj表達(dá)式 [n,],[Line]表達(dá)式為用戶源程序中的數(shù)組,結(jié)構(gòu)(聯(lián)合)名稱。當(dāng)Line缺省時(shí),數(shù)目、結(jié)構(gòu)(聯(lián)合)的內(nèi)容按n行輸出;如有Line,則單行輸出。
(8) U
反匯編命令,格式如下: U [地址]地址包括地址常 數(shù)及標(biāo)識符常量,指明反匯編的起始地址。
(9) WK
觀察點(diǎn)刪除命令,格式如下: WK n1[n2 ],[……] ;刪除指定的觀察點(diǎn),n為字符型,整型 常數(shù) WK * ;刪除所有的觀察點(diǎn)
(10) WS
觀察點(diǎn)設(shè)置命令,格式如下:WS 表達(dá)式[,n][LINE]關(guān)鍵字LINE存在時(shí),觀察點(diǎn)表達(dá)式單行輸出LINE缺省時(shí),觀察點(diǎn)表達(dá)式n行輸出。
(11) G
連續(xù)運(yùn)行命令,格式如下: G [起始地址],[終止地址]地址為標(biāo)識符常量或地址常數(shù),地址缺省時(shí),為連續(xù)運(yùn)行。
(12) T/P
單步運(yùn)行指令,格式如下: T/P n ;n指至單行運(yùn)行的步數(shù),P指給用戶當(dāng)調(diào)用某函數(shù)時(shí),把它作為一步處理,并不進(jìn)入該函數(shù)運(yùn)行。
(13) PA
性能分析操作指令,其分以下幾種:PA顯示當(dāng)前所設(shè)置的性能分析程度段PA Kill *刪除當(dāng)前所設(shè)置的所有性能分析程序段PA Kill n1 [,n2],[……]刪除指定的性能分析程序段PA 地址范圍設(shè)置性能分析程序段,地址范圍可以起始地址和結(jié)束地址的方式給出,也可給出函數(shù)名,行號范圍。PA Reset復(fù)位性能分析窗口(PA Windows),清除所有的記錄。
(14) BD
斷點(diǎn)失效命令,格式如下:BD n1 [,n2],[,……] ;disable指定的斷點(diǎn)DB * ;disable所有的斷點(diǎn)
(15) BE
斷點(diǎn)使能命令,格式如下:BE M [,n2],[,……] ;使能指定的斷點(diǎn)BE * ;使能所有的斷點(diǎn)
(16) BK
斷點(diǎn)刪除指令,格式如下:BK M[,n2],[,……] ;刪除指定的斷點(diǎn)BK * ;刪除所有的斷點(diǎn)
(17) BL
斷點(diǎn)顯示指令,顯示所有被定義的斷點(diǎn)。
(18) BS
斷點(diǎn)定義指令,dScope支持多達(dá)40個(gè)斷點(diǎn),具體格式如下:a.BS 表達(dá)式[,count] [,“cmd”]count:經(jīng)過該斷點(diǎn)的次數(shù) [選項(xiàng)]“cmd”:斷點(diǎn)到達(dá)后附帶執(zhí)行的dScope命令(連項(xiàng))表達(dá)式一個(gè)條件表達(dá)式,此時(shí)該斷點(diǎn)稱為條件斷點(diǎn)(運(yùn)算符為&.&&,<<=>,>=,= =,!=)BS READ 表達(dá)式 [,count] [,“cmd”]BS WRITE 表達(dá)式 [,count] [“cmd”]BS READWRITE 表達(dá)式 [,count] [,“cmd”]以上三種斷點(diǎn)稱訪問式(Access斷點(diǎn)),當(dāng)某一址或變量被訪問(R/W)或某些值被讀寫時(shí),程序被中斷。
(19) Define button
圖標(biāo)定義指令,用于當(dāng)窗口(Toolbox)
(20) !
DOS窗口Open命令,以“EXIT”命令退出DOS窗口。
(21) Include
文件包含命令,格式如下:Include [路徑] 文件名dScope支持以文件包含的方式調(diào)入并執(zhí)行調(diào)試命令文件,用戶自定義函數(shù)文件,調(diào)試命令文件可以有后綴,也可無后綴。
(22) Load
加載命令,格式如下:Load [路徑] 文件名 Load指令能夠加載的文件必須具有以下格式之一。Intel Hex/Hex 386格式Intel Object (OMF_51) 格式Intel Object (OMF-251) 格式dScope的CPU驅(qū)動(dòng)文件(.DLL)
(23) LOG
Command Window存盤指令,用于將Command Windows中的內(nèi)容輸出到指定的文件中,格式如下:LOG > [路徑]文件名 ;創(chuàng)建一個(gè)新文件LOG >> [路徑]文件名 ;將Command Windows的內(nèi)容輸出到某個(gè)已 存在的文件中。LOG OFF 完成輸出操作并開閉該文件LOG指令只將LOG>或LOG>>與LOG OFF指令之間的操作命令存入該指定文件。
(24) Reset
復(fù)位指令,具體格式如下:Reset ;執(zhí)行dScope的復(fù)位Reset Map ;復(fù)位外部數(shù)據(jù)空間Reset Var ;復(fù)位SET指令定義的變量
(25) Save
該指令將一段內(nèi)存映象以19EX386/HEX的格式存盤,具體格式如下:Save 路徑 文件名:地址1、地址2地址1、地址2指所要保存的空間范圍,既可是標(biāo)識符,也可是址常數(shù)。
(26) SET
該指令回來定義dScope目標(biāo)代碼預(yù)定義變量的含義,這些預(yù)定義變量包括以下二種:SRC ;指出所在的路徑F1~F12;對應(yīng)于鍵盤上的12個(gè)功能鍵,定義這些功能鍵的 含義。SET指令的格式為:SET 變量=“字符串”SET 變量
10. 函數(shù)
dScope支持三種函數(shù),即dScope預(yù)定義函數(shù),用戶自定義函數(shù)和信號函數(shù),分別詳述如下:
(1) dScope預(yù)定義函數(shù)
dScope號提供8個(gè)預(yù)定義函數(shù)(可視為dScope的庫函數(shù))①Void Printf(“String”,輸出表列)屏幕打印函數(shù),與ANSI C的Printf ( ) 函數(shù)相同②Void exec(“Command__String”)Command__String為一有效的命令字符串,此函數(shù)用于在運(yùn)行用戶自定義函數(shù)的過程中執(zhí)行dScope命令,這個(gè)函數(shù)提供了一個(gè)很重要的編制測試命令文件的方法。③int getint(“Prompt__String”);從鍵盤輸入一個(gè)整數(shù)int getlong (“Prompt__String”);從鍵盤輸入一個(gè)長整數(shù)float getfloat (“Prompt__String”);從鍵盤輸入一個(gè)浮點(diǎn)數(shù)以上這三個(gè)函數(shù)被執(zhí)行時(shí),dScope會(huì)彈出一個(gè)dialog box等待用戶輸入數(shù)據(jù),其標(biāo)題欄上是“Prompt__String”,利用這個(gè)函數(shù),不僅可以為變量賦值,也可使用戶得以看清前一階段的測試結(jié)果。④int rand (int seed) 該函數(shù)會(huì)輸出一個(gè)隨機(jī)數(shù)(-32768~32768)⑤Void memeset (ulorg start , ulong end ,uchar val) 該函數(shù)用于給地址范圍(Start__end)內(nèi)的內(nèi)存賦值(Val)⑥Void twatch (Long cycles)定時(shí)函數(shù),時(shí)間由(Long cycles)決定,它是以指令周期計(jì)數(shù)的,它也 用于產(chǎn)生一個(gè)信號波形,該函數(shù)必須用于信號函數(shù)中。
(2) 用戶自定義函數(shù)
這類函數(shù)不同于用戶源程序中的數(shù)函,其定義格式為Func 返回類型 函數(shù)名(參數(shù)序列) { 語句}返回類型如前所述的變量類型用戶自定義函數(shù)中的語句與ANSI C相似,只是不支持?jǐn)?shù)組結(jié)構(gòu)、聯(lián)合、指針,可引用dScope系統(tǒng)變量,define語句定義的變量和用戶源程序變量,不支持dScope命令,如想在函數(shù)中執(zhí)行dScope命令,要借助于exec(“Command__String”)函數(shù),可引用dScope預(yù)定義的函數(shù)(除了twatch ( )函數(shù)),不支持ANSI C的庫函數(shù)。
(3) 信號函數(shù)
用于產(chǎn)生具有某一波形的信號,定義格式為:Signal返回類型函數(shù)名(參數(shù)長列){ 語句 }信號函數(shù)主要是利用twatch ( )函數(shù),目前dScope版本在提供這一功能上面還有一定問題。
(4) dScope函數(shù)與ANSI函數(shù)的區(qū)別
① 不支持條件匯編② 不支持頭文件③ 無變量的初始化④ 不支持?jǐn)?shù)組、結(jié)構(gòu)、指針⑤ 調(diào)用方式不同,自定義函數(shù)和信號函數(shù)首先要包含一個(gè)函數(shù)文件之中,然而在測試命令文件中以Inclule指令調(diào)用該函數(shù)文件,最后才能以函數(shù)名調(diào)用之。⑥ 函數(shù)調(diào)用只支持傳值方式。
評論