MSP430 單片機C語言和匯編語言混合編程_第1頁
MSP430 單片機C語言和匯編語言混合編程_第2頁
MSP430 單片機C語言和匯編語言混合編程_第3頁
MSP430 單片機C語言和匯編語言混合編程_第4頁
MSP430 單片機C語言和匯編語言混合編程_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、MSP430 單片機C語言和匯編語言混合編程Mixing C and Assembler With the MSP430劉玉宏Liu,Yuhong摘要:為了發(fā)揮C語言和匯編語言各自的優(yōu)點,二者需要相互調(diào)用函數(shù)。本文首先介紹了MSP430單片機的C語言函數(shù)的參數(shù)傳遞規(guī)則,然后對C語言和匯編語言的混合編程進行了詳細描述,最后給出應用實例。關鍵字:MSP430單片機 IAR C語言 匯編語言 混合編程中圖分類號:TP368.1 文獻標識碼:AAbstract:In order to play the vritues of c and assembler language,they need to c

2、all each others function. This paper describes the rules of C-Compiler for passing variables between functions, mixing c and assembler with MSP430 in details,then gives an application example.Keyword:MSP430 MCU;IAR C-Compiler;Assembler Language;Mixing ProgrammingMSP430是一款16位的單片機,它具有超低功耗、豐富的片內(nèi)外圍模塊、多樣

3、的可選型號、軟件對硬件的靈活控制能力等優(yōu)點。因此特別適合于以電池為電源的應用場合或手持設備,目前在國內(nèi)主要應用于三表系統(tǒng)和消防設備方面。MSP430單片機的開發(fā)軟件較常用的是IAR公司的IAR Embedded Workbench集成開發(fā)環(huán)境,它可以編輯、匯編和編譯匯編語言和C語言源文件,并且其C語言和匯編語言具有相同格式的頭文件,給開發(fā)帶來了靈活性。C語言具有編程簡單,可以移植等優(yōu)點,但是產(chǎn)生代碼較長,對硬件的直接控制能力相對較弱;匯編語言產(chǎn)生的代碼較小,控制硬件靈活,但是可讀性差,移植困難,因此為了發(fā)揮各自優(yōu)點,產(chǎn)生高速度、高效率的代碼混合編程是最好的選擇。1 IAR C語言編譯器的參數(shù)傳

4、遞規(guī)則1.1 寄存器應用C語言編譯器把單片機的寄存器分成兩組來使用:(1)高速暫存器(R12R15),這組寄存器專門用作參數(shù)傳遞,因此調(diào)用時不需要保護。(2)其它普通寄存器(R4R11),這組寄存器主要用作寄存器變量和保存中間結果,因此調(diào)用時必需保護,這一點C語言編譯器是自動處理的。1.2 堆棧結構和參數(shù)傳遞除最左邊的兩個參數(shù)外,其余參數(shù)入棧傳遞中斷返回地址被保護的寄存器高地址堆棧指針堆棧低地址每一次函數(shù)調(diào)用會創(chuàng)建一個如圖所示的堆棧結構一個調(diào)用者函數(shù)傳遞給被調(diào)用函數(shù)的參數(shù)按照從右到左的順序傳遞的,換句話說就是除了最左邊的兩個參數(shù)用寄存器傳遞外,其余參數(shù)用堆棧傳遞,并按從右到左的順序入棧。若最左

5、邊的兩個參數(shù)屬于結構或聯(lián)合類型,那么它們也用堆棧傳遞。函數(shù)的返回結果根據(jù)其類型存放在R12或R13:R12寄存器對,若返回結果屬于結構或聯(lián)合類型,那么R12中存放的是指向返回結果的指針。1.3 中斷函數(shù)C語言編譯器編譯中斷函數(shù)時會自動保護所有用到的寄存器(包括R12R15在內(nèi)),狀態(tài)寄存器SR的保護是中斷處理過程自動完成的。中斷函數(shù)中用到的任何寄存器都會用PUSH Rxx指令保護,中斷服務結束用后POP Rxx指令恢復;RETI指令會自動恢復狀態(tài)寄存器SR和從中斷返回。2 對匯編語言函數(shù)的約定一個能被C語言函數(shù)調(diào)用的匯編語言函數(shù)必須做到以下幾點:(1)符合C語言編譯器的參數(shù)傳遞規(guī)則。(2)具有

