C語言和匯編語言混合編程(C55xDSP)

C語言和匯編語言混合編程(C55xDSP)

ID:36885699

大小:756.31 KB

頁數(shù):22頁

時(shí)間:2019-05-10

C語言和匯編語言混合編程(C55xDSP)_第1頁
C語言和匯編語言混合編程(C55xDSP)_第2頁
C語言和匯編語言混合編程(C55xDSP)_第3頁
C語言和匯編語言混合編程(C55xDSP)_第4頁
C語言和匯編語言混合編程(C55xDSP)_第5頁
資源描述:

《C語言和匯編語言混合編程(C55xDSP)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。

1、第6章C語言和匯編語言混合編程混合編程中參數(shù)傳遞和寄存器使用在很多DSP應(yīng)用中都使用C語言和匯編語言進(jìn)行混合編程。C語言具有可讀性高、便于維護(hù)和可移植性好等優(yōu)點(diǎn),然而匯編語言具有實(shí)時(shí)運(yùn)行效率高和代碼效率高的優(yōu)點(diǎn)。使用匯編語言可以更充分地利用DSP的硬件資源,例如乘累加單元、單指令重復(fù)、塊重復(fù)和塊移動(dòng)等。6.1混合編程中參數(shù)傳遞和寄存器使用某些程序使用匯編語言編寫時(shí),實(shí)時(shí)運(yùn)行效率是C語言的幾十倍或更多,運(yùn)算量越大,匯編語言編寫的程序?qū)崟r(shí)運(yùn)行效率越明顯。用C函數(shù)調(diào)用匯編子程序和C函數(shù)一樣有參數(shù)傳遞和返回問題,下面介紹用C

2、函數(shù)調(diào)用C55x匯編子程序的方法。6.1.1C語言和匯編語言之間名稱轉(zhuǎn)換C函數(shù)調(diào)用匯編子程序時(shí),匯編程序所有變量名和子函數(shù)名需加前綴下劃線“_”,例如使用_sum作為匯編語言程序子函數(shù)名。如果匯編程序中定義了變量,必須加前綴下劃線,C函數(shù)才能使用該變量。前綴“_”只在C編譯時(shí)使用,當(dāng)我們用C函數(shù)調(diào)用匯編子程序和變量時(shí),不需要加前綴“_”。以下是C函數(shù)調(diào)用匯編子程序的例子。FIQ的中斷向量地址在0x0000001C,而IRQ的在0x00000018。 當(dāng)允許IRQ中斷時(shí),CPSR[7]=0即CPSR的I位置為0.當(dāng)允許

3、FIQ中斷時(shí),CPSR[6]=0即CPSR的F位為0。 如果2個(gè)中斷同時(shí)發(fā)生時(shí),由于FIQ擁有最高中斷優(yōu)先級(jí),而IRQ只有中等中斷優(yōu)先級(jí),所以先執(zhí)行FIQ中斷(CPSR[7]=0),當(dāng)中斷結(jié)束后再執(zhí)行IRQ中斷(CPSR[6]=0)程序:   voiddisable_IRQ(void)//禁止中斷程序 { inttmp;//定義臨時(shí)變量,后面使用 __asm//內(nèi)嵌匯編程序的關(guān)鍵詞 { MRStmp,CPSR//把狀態(tài)寄存器加載給tmp ORRtmp,tmp,#80//將IRQ控制位置1 MSRCPSR_c,tmp

4、//加載程序狀態(tài)寄存器 } }EXPORTMessage@聲明全局標(biāo)號(hào)MessageDCB"HELLO$"@定義5個(gè)有效字符,$為結(jié)束符externchar*Message; intMessageLength() { intLength=0;char*pMessage;//定義字符指針變量pMessage=Message;//指針指向Message內(nèi)存塊的首地址while(*pMessage!='$')//$為字符串的結(jié)束符{ Length++;pMessage++; } return(Length);//返回字符串

5、的長度}#include externvoidstrcopy(char*d,constchar*s);//聲明,調(diào)用的匯編子程序 intmain(void) { constchar*srcstr="Firstource";//定義字符串常量 chardststr[]="Secondstring-destination";//定義字符串變量 printf("Beforecopying:"); printf("src=%s,dst=%s",srcstr,dststr);//顯示字符串的內(nèi)容 st

6、rcopy(dststr,srcstr);//調(diào)用匯編子程序R0=dststr,R1=srcstr printf("Aftercopying:"); printf("src=%s,dst=%s",srcstr,dststr);//顯示復(fù)制后的結(jié)果 return(0); }AREAExample,CODE,READONLY@聲明代碼段Example EXPORTstrcopy@聲明strcopy,以便外部函數(shù)調(diào)用strcopy@R0為目標(biāo)字符串的地址,R1為源字符串的地址LDRBR2,[R1],#1@讀取字節(jié)數(shù)

7、據(jù),源地址加1 STRBR2,[R0],#1@保存讀取的1字節(jié)數(shù)據(jù),目標(biāo)地址加1 CMPR2,#0@判斷字符是否復(fù)制完畢BNEstrcopy@沒有復(fù)制完,繼續(xù)循環(huán)復(fù)制MOVPC,LRintsum(inta,intb,intc,intd,inte) { return(a+b+c+d+e);//返回5個(gè)變量的和}AREAExample,CODE,READONLY IMPORTsum@聲明外部標(biāo)號(hào)sum,即C函數(shù)sum() EXPORTCALLSUM UMSTMFDSP!,{LR}@LR寄存器入棧MOVR0,#1@設(shè)置

8、sum函數(shù)入口參數(shù),R0為參數(shù)a MOVR1,#2@R1為參數(shù)b MOVR2,#3@R2為參數(shù)c MOVR3,#5@參數(shù)e=5,保存到堆棧中STRR3,{SP,#-4}! MOVR3,#4@R3為參數(shù)d,d=4 BLsum@調(diào)用C程序中的sum函數(shù),結(jié)果放在R0中ADDSP,SP,#4@調(diào)整堆棧指針LDMFDSP,{PC}@程序返回END6.1

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。