資源描述:
《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)寄存器加載給tmpORRtmp,tmp,#80//將IRQ控制位置1MSRCPSR_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、的長度}#includeexternvoidstrcopy(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=srcstrprintf("Aftercopying:");printf("src=%s,dst=%s",srcstr,dststr);//顯示復(fù)制后的結(jié)果return(0);}AREAExample,CODE,READONLY@聲明代碼段ExampleEXPORTstrcopy@聲明strcopy,以便外部函數(shù)調(diào)用strcopy@R0為目標(biāo)字符串的地址,R1為源字符串的地址LDRBR2,[R1],#1@讀取字節(jié)數(shù)
7、據(jù),源地址加1STRBR2,[R0],#1@保存讀取的1字節(jié)數(shù)據(jù),目標(biāo)地址加1CMPR2,#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,READONLYIMPORTsum@聲明外部標(biāo)號(hào)sum,即C函數(shù)sum()EXPORTCALLSUMUMSTMFDSP!,{LR}@LR寄存器入棧MOVR0,#1@設(shè)置
8、sum函數(shù)入口參數(shù),R0為參數(shù)aMOVR1,#2@R1為參數(shù)bMOVR2,#3@R2為參數(shù)cMOVR3,#5@參數(shù)e=5,保存到堆棧中STRR3,{SP,#-4}!MOVR3,#4@R3為參數(shù)d,d=4BLsum@調(diào)用C程序中的sum函數(shù),結(jié)果放在R0中ADDSP,SP,#4@調(diào)整堆棧指針LDMFDSP,{PC}@程序返回END6.1