6、PUBLIC入口標號。(3)對C語言調(diào)用者函數(shù)聲明為外部函數(shù),并且允許參數(shù)類型檢查和提升(可選)。2.1 局部存儲分配如果匯編語言函數(shù)需要局部存儲空間,有兩種分配方法:(1)分配在硬件堆棧(2)分配在靜態(tài)空間,但是函數(shù)不能重入。2.2 中斷函數(shù)因為中斷可能發(fā)生在程序執(zhí)行的任何期間,所以調(diào)用約定并不適用于中斷函數(shù)。因此必需注意以下幾點:(1)必須保護所有用到的寄存器。(2)必須用RETI返回。(3)把SR中各標志位當做未定義來使用。(4)中斷向量定義在INTVEC段3 混合編程明確了以上約定,混合編程就非常容易?;咀龇ㄊ牵海?)C語言源文件用extren關鍵字導入被匯編語言源文件導出的標號。(

7、2)匯編語言源文件用PUBLIC關鍵字把標號導出給C語言源文件。(3)匯編語言源文件用EXTREN關鍵字導入被C語言源文件導出的標號。(4)C語言源文件把標號導出給匯編語言文件,則不需要關鍵字。(5)把寫好的C語言源文件和匯編語言源文件加入工程,并用各自調(diào)用函數(shù)的指令調(diào)用即可。4 應用實例4.1 C 語言函數(shù)和匯編語言函數(shù)相互調(diào)用在這個示例中C語言函數(shù)main()調(diào)用匯編語言函數(shù)get_rand()以得到一個隨機數(shù);匯編語言函數(shù)get_rand()首先調(diào)用C語言的標準庫函數(shù)rand()得到一個整型隨機值,然后用調(diào)用C語言函數(shù)mult()的方法把這個隨機值乘以main()函數(shù)傳遞給自己的實參,并

8、把乘積值返回給main()函數(shù)。4.1.1 C語言源文件/*/* 文件名:c_source.c 2003-01-05 */* C語言和匯編語言混合編程,C源程序 */* 這段源程序調(diào)用匯編語言函數(shù)get_rand() */* 注意工程必需包含匯編語言源文件 "asm_source.s43" */*/#include <MSP430x14x.h> /* 頭文件 */extern unsigned long get_rand(unsigned char seed); /* 匯編語言函數(shù)原型聲明 */*/* 主函數(shù) */*/void main( void ) unsi

9、gned char seed; /* 局部變量定義*/ unsigned long value;/ = 系統(tǒng)初始化 = IFG1 = 0; /* 清除中斷標志1 */ WDTCTL = WDTPW+WDTHOLD; /* 停止看門狗 */ P1DIR = 0xff;/ = 系統(tǒng)初始化結束= seed = 0x55; value = get_rand(seed); /* 調(diào)用匯編語言函數(shù)get_rand()得到一個隨機數(shù) */ while(1); /*程序結束*/ = 主程序結束 =/*/* 乘法子程序,供匯編語言函數(shù)調(diào)用 */*/unsigned long mult(int x , int y

10、) return (x *y); /*x乘y */ = 乘法子程序結束 =4.1.2 匯編語言源程序; *; 文件名: asm_source.s43; C語言和匯編語言混合編程,匯編語言源程序; 這段源程序調(diào)用兩個C語言函數(shù),標準庫函數(shù)rand()和用戶自定義函數(shù)mult(); * #include "msp430x14x.h" ; 頭文件 NAME asmfile EXTERN rand ; C語言標準庫函數(shù)rand() EXTERN mult ; c_source.c中用戶自定義函數(shù) ;=; get_rand;= PUBLIC get_rand ; 導出函數(shù)名給C語言函

