版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
KeilC51開發(fā)系統(tǒng)根本知識
1.第一節(jié)系統(tǒng)概述
KeilC51是美國KeilSoftware公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)
系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,
因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會更加深刻。
KeilC51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows
界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會到KeilC51
生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開
發(fā)大型軟件時更能表達(dá)高級語言的優(yōu)勢。
下面詳細(xì)介紹KeilC51開發(fā)系統(tǒng)各局部功能和使用。
2.第二節(jié)KeilC51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu)
C51工具包的整體結(jié)構(gòu),如圖⑴所示,其中uVision與Ishell分別是C51for
Windows和forDos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿
真等整個開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然
后分別由C51及A51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件可由LIB51創(chuàng)立生
成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對目標(biāo)文件(.ABS)。ABS文件
由0H51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dSccpe51或tScope51使用進(jìn)行源代碼
級調(diào)試,也可由仿真器使用直接對目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如
EPROM中o
S(l)C51工具包整體結(jié)構(gòu)圖
3.第三節(jié)KeilC51工具包的安裝
1.1.C51forDos
在Windows下直接運(yùn)行軟件包中DOS\C51DOS.exe然后選擇安裝目錄即可。完畢
后欲使系統(tǒng)正常工作須進(jìn)行以下操作(設(shè)C:\C51為安裝目錄):
修改Autoexec,bat,參加
path二C:\C51\Bin
SetC51LIB=C;\C51\LIB
SetC51INC=C:\C51\INC
然后運(yùn)行Autoexec.bat
2.2.C51forWindows的安裝及重點(diǎn)事項(xiàng):
在Windows下運(yùn)行軟件包中WIN'Setup.exe,最好選擇安裝目錄與C51forDos
相同,這樣設(shè)置最簡單(設(shè)安裝于C:\C51目錄下)。然后將軟件包中crack目錄中的
文件拷入C:\C5l\Bin目錄下。
4.第四節(jié)KeilC51工具包各局部功能及使用簡介
1.1.C51與A51
1.(1)C51
C51是C語言編譯器,其使用方法為:
C51sourcefile[編譯控制指令]
或者
C51@commandfile
其中sourcefile為C源文件(.C)o大量的編譯控制指令完成C51編譯器的全部
功能。包控C51輸出文件CLST,.OBJ,.I和.SRC文件的控制。源文件(.C)的控制
等,詳見第五局部的具體介紹。
而Commandfile為一個連接控制文件其內(nèi)容包括:.C源文件及各編譯控制指令,
它沒有固定的名字,開發(fā)人員可根據(jù)自己的習(xí)慣指定,它適于用控制指令較多的場
合。
2.(2)A51
A51是匯編語言編譯器,使用方法為:
A51scurcefile[編譯控制指令]
3/62
2.(2)B151
BL51也是C51軟件包的連接/定位器,其具有L51的所有功能,此外它還具有以
下3點(diǎn)特別之處:
a.可以連接定位大于64kBytes的程序。
b.具有代碼域及域切換功能(CodeBanking&BankSwitching)
c.可用于RTX51操作系統(tǒng)
RTX51是一個實(shí)時多任務(wù)操作系統(tǒng),它改變了傳統(tǒng)的編程模式,甚至不必用mainO
函數(shù),單片機(jī)系統(tǒng)軟件向RTOS開展是一種趨勢,這種趨勢對于186和386及68K系
列CPU更為明顯和必須,對8051因CPU較為簡單,程序結(jié)構(gòu)等都不太復(fù)雜,RTX51
作用顯得不太突出,其專業(yè)版軟件PK51軟件包甚至不包括RTX51FU11,而只有一個
RTX51TINY版本的RTOS。RTX51TINY適用于無外部RAM的單片機(jī)系統(tǒng),因而可用面
很窄,在本文中不作介紹。Bankswitching技術(shù)因使用很少也不作介紹。
3.3.DScope51,Tscope51及Monitor51
1.(1)dScope51
dScope51是一個源級調(diào)試器和模擬器,它可以調(diào)試由C51編譯器、A51匯編器、
PL/M-51編譯器及ASM—51匯編器產(chǎn)生的程序。它不需目標(biāo)板(forwindows也可通
5/62
過mon51接目標(biāo)板),只能進(jìn)行軟件模擬,但其功能強(qiáng)大,可模擬CPU及其外圍器
件,如內(nèi)部串口,外部I/O及定時器等,能對嵌入式軟件功能進(jìn)行有效測試。
其使用方法為:
DS51[debugfile][lNIT(initfile)]
其中debugfile是一個Hex格式的8051文件,即待調(diào)試的文件其為可選的,可
在進(jìn)入dScopc51后用load命令裝入。
Initfile為一個初使化文件,它在啟動dScope51后,在debugfile裝入前裝入,
裝有一些dScope的初使化參數(shù)及常用調(diào)試函數(shù)等,下面是一個dScope.ini文件(for
dos)的內(nèi)容:
Load...\ds51\8051.iof
Map0,0xffff
dScope51forWindows則直接用鼠標(biāo)進(jìn)入,然后用load裝入待調(diào)文件。
2.(2)tScope51
與dScope51不同的是Scope51必須帶目標(biāo)板,目前它可以通過兩種方式訪問目
標(biāo)板。(1)通過EMU151在線仿真器,tScope51為該仿真器準(zhǔn)備了一個動態(tài)連接文件
EMUL51.I0T,但該方法必須配合該仿真器。⑵通過Monitov51監(jiān)控程序,這種方
法是可行的,tScope51為訪問Monitor51專門帶有MON51.I0T連接程序,使用時可
通過串口及監(jiān)控程序來調(diào)試目標(biāo)板。
其使用方法為:
TS51[INIT()]
其中為一個初使化文件。
進(jìn)入TS51后,必須裝入I0T文件,可用的有MON51.IOT及EMUL51.I0T兩種,如
裝入M0N5LI0T:
Load.C:\C51\TS51\MON51.TOTCPUTYPE(80517)
可惜的是tScope51只有forDos的版本。
3.(3)Monitor51
Monitor51是一個監(jiān)控程序通過PC機(jī)的串口與目標(biāo)板進(jìn)行通信,Monitor操作需
要M0N51或dScope51forWindows,后面局部將對Monitor51做較為詳細(xì)的介紹。
4.4.Ishel1及uVision
1.(1)IshellforDos
這是一個forDos的IDE,直接在命令行鍵入Ishell,則進(jìn)入該環(huán)境,它使用簡
單方便。其命令行與DOS命令行具有同樣的功能,對單模塊的Project苜接由菜單
7/62
進(jìn)行編譯連接,對多模塊的project。則通過批處理,BAT文件進(jìn)行編譯連接,然后
通過菜單控制由dScope51或tScope51對程序進(jìn)行調(diào)試,因?yàn)槭莊ordos的,不做
太詳細(xì)介紹。
2.(2)uVisionforWindows
uVisionforWindows是一個標(biāo)準(zhǔn)的Windows應(yīng)用程序,它是C51的一個集成軟
件開發(fā)平臺,具有源代碼編輯、project管理、集成的make等功能,它的人機(jī)界面
友好,操作方便,是開發(fā)者的首選,具體配置及使用見第五局部。
2.第二章KeilC51軟件使用詳解
1.第一節(jié)KeilC51編譯器的控制指令
C51編譯器的控制指令分為三類:源文件控制類,目標(biāo)文件控制類及列表控制類。
1.1.源文件控制類
NOEXTEND:C51源文件不允許使用ANSIC擴(kuò)展功能。
DEFINE(DF):定義預(yù)處理(在C51命令行)。
2.2.目標(biāo)文件(Object)控制類:
COMPACTLARGESMALL選編譯模式
DKBnG(l)B)包含調(diào)試信息,以供仿真器或dSCope51使用。
NOAMAKE(NOAM)禁止AutoMake信息記錄
NOREGPARMS禁止用存放器傳遞參數(shù)
OBJECTEXTEND(OE)Object文件包含附加變量類型信息
OPTIMIZE(0T)指定優(yōu)化級別
REG)指定一個存放器使用的文件以供整體優(yōu)化用
REGISTERBANK(RB)指定一個供絕對存放器訪問的存放器區(qū)名
SRC不生成目標(biāo)文件只生成匯編源文件
其它控件不常用。
3.3.列表文件(listing)控制類:
CODE(CD):向列表文件參加匯編列表
LISTINCLUDE(LC):顯示indude文件
SYMBOLS(SB):列表文件包括模塊內(nèi)所有符號的列表
WARNINGLEVEL(WL):選擇“警告〃級別
2.第二節(jié)dScope51的使用
1.1.dScope51forDos
9/62
總的來說dScopo51具有以下特性:
I高級語言顯示模式
1集成硬件環(huán)境模擬
1單步或“G0〃執(zhí)行模式
1存儲器、存放器及變量訪問
1Watch表達(dá)式之值
1函數(shù)與信號功能
下面,具體說明在進(jìn)入dScope51forDos之后,如何實(shí)現(xiàn)上述功能,dScope51
采用下拉菜單格式和窗口顯示控制,共有l(wèi)anguage、serial、exe、register四個
窗口,其中exe為命令行窗口,language為程序窗口,serial為串口窗,register
為存放器窗。
1.(1)高級語言顯示模式
單擊主菜單中的“View”,第一欄中的三條命令"Highlevel〃、“Mixed"、
“Assembly”分別對所裝入的程序按照“高級〃、”混合級〃及“匯編級〃三種方
式顯示,以方便調(diào)試使用。
2.(2)集成硬件環(huán)境模擬顯示
主菜單中“Peripheral"各條能顯示模擬硬件環(huán)境的狀態(tài),其中:
i/oPort:顯示各I/O之值,對8031而言SFR中的Pl、P2、P3、P0與引腳之
值分別列出:
Interrupt:顯示5個中斷源的入口模式是否允許,優(yōu)先級等中斷狀態(tài)。
Timer:顯示各定時/計數(shù)器的模式,初始值狀態(tài)等。
intMessage:中斷信息允許,如為允許(“>>〃出現(xiàn)),則當(dāng)中斷申請時,顯示
中斷源信息。比方當(dāng)中斷發(fā)生時會顯示:
uinterruptTimer0occured”等
A/Dconverter:
顯示A/D轉(zhuǎn)換器狀態(tài)無時,則提示“無〃。
Serial;串口信息顯示,包括串口模式、波特產(chǎn)等
Other:其它器件,如為8031則顯示“無〃
3.(3)單步或"Go”執(zhí)行
“F8”單步執(zhí)行,“F5”全速執(zhí)行到斷點(diǎn)。或選主菜單中Trace單步執(zhí)行CPU中
的Go全速執(zhí)行。
4.(4)存儲器存放器及變量訪問
11/62
外部存儲器管理MAP菜單:設(shè)置(set)、取消(reset)、顯示(Display)處理可用
存儲空間。
修改Code代碼:ASM命令
存儲器顯示命令:D類別為(X、D、I、B、C)
修改存儲器命令:E有以下幾種命令EB、EC、EI、EL、EF、EP
復(fù)雜數(shù)據(jù)類型顯示:Object命令;用以顯示結(jié)構(gòu)或數(shù)組的內(nèi)容。欲使此命令有效,
C51編譯器必須有DB及OBJECTEXTEND兩條。
反匯編命令:U
5.(5)“Watch"表達(dá)式之值
在View菜單的"Watch”一欄中有四項(xiàng):其中包括定義WatchPoint(Define)
刪除WatchPoint(remove,killall),及自動更新選項(xiàng)。
也可用WS、WK等命令代替,下面具體看“表達(dá)式〃類型:
dScope51一次最多可設(shè)16個WtchPoint表達(dá)式,顯示于WatchWindow之中,表
達(dá)式可以是簡單變量,也可是復(fù)雜數(shù)據(jù)類型如結(jié)構(gòu)、數(shù)組和指向結(jié)構(gòu)的指針等,例
如:
>WS*ptime
>WSptime->hour
>WSsome_record[o],analog等等
6.(6)關(guān)于.I0F文件
啟動DS51后必須裝入.I0F文件才能使CPU及Peripheral各項(xiàng)起作月,這個函數(shù)
的使用是依據(jù)8051系列CPU的不同特點(diǎn),裝入8051各CPU硬件設(shè)備模擬驅(qū)動文件,
比方8031CPU就必須loadDS51目錄下的8051.I0F。
2.2.dScopeforWindows
dScopeforwindows具有dScopefordos的全部功能,此外,它還具有以下明
顯的優(yōu)點(diǎn):
(1)標(biāo)準(zhǔn)的Windows界面,操作更容易更簡單;
(2)常用操作多用對話框,而非Dos的行命令方式;
(3)窗口資源更加豐富:存儲器窗口、覆蓋率分析、運(yùn)行狀態(tài)分析窗口,加強(qiáng)了
調(diào)試功能;
因?yàn)閐ScopeforWindows功能強(qiáng)大,具體操作在第八章詳細(xì)介紹。
3.第三節(jié)Monitor51及其使用
1.1.Monitor51對硬件的要求
(1)硬件系統(tǒng)為51系列CPU;
13/62
(2)帶5K外部程序存儲器(從0地址開始),存放Monitor51程序;
(3)256Bytes的外部數(shù)據(jù)存儲器以及5K的跟琮緩沖區(qū),此外,外部數(shù)據(jù)存儲器
必須足夠容納所有應(yīng)用程序代碼及數(shù)據(jù),且所有外部數(shù)據(jù)存儲器必須為馮?諾伊曼
存儲器,即能一致訪問XDATA與Code空間。
(4)一個定時器作為波特率發(fā)生器供串口使用;
(5)6Bytes的空余堆棧。
2.2.Mon51的使用
Mon51的使用途徑有三種方式:
(1)Dos行命令方式
即先用install對M0N51進(jìn)行配置,然后用M0N51進(jìn)入Monitor狀態(tài),啟用各種
命令對Monitor51進(jìn)行調(diào)試。
(2)tScope51方式
啟動tScope51裝入TS51目錄下的M0N51.IOT驅(qū)動文件,與目標(biāo)板通信。
(3)dScope51forWindows方式
在選CPU驅(qū)動文件時,選“MON51.dll”,則檢查目標(biāo)板并進(jìn)入M0N51狀態(tài)。
3.3.M0N51的配置
(1)M0N51forDos的配置
運(yùn)行install文件(在\I0N51目錄下),不同的參數(shù)可以配置不同的硬件環(huán)境。
INSTALLSerialtype[xdstastart[codestart[bank][PROMCHECK]]],具體說明見
M0N51幫助文件或使用手冊。
(2)M0N51forWindows的配置
在啟用M0N51.dll時,會使得系統(tǒng)自動檢查目標(biāo)板連接,如配置不對,則彈出
“Ccnfiguration”對話框,設(shè)置PC串口,波特率等,完畢單擊“apply”有效。
4.4.串口連接圖:
收發(fā)交叉互連,RTS、CTS直連,DSR、DTR直連,具體引腳排列參考串口資料。
5.5.M0N51命令及使用
詳細(xì)的M0N51命令可參閱幫助。
4.第四節(jié)集成開發(fā)環(huán)境(IDE)的使用
1.1.Ishel1forDos的使用
進(jìn)入Ishell之后看到兩個窗口:一個是文件窗口,一個是Dos命令行窗口,窗
口上方是下拉式的命令菜單,其中的Files控制文件窗口的顯隱。
使用【shall,第一步就是配置系統(tǒng),即要學(xué)習(xí)兩個文件的修改與創(chuàng)立:
15/62
1.(1)[shell.CFG文件
每一個project都有一個Ishell.CFG,其中存放有“Option菜單和Setup菜單
下的局部信息;Bellenabled>Monochromeenabled>EditorSelected、CRTLines>
targetenviroment.nameofuseredit>Automaticloadforconfiguration
enabled、enabled,for、translatecommandlinecontrols,projectname等。
對每個project都必須設(shè)置以上信息,然后存盤“setup〃的的“save”,這樣
才可正式開始下面工作。
2.(2)IShelLcol文件
對TDE顏色設(shè)置,如不改動,可以缺省為主。
3.(3)CDF文件
該文件位于BIN目錄下,每一文件定義一組外部函數(shù)工具包,即定義外部環(huán)境如
8051.CDF,USER.CDF等,開發(fā)者可修改CDF文件,供自己使用,至于CDF文件內(nèi)容
可查看一下805LCDF即可知道。注意.CDF文件是Ishell系統(tǒng)的核心所在,不同的
CDF文件可使本IDE適用于不同的編譯、連接系統(tǒng),即本TDE并不僅適于C51。
下面談一談Automake工具:
C51的Automake是一個project管理器,在8051工具包中以O(shè)BJECT文件形式保
存了一個project的信息,AutoMake用這些信息來進(jìn)行project管理,一旦手工建
立一個project,Automake可生成一個新的OBJECT,AutoMake利用此文件來編譯那
些修改正的文件。
Automake支持C51、A51、L5I/BL5KC166、A166、L166等編譯連接器。點(diǎn)中主
菜單中的Automake即運(yùn)行本工具。
IshellforDos使用比較繁瑣,推薦使用uVisionforwindows<.
2.2.uVisionforwindows的使用
uVision是一個標(biāo)準(zhǔn)的windows應(yīng)用程序,其編譯功能、文件處理功能、project
處理功能、窗口功能以及工具引用功能(如A51、C51、PL/M4KBL51dScope等)等
都較TshellforDos要強(qiáng)得多。
uVision采用BL51作連接器,因?yàn)锽L51兼容L51,所以一切能在Dos下工作的
project都可以到uVision中進(jìn)行連接調(diào)試。
uVision采用dScopeforwindows作調(diào)試器,該調(diào)試器支持M0N51及系統(tǒng)模擬兩
種方式,功能較forDOS要強(qiáng)大好用,調(diào)試功能強(qiáng)大。
注意:
(1)Option菜單下的各項(xiàng)要會使用,其中A51、C51、PL/M5LBL51定義各文件
所使用的編譯、連接控制指令,dScope定義一個dScope初始化文件。Make則是定
義一個make文件。
17/62
(2)進(jìn)入調(diào)試是在RUN菜單下運(yùn)行dScope。
(3)project中包括新建、翻開、修改、更新、編譯、連接等poject處理,具體
使用可參考后面的例子。
3.第三章KeilC51vs標(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類:
18051存儲類型及存儲區(qū)域
1存儲模式
1存儲器類型聲明
1變量類型聲明
1位變量與位尋址
1特殊功能存放器(SFR)
1C51指針
1函數(shù)屬性
具體說明如下(8031為缺省CPU)。
1.第一節(jié)KeilC51擴(kuò)展關(guān)鍵字
C51V4.0版本有以下擴(kuò)展關(guān)鍵字(共19個):
_at_idatasfrl6alieninterruptsmall
bdatalarge_task_Codebitpdata
usingreentrantxdatacompactsbitdatasfr
2.第二節(jié)內(nèi)存區(qū)域(MemoryAreas):
1.1.PragramArea:
由Code說明可有多達(dá)64kBytes的程序存儲器
2.2.InternalDataMemory:
內(nèi)部數(shù)據(jù)存儲器可用以下關(guān)鍵字說明:
data:直接尋址區(qū),為內(nèi)部RAM的低128字節(jié)00H?7FH
idata:間接尋址區(qū),包括整個內(nèi)部RAM區(qū)OOH?FFH
bdata:可位尋址區(qū),20H?2FH
3.3.ExternalDataMemory
外部RAM視使用情況可由以下關(guān)鍵字標(biāo)識:
xdala:可指定多達(dá)64KB的外部直接尋址區(qū),地址范圍0000H?0FFFFH
19/62
pdata:能訪問1頁(25bBytes)的外部RAM,主要用于緊湊模式(CompactModel)。
4.4.SpeciacFunctionRegisterMemory
8051提供128Bytes的SFR尋址區(qū),這區(qū)域可位尋址、字節(jié)尋址或字尋址,用以
控制定時器、計數(shù)器、串口、I/O及其它部件,可由以下幾種關(guān)鍵字說明:
sfr:字節(jié)尋址比方sfrP0=0x80;為P0口地址為80H,“=〃后H?FFH之間的
常數(shù)。
sfrl6:字尋址,如sfrl6T2=0xcc;指定Timer2口地址T2L=0xccT2H=OxCD
sbit:位尋址,如sbitEA=0xAF;指定第OxAF位為EA,即中斷允許
還可以有如下定義方法:
sbit0V=PSW^2;(定義0V為PSW的第2位)
sbit0V=0XDO^2;(同上)
或bit0V-=0xD2(同上)。
3.第三節(jié)存儲模式
存儲模式?jīng)Q定了沒有明確指定存儲類型的變量,函數(shù)參數(shù)等的缺省存儲區(qū)域,共
三種:
1.1.Small模式
所有缺省變量參數(shù)均裝入內(nèi)部RAM,優(yōu)點(diǎn)是訪問速度快,缺點(diǎn)是空間有限,只適
用于小程序。
2.2.Compact模式
所有缺省變量均位于外部RAM區(qū)的一頁(2量Bytes),具體哪一頁可由P2口指定,
在STARTUP.A51文件中說明,也可用pdata指定,優(yōu)點(diǎn)是空間較Small為寬裕速度
較Small慢,較large要快,是一種中間狀態(tài)。
3.3.large模式
所有缺省變量可放在多達(dá)64KB的外部RAM區(qū),優(yōu)點(diǎn)是空間大,可存變量多,缺
點(diǎn)是速度較慢。
提示:存儲模式在C51編譯器選項(xiàng)中選擇。
4.第四節(jié)存儲類型聲明
變量或參數(shù)的存儲類型可由存儲模式指定缺省類型,也可由關(guān)鍵字直接聲明指
定。各類型分別用:code,data,idata,xdata,pdata說明,例:
datauarl
charcodearray[]="hello!”;
unsignedcharxdataarr[10][4][4];
21/62
5.第五節(jié)變量或數(shù)據(jù)類型
C51提供以下幾種擴(kuò)展數(shù)據(jù)類型:
bit位變量值為0或1
sbit從字節(jié)中定義的位變量0或1
sfrsfr字節(jié)地址0-255
sfrl6sfr字地址0-65535
其余數(shù)據(jù)類型如:char,enum,short,int,long,float等與ANSIC相同。
6.第六節(jié)位變量與聲明
1.1.bit型變量
bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM20H?2FH。
注意:
(1)用#pragmadisable說明函數(shù)和用“usign”指定的函數(shù),不能返回bit值。
(2)一個bit變量不能聲明為指針,如bit*ptr;是錯誤的
(3)不能有bit數(shù)組如:bitarr[5];錯誤。
2.2.可位尋址區(qū)說明20H—2FH
可作如下定義:
intbdatai;
charbdataarr[3],
然后:
sbitbito=inO;sbitbitl5=I*15;
sbitarr07=arr[0]7;sbitarrl5=arr[i]7;
7.第七節(jié)KeilC51指針
C51支持一般指針(GenericPointer)和存儲器指針(Memory_SpecificPointer).
1.1.一般指針
一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時還可以說明指針的存儲類型,
例如:
long*state;為一個指向long型整數(shù)的指針,而state本身則依存儲模式存放。
char*xdataptr;ptr為一個指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM
區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲器中。
一般指針本身用3個字節(jié)存放,分別為存儲器類型,高位偏移,低位偏移量。
23/62
2.2.存儲器指針
基于存儲器的指針說明時即指定了存貯類型,例如:
chardata*str;str指向data區(qū)中char型數(shù)據(jù)
intxdata*pow;pow指向夕卜部RAM的int型整數(shù)。
這種指針存放時,只需一個字節(jié)或2個字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?/p>
3.3.指針轉(zhuǎn)換
即指針在上兩種類型之間轉(zhuǎn)化:
1當(dāng)基于存儲器的指針作為一個實(shí)參傳遞給需要一般指針的函數(shù)時,指針自動轉(zhuǎn)
化。
1如果不說明外部函數(shù)原形,基于存儲器的指針自動轉(zhuǎn)化為一般指針,導(dǎo)致錯誤,
因而請用include"說明所有函數(shù)原形。
1可以強(qiáng)行改變指針類型。
8.第八節(jié)KeilC51函數(shù)
C51函數(shù)聲明對ANSIC作了擴(kuò)展,具體包括:
1.1.中斷函數(shù)聲明:
中斷聲明方法如下:
voidserial_ISR()interrupt4[using1]
/*ISR*/
為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的
中斷。
/*definenotusedinlerrupl,sogenerate"IRET"intheirentrance*/
voidexternO_ISR()interrupt0{}/*notused*/
voidtimerO_ISR()interrupt1{}/*notused*/
voidexternl_ISR()interrupt2(}/*notused*/
voidtimerl_ISR()interrupt3{}/*notused*/
voidserial_ISR()interrupt4{}/*notused*/
2.2.通用存儲工作區(qū)
3.3.選通用存儲工作區(qū)由usingx聲明,見上例。
4.4.指定存儲模式
25/62
由smallcompact及l(fā)arge說明,例如:
voidfunl(void)small{}
提示:small說明的函數(shù)內(nèi)部變量全部使用內(nèi)部RAM。關(guān)鍵的經(jīng)常性的耗時的地
方可以這樣聲明,以提高運(yùn)行速度。
5.5.#pragmadisable
在函數(shù)前聲明,只對一個函數(shù)有效。該函數(shù)調(diào)用過程中將不可被中斷。
6.6.遞歸或可重入函數(shù)指定
在主程序和中斷中都可調(diào)用的函數(shù),容易產(chǎn)生問題。因?yàn)?1和PC不同,PC使用
堆棧傳遞參數(shù),且靜態(tài)變量以外的內(nèi)部變量都在堆棧中;而51一般使用存放器傳遞
參數(shù),內(nèi)部變量一般在RAM中,函數(shù)重入時會破壞上次調(diào)用的數(shù)據(jù)??梢杂靡韵聝?/p>
種方法解決函數(shù)重入:
a、在相應(yīng)的函數(shù)前使用前述"^pragmadisable"聲明,即只允許主程序或中斷
之一調(diào)用該函數(shù);
b、將該函數(shù)說明為可重入的。如下:
voidfunc(param...)reentrant;
KeilC51編譯后將生成一個可重入變量堆棧,然后就可以模擬通過堆棧傳遞變量
的方法。
由于一般可重入函數(shù)由主程序和中斷調(diào)用,所以通常中斷使用與主程序不同的R
存放器組。
另外,對可重入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“#pragmanoaregs",以禁
止編譯器使用絕對存放器尋址,可生成不依賴于存放器組的代碼。
7.7.指定PL/M—51函數(shù)
由alien指定。
4.第四章KeilC51高級編程
本章討論以下內(nèi)容:
1絕對地址訪問
1C與匯編的接口
1C51軟件包中的通用文件
1段名轉(zhuǎn)換與程序優(yōu)化
1.第一節(jié)絕對地址訪問
C51提供了三種訪問絕對地址的方法:
1.1.絕對宏:
27/62
在程序中,用“#include<absacc.h>〃即可使用其中定義的宏來訪問絕對地址,
包括:
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具體使用可看一看absacc.h便知
例如:
rval=CBYTE[0x0002];指向程序存貯器的0002h地址
rval-XWORD[0x0002];指向外RAM的0004h地址
2.2._at_關(guān)鍵字
直接在數(shù)據(jù)定義后加上_at_const即可,但是注意:
(1)絕對變量不能被初使化;
(2)bit型函數(shù)及變量不能用_at_指定。
例如:
idatastructlinklist_at_0x40;指定list結(jié)構(gòu)從40h開始。
xdatachartext[25b]_at_0xE000;指定text數(shù)組從OEOOOH開始
提示:如果外部絕對變量是1/0端口等可自行變化數(shù)據(jù),需要使用volatile關(guān)
鍵字進(jìn)行描述,請參考absacc.ho
3.3.連接定位控制
此法是利用連接控制指令codexdatapdata\databdata對“段〃地址進(jìn)行,
如要指定某具體變量地址,則很有局限性,不作詳細(xì)討論。
2.第二節(jié)KeilC51與匯編的接口
1.1.模塊內(nèi)接口
方法是用#pragma語句具體結(jié)構(gòu)是:
#pragmaasrn
匯編行
Spragmaendasm
這種方法實(shí)質(zhì)是通過asm與ndasm告訴C51編譯器中間行不用編譯%匯編行,因
而在編譯控制指令中有SRC以控制將這些不用編譯的行存入其中。
2.2.模塊間接口
C模塊與匯編模塊的接口較簡單,分別用C51與A51對源文件進(jìn)行編譯,然后用
L51將obj文件連接即可,關(guān)鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞問題,C51
中有兩種參數(shù)傳遞方法。
(1)通過存放器傳遞函數(shù)參數(shù)
29/62
最多只能有3個參數(shù)通過存放器傳遞,規(guī)律如下表:
參數(shù)數(shù)目charintlong,float一般指針
123R7R5R3R6&R7R4&R5R2&R3R4?R7R4?R7R1?R3R1?R3R1?R3
(2)通過固定存儲區(qū)傳遞(fixedmemory)
這種方法將bit型參數(shù)傳給一個存儲段中:
?function_name?BIT
將其它類型參數(shù)均傳給下面的段:?function_name?BYTE,且按照預(yù)選順序存放。
至于這個固定存儲區(qū)本身在何處,則由存儲模式默認(rèn)。
(3)函數(shù)的返回值
函數(shù)返回值一律放于存放器中,有如下規(guī)律:
returntypeRegistev說明
bit標(biāo)志位由具體標(biāo)志位返回
char/unsignedcharl_byte指針R7單字節(jié)由R7返回
int/unsignedint2_byte指針R6&R7雙字節(jié)由R6和R7返回,MSB在R6
long&unsignedlongR4?R7MSB在R4,LSB在R7
floatR4?R732BitIEEE格式
一般指針R1?R3存儲類型在R3高位R2低R1
(4)SRC控制
該控制指令將C文件編譯生成匯編文件(.SRC),該匯編文件可改名后,生成匯
編.ASM文件,再用A51進(jìn)行編譯。
3.第三節(jié)KeilC51軟件包中的通用文件
在C51\LiB目錄下有幾個C源文件,這幾個C源文件有非常重要的作用,對它們
稍事修改,就可以用在自己的專用系統(tǒng)中。
1.1.動態(tài)內(nèi)存分配
init_mem.C;此文件是初始化動態(tài)內(nèi)存區(qū)的程序源代碼。它可以指定動態(tài)內(nèi)存的
位置及大小,只有使用了init_mem()才可以調(diào)回其它函數(shù),諸如malloc
calloc,realloc等。
calloc.c:此文件是給數(shù)組分配內(nèi)存的源代碼,它可以指定單位數(shù)據(jù)類型及該單
元數(shù)目。
nialloc.c:此文件是malloc的源代碼,分配一段固定大小的內(nèi)存。
31/62
realloc,c:此文件是realloc,c源代碼,其功能是調(diào)整當(dāng)前分配動態(tài)內(nèi)存的大
2.2.C51啟動文件STARTUP.A51
啟動文件STARTUP.A51中包含目標(biāo)板啟動代碼,可在每個project中參加這個文
件,只要復(fù)位,則該文件立即執(zhí)行,其功能包括:
1定義內(nèi)部RAM大小、外部RAM大小、可重入堆棧位置
1去除內(nèi)部、外部或者以此頁為單元的外部存儲器
1按存儲模式初使化重入堆棧及堆棧指針
1初始化8051硬件堆棧指針
1向main()函數(shù)交權(quán)
開發(fā)人員可修改以下數(shù)據(jù)從而對系統(tǒng)初始化
常數(shù)名意義
IDATALEN待清內(nèi)部RAM長度
XDATASTART指定待清外部RAM起始地址
XDATALEN待清外部RAM長度
IBPSTACK是否小模式重入堆棧指針需初始化標(biāo)志,1為需要。缺省為0
IBPSTACKTOP指定小模式重入堆棧頂部地址
XBPSTACK是否大模式重入堆棧指針需初始化標(biāo)志,缺省為0
XBPSTACKTOP指定大模式重入堆棧頂部地址
PBPSTACK是否Compact重入堆棧指針,需初始化標(biāo)志,缺省為0
PBPSTACKTOP指定Compact模式重入堆棧頂部地址
PPAGEENABLEP2初始化允許開關(guān)
PPAGE指定P2值
PDATASTART待清外部RAM頁首址
PDATALEN待清外部RAM頁長度
提示:如果要初始化P2作為緊湊模式高端地址,必須:PPAGEENAGLE=1,PPAGE
為P2值,例如指定某頁1000H—10FFH,則PPAGE=10H,而且連接時必須如下:
L5Kinputmodules>PDATA(1080H),其中1080H是1000H-10FFH中的任一個值。
以下是STARTUP.A51代碼片斷,紅色是經(jīng)??赡苄枰薷牡牡胤剑?/p>
33/62
;ThispartoftheC51Compilerpackage
;CopyrightKEILELEKTR0N1KGmbH1990
:STARTUP.A51:Thiscodeisexecutedafterprocessorreset.
:ToIranslaleChisA51withthefollowinginvocalion:
:A51STARTUP.A51
;TolinkthemodifiedSTARTUP.OBJyourapplicationusethefollowing
;L51invocation:
;L51<yourobject>,STARTUP.OBJ<controls>
;User-definedPower-OnInitializationcfMemory
;WiththefollowingEQUstatementstheinitializationofmemory
;alprocessorresetcanbedefined:
*
:;theabsolutestart-addressofIDATAmemoryisalways0
IDATALENEQU80H;thelengthofIDATAmemoryinbytes.
*
XDATASTARTEQUOH;theabsolutestart-addressofXDATAmemory
XDATALENEQUOH;thelengthofXDATAmemoryinbytes.
*
PDATASTARTEQUOH;theabsolutestart-addressofPDATAmemory
35/62
PDATALENEQUOH;thelengthofPDATAmemoryinbytes.
;Notes:TheIDATAspaceoverlapsphysicallytheDATAandBITareasof
the
;8051CPU.AtminimumthememoryspaceoccupiedfromtheC51
;run-timeroutinesmustbesettozero.
;ReentrantStackIniti1ization
;ThefollowingEQUstatementsdefinethestackpointerforreentrant
;functionsandinitializedit:
:StackSpaceforreentrantfunctionsintheSMALLmodel.
IBPSTACKEQU0;setto1ifsmallreentrantisused.
TBPSTACKTOPEQUOFFH+1;settopofstacktohighestlocation+1.
;StackSpaceforreentrantfunctionsintheLARGEmodel.
XBPSTACKEQU0;setto1iflargereentrantisused.
XBPSTACKTOPEQUOFFFFH+1;settopofstacktohighestlocation+1.
*
;StackSpaceforreentrantfunctionsintheCOMPACTmodel.
PBPSTACKEQU0;setto1ifcompactreentrantisused.
PBPSTACKTOPEQUOFFFFH+1;settopofstacktohighestlocation+1.
;PageDefinitionforUsingtheCompactModelwith64KBytexdataRAM
37/62
;ThefollowingEQUstatementsdefinethexdatapageusedforpdata
;variables.TheEQUPPAGEmustconformwiththePPAGEcontrolused
;inthelinkerinvocation.
PPAGEENABLEEQU0;setto1ifpdataobjectareused.
PPAGEEQU0;definePPAGEnumber.
3.3.標(biāo)準(zhǔn)輸入輸出文件
putchar.c
putchar.c是一個低級字符輸出子程,開發(fā)人員可修改后應(yīng)用到自己的硬件系統(tǒng)
上,例如向CLD或LEN輸出字符。
缺省:putchar.c是向串口輸出一個字符XONlXOFF是流控標(biāo)志,換行符“\*n〃
自動轉(zhuǎn)化為回車/換行“\r\n〃。
getkey.c
getkey函數(shù)是一個低級字符輸入子程,該程序可用到自己硬件系統(tǒng),如矩陣鍵盤
輸入中,缺省時通過串口輸入字符。
4.4.其它文件
還包括對Watch-Dog有獨(dú)特功能的INIT.A51函數(shù)以及對8XC751適用的函數(shù),
可參考源代碼。
4.第四節(jié)段名協(xié)定與程序優(yōu)化
1.1.段名協(xié)定(SegmentNamingConventions)
C51編譯器生成的目標(biāo)文件存放于許多段中,這些段是代碼空間或數(shù)據(jù)空間的一
些單元,一個段可以是可重定位的,也可以是絕對段,每一個可重定位的段都有一
個類型和名字,C51段名有以下規(guī)定:
每個段名包括前綴與模塊名兩局部,前綴表示存儲類型,模塊名則是被編譯的模
塊的名字,例如:
?CO?mainl:表示【nainl模塊中的代碼段中的常數(shù)局部
?PR?functionl?module表module模塊中函數(shù)functionl的可執(zhí)行段,具體
規(guī)定參閱手冊。
2.2.程序優(yōu)化
39/62
C51編譯器是一個具有優(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)AKOPTIMIZE(speed)提供6級優(yōu)化功能,缺省為:
OPTIMIZE(6,SPEED)o
5.第五章KeilC51庫函數(shù)參考
C51強(qiáng)大功能及其高效率的重要表達(dá)之一在于其豐富的可直接調(diào)用的庫函數(shù),多
使用庫函數(shù)使程序代碼簡單,結(jié)構(gòu)清晰,易于調(diào)試和維護(hù),下面介紹C51的庫函數(shù)
系統(tǒng)。
1.第一節(jié)本征庫函數(shù)(intrinsicroutines)和非本征證庫函數(shù)
C51提供的本征函數(shù)是指編譯時直接將固定的代碼插入當(dāng)前行,而不是用ACALL
和LCALL語句來實(shí)現(xiàn),這樣就大大提供了函數(shù)訪問的效率,而非本征函數(shù)則必須由
ACALL及LCALL調(diào)用。
C51的本征庫函數(shù)只有9個,數(shù)目雖少,但都非常有用,列如下:
_crol_,_cror_:將char型變量循環(huán)向左(右)移動指定位數(shù)后返回
_iror_,_irol_:將int型變量循環(huán)向左(右)移動指定位數(shù)后返回
_lrol_,_lror_:將long型變量循環(huán)向左(右)移動指定位數(shù)后返回
_nop_:相當(dāng)于插入NOP
_testbit_:相當(dāng)于JBCbitvar測試該位變量并跳轉(zhuǎn)同時去除。
_chkfloat_:測試并返回源點(diǎn)數(shù)狀態(tài)。
使用時,必須包含#打(:1110*〈intrins.h>一行。
如不說明,下面談到的庫函數(shù)均指非本征庫函數(shù)。
3.第三節(jié)存儲模式
存儲模式?jīng)Q定了沒有明確指定存儲類型的變量,函數(shù)參數(shù)等的缺省存儲區(qū)域,共
三種:
1.1.Small模式
所有缺省變量參數(shù)均裝入內(nèi)部RAM,優(yōu)點(diǎn)是訪問速度快,缺點(diǎn)是空間有限,只適
用于小程序。
2.2.Compact模式
41/62
所有缺省變量均位于外部RAM區(qū)的一頁(256Bytes),具體哪一頁可由P2口指定,
在STARTUP.A51文件中說明,也可用pdata指定,優(yōu)點(diǎn)是空間較Small為寬裕速度
較Small慢,較large要快,是一種中間狀態(tài)。
3.3.large模式
所有缺省變量可放在多達(dá)64KB的外部RAM區(qū),優(yōu)點(diǎn)是空間大,可存變量多,缺
點(diǎn)是速度較慢。
提示:存儲模式在C51編譯器選項(xiàng)中選擇。
4.第四節(jié)存儲類型聲明
變量或參數(shù)的存儲類型可由存儲模式指定缺省類型,也可由關(guān)鍵字直接聲明指
定。各類型分別用:code,data,分ata,xdata,pdata說明,例:
datauarl
charcodearray[]="hello!";
unsignedcharxdataarr[10][4][4];
5.第五節(jié)變量或數(shù)據(jù)類型
C51提供以下幾種擴(kuò)展數(shù)據(jù)類型:
I)it位變量值為0或1
sbit從字節(jié)中定義的位變量0或1
sfrsfr字節(jié)地址0—255
sfrl6sfr字地址0-65535
其余數(shù)據(jù)類型如:char,enum,short,int,long,float等與ANSIC相同。
6.第六節(jié)位變量與聲明
1.1.bit型變量
bit型變量可用變量類型,函數(shù)聲明、函數(shù)返回值等,存貯于內(nèi)部RAM20H?2FH。
注意:
(1)用#pragmadisable說明函數(shù)和用“usign”指定的函數(shù),不能返回bit值。
(2)一個bit變量不能聲明為指針,如bit*ptr;是錯誤的
(3)不能有bit數(shù)組如:bitarr[5];錯誤。
2.2.可位尋址區(qū)說明20H—2FH
可作如下定義:
intbdatai;
charbdalaarr[3],
43/62
然后:
sbitbito=inO;sbitbitl5=I^15;
sbitarr07=arr[0]7;sbitarrl5=arr[i]*7;
7.第七節(jié)KeilC51指針
C51支持一般指針(GenericPointer)和存儲器指針(Memory_SpecificPointer).
1.1.一般指針
一般指針的聲明和使用均與標(biāo)準(zhǔn)C相同,不過同時還可以說明指針的存儲類型,
例如:
long*state;為一個指向long型整數(shù)的指針,而state本身則依存儲模式存放。
char*xdataptr;ptr為一個指向char數(shù)據(jù)的指針,而ptr本身放于外部RAM
區(qū),以上的long,char等指針指向的數(shù)據(jù)可存放于任何存儲器中。
一般指針本身用3個字節(jié)存放,分別為存儲器類型,高位偏移,低位偏移量。
2.2.存儲器指針
基于存儲器的指針說明時即指定了存貯類型,例如:
chardata*str;str指向data區(qū)中char型數(shù)據(jù)
intxdata*pow;pow指向夕卜部RAM的int型整數(shù)。
這種指針存放時,只需一個字節(jié)或2個字節(jié)就夠了,因?yàn)橹恍璐娣牌屏俊?/p>
3.3.指針轉(zhuǎn)換
即指針在上兩種類型之間轉(zhuǎn)化:
1當(dāng)基于存儲器的指針作為一個實(shí)參傳遞給需要一般指針的函數(shù)時,指針自動轉(zhuǎn)
化。
1如果不說明外部函數(shù)原形,基于存儲器的指針自動轉(zhuǎn)化為一般指針,導(dǎo)致錯誤,
因而請用“#include〃說明所有函數(shù)原形。
1可以強(qiáng)行改變指針類型。
8.第八節(jié)KeilC51函數(shù)
C51函數(shù)聲明對ANSIC作了擴(kuò)展,具體包括:
1.1.中斷函數(shù)聲明:
中斷聲明方法如下:
voidserial_ISR()interrupt4[using1]
/*1SR*/
45/62
為提高代碼的容錯能力,在沒用到的中斷入口處生成iret語句,定義沒用到的
中斷。
/*definenotusedinterrupt,sogenerate"IRETnintheirentrance*/
voidexternO_ISR()interrupt0{}/*notused*/
voidtimerOISR()interrupt1{}/*notused*/
voidexlernl_ISR()inlerrupl2{}/*notused*/
voidtimerl_ISR()interrupt3(}/*notused*/
voidserial_ISR()interrupt4{}/*notused*/
2.2.通用存儲工作區(qū)
3.3.選通用存儲工作區(qū)由usingx聲明,見上例。
4.4.指定存儲模式
由smallcompact及l(fā)arge說明,例如:
voidfunl(void)small{}
提示:small說明的函數(shù)內(nèi)部變量全部使用內(nèi)部RAM。關(guān)鍵的經(jīng)常性的耗時的地
方可以這樣聲明,以提高運(yùn)行速度。
5.5.#pragmadisable
在函數(shù)前聲明,只對一個函數(shù)有效。該函數(shù)調(diào)用過程中將不可被中斷。
6.6.遞歸或可重入函數(shù)指定
在主程序和中斷中都可調(diào)用的函數(shù),容易產(chǎn)生問題。因?yàn)?1和PC不同,PC使用
堆棧傳遞參數(shù),且靜態(tài)變量以外的內(nèi)部變量都在堆棧中;而51一般使用存放器傳遞
參數(shù),內(nèi)部變量一般在RAM中,函數(shù)重入時會破壞上次調(diào)用的數(shù)據(jù)??梢杂靡韵聝?/p>
種方法解決函數(shù)重入:
a、在相應(yīng)的函數(shù)前使用前述“#pragmadisable〃聲明,即只允許主程序或中斷
之一調(diào)用該函數(shù);
b、將該函數(shù)說明為可重入的。如下:
voidfunc(param...)reentrant;
KeilC51編譯后將生成一個可重入變量堆棧,然后就可以模擬通過堆棧傳遞變量
的方法。
由于一般可重入函數(shù)由主程序和中斷調(diào)用,所以通常中斷使用與主程序不同的R
存放器組。
另外,對可重入函數(shù),在相應(yīng)的函數(shù)前面加上開關(guān)“#pragmanoaregs",以禁
止編譯器使用絕對存放器尋址,可生成不依賴于存放器組的代碼。
47/62
7.7.指定PL/M—51函數(shù)
由alien指定。
4.第四章KeilC51高級編程
本章討論以下內(nèi)容:
1絕對地址訪問
1C與匯編的接口
1C51軟件包中的通用文件
1段名轉(zhuǎn)換與程序優(yōu)化
1.第一節(jié)絕對地址訪問
C51提供了三種訪問絕對地址的方法:
1.1.絕對宏:
在程序中,用“#include〈absacc.h>〃即可使用其中定義的宏來訪問絕對地址,
包括:
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具體使用可看一看absacc.h便知
例如:
rval=CBYTE[0x0002];指向程序存貯器的0002h地址
rval=XWORD[0x0002];指向外RAM的0004h地址
2.2._at_關(guān)鍵字
直接在數(shù)據(jù)定義后加上_at_const即可,但是注意:
(1)絕對變量不能被初使化;
(2)bit型函數(shù)及變量不能用_at_指定。
例如:
idatastructlinklist_at_0x40;指定list結(jié)構(gòu)從40h開始。
xdatachartext[25b]_at_0xE000;指定text數(shù)組從0E000H開始
提示:如果外部絕對變量是1/0端口等可自行變化數(shù)據(jù),需要使用volatile關(guān)
鍵字進(jìn)行描述,請參考absacc.ho
3.3.連接定位控制
此法是利用連接控制指令codexdatapdata\databdata對“段”地址進(jìn)行,
如要指定某具體變量地址,則很有局限性,不作詳細(xì)討論。
49/62
2.第二節(jié)KeilC51與匯編的接口
1.1.模塊內(nèi)接口
方法是用#pragma語句具體結(jié)構(gòu)是:
#pragmaasm
匯編行
#pragmaendasm
這種方法實(shí)質(zhì)是通過asm與ndasm告訴C51編譯器中間行不用編譯光匯編行,因
而在編譯控制指令中有SRC以控制將這些不用編譯的行存入其中。
2.2.模塊間接口
C模塊與匯編模塊的接口較簡單,分別用C51與A51對源文件進(jìn)行編譯,然后用
L51將obj文件連接即可,關(guān)鍵問題在于C函數(shù)與匯編函數(shù)之間的參數(shù)傳遞問題,C51
中有兩種參數(shù)傳遞方法。
(1)通過存放器傳遞函數(shù)參數(shù)
最多只能有3個參數(shù)通過存放器傳遞,規(guī)律如下表:
參數(shù)數(shù)目charintlong,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項(xiàng)目協(xié)調(diào)員面試題及高頻考點(diǎn)含答案
- 深度解析(2026)《GBT 19114.43-2010工業(yè)自動化系統(tǒng)與集成 工業(yè)制造管理數(shù)據(jù) 第43部分:制造流程管理數(shù)據(jù):流程監(jiān)控與制造數(shù)據(jù)交換的數(shù)據(jù)模型》
- 會計實(shí)務(wù)操作技能與面試題目解析
- 書卷類課件動圖
- 深度解析(2026)GBT 18904.1-2002半導(dǎo)體器件 第12-1部分光電子器件 纖維光學(xué)系統(tǒng)或子系統(tǒng)用帶不帶尾纖的光發(fā)射或紅外發(fā)射二極管空白詳細(xì)規(guī)范
- 銀行值班員崗位職責(zé)與面試題詳解
- 深度解析(2026)《GBT 18757-2025企業(yè)建模與體系結(jié)構(gòu) 企業(yè)參考體系結(jié)構(gòu)與方法論的要求》
- 特殊人群(如肥胖)個體化抗凝方案調(diào)整
- 特殊類型糖尿病口服降糖藥聯(lián)合治療原則
- 特殊病理類型SCLC的治療策略探討
- 2025廣西柳州城市職業(yè)學(xué)院人才招聘28人(公共基礎(chǔ)知識)測試題附答案解析
- 22064,22877,23041,11041,59969《管理學(xué)基礎(chǔ)》國家開放大學(xué)期末考試題庫
- 加盟連鎖經(jīng)營政策分析與實(shí)施方案
- 電纜路徑檢測協(xié)議書
- 《烹飪工藝學(xué)》期末考試復(fù)習(xí)題庫(附答案)
- 片區(qū)供熱管網(wǎng)連通工程可行性研究報告
- 課件《法律在我身邊》
- 2025年文職倉庫保管員考試題及答案
- 2026年湖南鐵道職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試必刷測試卷附答案
- 2025年重慶市大渡口區(qū)事業(yè)單位考試試題
- 管道施工圍擋施工方案
評論
0/150
提交評論