KEIL編程_C語言嵌入?yún)R編_第1頁
KEIL編程_C語言嵌入?yún)R編_第2頁
KEIL編程_C語言嵌入?yún)R編_第3頁
KEIL編程_C語言嵌入?yún)R編_第4頁
KEIL編程_C語言嵌入?yún)R編_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、keilC語言與匯編語言混合編程1、在C文件中要嵌入?yún)R編代碼片以如下方式加入?yún)R編代碼:ttpragmaASMAssemblerCodeHerettpragmaENDASM2、在Project窗口中包含匯編代碼的C文件上右鍵,選擇Optionsfor”FileEditViewProjectFlashDebugPeripheralsToolsSVCSWindowIDS/Project一35Target1二SourceGroup1fEl!QJ)/適CA5MC:.園瀚delay,a01incLude02defineucharunsignelaylOOiSMKInna.一-.1-1|懇OptionsFo

2、rFileC_ASM.C.Alt+F7xata|*Open匸_A5M.COpen.C_ASM.Ist畫OpenMapFile11Rebuildalltargetfiles_3BuildtargetF7】TranslateC.ASM.CStopbuildfAddGroup.】川DFFHOFFH?rirarrrtr?s(void)(D_LOOF;OFFH,DLOOF點(diǎn)擊右邊的uGenerateAssemblerSRCFilen和“AssembleSRCFile使檢査框由灰色變成黑色(有效)狀態(tài)OptionsforFileC.ASI.rProperties|C51Path:E:MYTASKXSSRS

3、IGNALDISTURB1O1111KEILCASMCASM.Crinclude:inTargetBwild廠AlwaysBuild0GenerateAssemblerSRCFileFileType:|cSourcefileFSize:|487Bteslastchange:|SatNov1314:16:462010VAssembleSRCFile廠LinkPublicsOnly3、根據(jù)選擇的編譯模式,把相應(yīng)的庫文件(如Small模式時(shí),是KeilC51LibC51S.Lib)加入工程中,該文件必須作為工程的最后文件,在默認(rèn)安裝盤KEIL/C51/LIB/C51S.LibAddFilestoGr

4、oup*SourceGroupV查挨范圍Q):IQUBF5=0-詡C51BC.LZBC51BFFC.UBC51BFPL.LIE00C51BFFS.UB一一C51BL.LIBC5IBS.LIB_C51C.LIB審C51DS2A.LIB00C51DS2T.UEQpC51FPC.LIBRIBno5?C51FPL.LIBC51FPS.LIBijple51rripc.libluplc51infpl.libluplG51frips.lib亟|cSliril.libijplc51iti5.libfigC511IC.LIBC51HFPC.口Ei嗣C51HFPL.LIE00C51HFFS.口E匝JC51HL.L

5、IB函C51NS.LIBC51S.UB函C51L.LIBijple51me.Lib審CD51C.LIB匝JCD51FFC.口E亟CD51FPL.LXBSgCD5iFFS.m匝CD51L.LIBQ0CD51S.LIBQgjCHSIC.LIB亟CH51FFC.UB亟CHS1FPL.LTB審CH51FPS.LIB00CH51L.LIB嗣CH51S.LIBDJCSSIC.LIBQgjCS51FPC.LJB審CS51FPL.LIBnpiCSSIFFS.mjJHCSSlL.UB$CS51S.IIB審CX51C.UB審CX51FFC.UFQgCX51FPL.LIBQCX51FFS.LJE30CX51L.UB

6、邨15IS.LIBgplKTXSlBT.LJBQgjKTX51TNY.LJBAdd二IClseI文件名:|C51S.LIB文件類型(T):jLibraryfile4、編譯,即可生成目標(biāo)代碼來個(gè)實(shí)例吧:ttincludettdefineucharunsignedcharsbitLED1二Pl0:/*材*材*材*材*材*材*材*材*材*材*材*c嵌入?yún)R編例程材*材*材*材*材*材*材*材*材*材*材*材*/voiddelay_ms(void)ttpragmaasmMOVRO,#OFFHMOVRl,#OFFHD.L00P1:DJNZRO,D_LOOP1MOVRO,tiOFFHDJNZRl,D_LOO