11、數(shù) RSEG CODEget_rand; push R11 ; 普通寄存器入棧保護 mov.b R12,R11 ; C 函數(shù)傳遞的實參在R12中,送入R16暫存 Call #rand ; 調(diào)用 C 函數(shù) rand() ; 函數(shù)值為整型返回在R12中 ; rand()函數(shù)值作為mult()函數(shù)的第一實參 ; 送入R12進行參數(shù)傳遞 mov R11,R14 ; C 函數(shù)傳遞的實參作為mult()函數(shù)的第二實參 ; 送入R14進行參數(shù)傳遞 Call #mult ; mult()值返回在 R12 / R13寄存器對 pop R11 ; 出棧恢復寄存器內(nèi)容 ret END4.2 匯編語言編寫中斷服務程序

12、為了提高整個系統(tǒng)響應速度,要求中斷服務程序的執(zhí)行時間較短,執(zhí)行速度較快,因此最好的方法就是用匯編語言編寫中斷服務程序。但要注意:1、中斷服務程序不能有參數(shù)傳遞和返回值。2、中斷服務程序中所有被用到的寄存器都需要保護。本示例用匯編語言編寫了看門狗定時器的中斷服務程序,用C語言編寫了主程序。4.2.1 C語言主程序/*/* 文件名:c_main.c 2003-01-08 */* C語言和匯編語言混合編程,C源程序 */* 這段源程序被看門狗定時器中斷后執(zhí)行匯編語言函數(shù)編寫的中斷服務程序 */* 注意工程必需包含匯編語言源文件 "wdt_int.s43" */*/#include

13、 <MSP430x14x.h> /* 頭文件 */*/*主函數(shù) */*/void main( void )/ = 系統(tǒng)初始化 = IFG1=0; /* 清除中斷標志1 */ WDTCTL=WDT_MDLY_32; /* 看門狗的定時間隔為 32ms */ P1DIR = 0x01; /* P1.0 設置為輸出 */ IFG1 &= WDTIFG; /* 清除已掛起的看門狗定時器中斷 */ IE1 |= WDTIE; /* 允許看門狗定時器中斷 */ _EINT();/ = 系統(tǒng)初始化結束= while(1); /*主程序是一段死循環(huán)/ = 主函數(shù)結束 =4.2.2 匯編語言

14、中斷服務程序;*; 文件名: wdt_int.s43; C語言和匯編語言混合編程,匯編語言源程序; 看門狗定時器中斷服務程序;* NAME WDT_ISR #include "msp430x14x.h" ; 頭文件; =; 看門狗定時器中斷服務程序;= PUBLIC wdt_isr ; 導出函數(shù)名給C語言函數(shù) RSEG CODE wdt_isr xor.b #001h,&P1OUT ; 觸發(fā) P1.0,led 亮滅轉換 reti ; 中斷返回;= COMMON INTVEC(1) ; 中斷向量段;= ORG WDT_VECTOR DW wdt_isr END5 結束

15、語以上方法已用于筆者的實際項目,取得良好效果,但是要注意編譯器的某些選項對程序生成代碼是有影響的。例如:匯編語言函數(shù)對標號大小寫敏感與否,影響C語言函數(shù)的變量名、程序名。若使用ROM MONTIOR,則C編譯器要用-ur45選項編譯,并且匯編語言中只要使用R4和R5,都要加以保護,否則無法返回ROM MONTIOR。參考文獻1 IAR MSP430 C Compiler Programming Guide2 IAR MSP430 Assembler, Linker and Librarian Programming Guide3 MSP430x3xx Family Users Guide, literature number SLAU0124 MSP430x1xx Family Users Guide, literature number SLAU0495 MSP430x4xx Family Users Guide, literature number SLAU056作者簡介:劉玉宏,男,1972年9月生,漢族,河海大學常州校區(qū)講師,主要從事單片機及嵌入式系統(tǒng)方面的教學和研究。E_MAIL:vido_liu(213022 江蘇常州 河海大學常州校區(qū)信息學院)劉玉宏introduction of author:Liu,yuhong,male,born in may,

溫馨提示

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

最新文檔

評論

0/150

提交評論