7、P1ttpragmaendasmvoidmain(void)uchari;Pl=OxFF;while(1)i+;delay_ms();if(i=7)LED1=LED1;i二0;2.無參數(shù)傳遞的函數(shù)調(diào)用C51調(diào)用匯編函數(shù)1無參數(shù)傳遞的函數(shù)調(diào)用先來個(gè)例子:其中C_ASM.c和DELAY,a為項(xiàng)目中的兩個(gè)文件/*柯*柯*柯*柯*材*C_ASM.c*材*材*材/#includetidefineucharunsignedcharexternvoiddelayl00();sb譏LEDl=Pri;/*材*材*材*材*材*材*材*材*材*材*材*C嵌入?yún)R編例程材*材*材*材*材*材*材*材*材*材*材*材*/

8、voidmain(void)uchari;Pl=OxFF;while(1)i+:delayl00();if(i=7)LED1=LED1;i=0;;*材*材*材*材*材*DELAY1OO.a*?PR?DELAY1OOSEGMENTCODE;在程序存儲(chǔ)區(qū)中定義段PUBLICDELAY1OO:聲明函數(shù)RSEG7PR7DELAY100;函數(shù)可被連接器放置在任何地方DELAY1OO:MOVRO,#OFFHMOVRl,tiOFFHD_LOOP1:DJNZRO,D_LOOP1MOVRO,tiOFFHDJNZRl,D_LOOP1RETEND在C_ASM.c文件中,先聲明外部函數(shù),然后直接在main中調(diào)用即可。

9、在DELAY1OO.a中,?PR?DELAY1OOSEGMENTCODE;作用是在程序存儲(chǔ)區(qū)中定義段,DELAY100為段名,?PR?表示段位于程序存儲(chǔ)區(qū)內(nèi)PUBLICDELAY100:作用是聲明函數(shù)為公共函數(shù)RSEG?PR?DELAY1OO;表示函數(shù)可被連接器放置在任何地方,RSEG是段名的屬性段厲的開頭為PR,是為了和C51內(nèi)部命厲轉(zhuǎn)換兼容,命厲轉(zhuǎn)換規(guī)律如下:CODE-?PR?XDATA-7XDDATA-7DTBIT-7BIPDATA-7PD3.有參數(shù)傳遞的函數(shù)調(diào)用記住哦,c文件和A51文件不能使用同一個(gè)文件名,不過我還不知道為什么會(huì)這樣,有高手知道得話請(qǐng)告知。今天說說帶參數(shù)傳遞的函數(shù)調(diào)用

10、,在C51和匯編之間傳遞參數(shù)的方式有兩種,一種是通過寄存器傳遞參數(shù),C51中不同類型的實(shí)參會(huì)存入相應(yīng)的寄存器,在匯編中只需對(duì)相應(yīng)寄存器進(jìn)行操作,即達(dá)到傳遞參數(shù)的目的。不同類型的數(shù)據(jù)及其傳遞參數(shù)的寄存器如下表所示:在C和匯編混合編程的時(shí)候,存在C語言和匯編語言的變量以及函數(shù)的接口問題。在C程序中定義的變量,編譯為.asm文件后,都被放進(jìn)了.bss區(qū),而且變量名的前面都帶了一個(gè)下劃線。在C程序中定義的函數(shù),編譯后在函數(shù)名前也帶了一個(gè)下劃線。例如:externintnum就會(huì)變成bss_num,1externfloatnums5就會(huì)變成bss_nums,5externvoidfunc()就會(huì)變成_f

11、unc,匯編和c的相互調(diào)用可以分以下兒種情況:(1)匯編程序中訪問C程序中的變量和函數(shù)。在匯編程序中,用_xx就可以訪問c中的變量XXTo訪問數(shù)組時(shí),可以用_xx+偏移量來訪問,如_XX+3訪問了數(shù)組中的XX3o在匯編程序調(diào)用C函數(shù)時(shí),如果沒有參數(shù)傳遞,直接用_funcname就可以了。如果有參數(shù)傳遞,則函數(shù)中最左邊的一個(gè)參數(shù)由寄存器A給出,其他的參數(shù)按順序由堆棧給出。返回值是返回到A寄存器或者由A寄存器給出的地址。同時(shí)注意,為了能夠讓匯編語言能訪問到C語言中定義的變量和函數(shù),他們必須聲明為外部變量,即加extern前綴。(2)c程序中訪問匯編程序中的變量如果需耍在0程序中訪問匯編程序中的變量

12、,則匯編程序中的變量名必須以下劃線為首字符,并用global使之成為全局變量。如果需耍在0程序中調(diào)用匯編程序中的過程,則過程名必須以下劃線為首字符,并且,要根據(jù)c程序編譯時(shí)使用的模式是stack-basedmodel還是registerargumentmodel來正確地編寫該過程,使之能正確地取得調(diào)用參數(shù)。(3)在線匯編在C程序中直接插入asm(“*材”),內(nèi)嵌匯編語句,需要注意的是這種用法耍慎用,在線匯編提供了能直接讀寫硬件的能力,如讀寫中斷控制允許寄存器等,但編譯器并不檢査和分析在線匯編語言,插入在線匯編語言改變匯編環(huán)境或可能改變C變量的值可能導(dǎo)致嚴(yán)重的錯(cuò)誤。匯編和C接口中尋址方式的改變:

13、需要注意的是,在C語言中,對(duì)于局部變量的建立和訪問,是通過堆棧實(shí)現(xiàn)的,它的尋址是通過堆棧寄存器SP實(shí)現(xiàn)的。而在匯編語言中,為了使程序代碼變得更為精簡(jiǎn),TI在直接尋址方式中,地址的低7位直接包含在指令中,這低7位所能尋址的具體位置可由DP寄存器或SP寄存器決定。具體實(shí)現(xiàn)可通過設(shè)置ST1寄存器的CPL位實(shí)現(xiàn),CPL二0,DP尋址,CPL二1,SP尋址。在DP尋址的時(shí)候,由DP提供高9位地址,與低7位組成16位地址;在SP尋址的時(shí)候,16位地址是由SP(16位)與低7位直接相加得來。由于在C語言的環(huán)境下,局部變量的尋址必須通過SP寄存器實(shí)現(xiàn),在混合編程的時(shí)候,為了使匯編語言不影響堆棧寄存器SP,通常

14、的方式是在匯編環(huán)境中使用DP方式尋址,這樣可以使二者互不干擾。編程中只耍注意對(duì)CPL位正確設(shè)置即可1.word的意思就相當(dāng)與C語言里的int,char等定義一個(gè)變兩的寬度2.編譯錯(cuò)誤原因有2:如果在匯編里面定義.global(全局符號(hào)),那么在C語言里面應(yīng)該用extern聲明,以引用該符號(hào)。在匯編里面聲明的時(shí)候,符號(hào)前應(yīng)加下劃線,如FIQ_Addr:.wordEXTint_FI0應(yīng)為:FIQ_Addr:.word_EXTint_FIQ在C語言里面血用extern聲明。易外,一中方法是,用.ref代global來聲明符號(hào),這樣就不用在C源程序里面用extern聲明了。兩種方法結(jié)果相同。我講的是用

15、C和匯編混編程用法,至于C卄變量如何翻譯成匯編符號(hào)可以用仿真器,自己去看,原則類似.匯編與C語言混合編程的關(guān)鍵問題1C程序變量與匯編程序變量的共用為了使程序更易于接口和維護(hù),可以在匯編程序中引用與C程序共享的變量:.ref_to_dce_num,_todte_num,_to_dce_buff,_to_dte_buff在匯編程序中引用而在C程序可氏接定義的變量:unsignedcharto_dte_buffBUFF_SIZE;/DSP發(fā)向PC機(jī)的數(shù)據(jù)intto_dte_num;緩沖區(qū)中存放的有效字節(jié)數(shù)intto_dte_store;緩沖區(qū)的存放指針intto_dte_read;緩沖區(qū)的讀取指針這

16、樣經(jīng)過鏈接就可以完成對(duì)應(yīng)。2程序入口問題在C程序中,程序的入口是main()函數(shù)。而在匯編程序中其入口由*.cmd文件中的命令決定,如:-emain_start:程序入口地址為main_starto這樣,混合匯編出來的程序得不到正術(shù)結(jié)果。因?yàn)镃到ASM的匯編有默二的入口c-intOO,從這開始的一段程序?yàn)镃程序的運(yùn)行做準(zhǔn)備匚作。這些工作包括初始化變量、設(shè)置棧指針等,相當(dāng)于系統(tǒng)殼不能跨越。這時(shí)可在*.cmd文件中去掉語句:-emain.starto如仍想執(zhí)行某些匯編程序,可以C函數(shù)的形式執(zhí)行,如:main_start();其中含有其他匯編程序但前提是在匯編程序中ffi_main_start作為首地址,程序以rete結(jié)尾(作為可調(diào)用的函數(shù))的程序段,并在匯編程序中引用_main_start,即.ref_main_starta3移位問題在C語言中把變量設(shè)為char型時(shí),它是8位的,但在DSP匯編中此變量仍被作為16位處理。所以會(huì)出現(xiàn)在C程序中的移位結(jié)果與匯編程序移位結(jié)果不同的問題。解決的辦法是在C程序中,把移位結(jié)果再用0X00FF去“與”一下即可。4堆棧問

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論