女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > 單片機 > 單片機
[導讀]MSP430是一款16位的單片機,它具有超低功耗、豐富的片內外圍模塊、多樣的可選型號、軟件對硬件的靈活控制能力等優(yōu)點。因此特別適合于以電池為電源的應用場合或手持設備,目前在國內主要應用于三表系統(tǒng)和消防設備方面

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

1  IAR C語言編譯器的參數傳遞規(guī)則

1.1 寄存器應用

C語言編譯器把單片機的寄存器分成兩組來使用:

(1)高速暫存器(R12-R15),這組寄存器專門用作參數傳遞,因此調用時不需要保護。

(2)其它普通寄存器(R4-R11),這組寄存器主要用作寄存器變量和保存中間結果,因此調用時必需保護,這一點C語言編譯器是自動處理的。

1.2 堆棧結構和參數傳遞

每一次函數調用會創(chuàng)建一個如圖所示的堆棧結構

 一個調用者函數傳遞給被調用函數的參數按照從右到左的順序傳遞的,換句話說就是除了最左邊的兩個參數用寄存器傳遞外,其余參數用堆棧傳遞,并按從右到左的順序入棧。若最左邊的兩個參數屬于結構或聯合類型,那么它們也用堆棧傳遞。函數的返回結果根據其類型存放在R12或R13:R12寄存器對,若返回結果屬于結構或聯合類型,那么R12中存放的是指向返回結果的指針。

1.3 中斷函數

C語言編譯器編譯中斷函數時會自動保護所有用到的寄存器(包括R12-R15在內),狀態(tài)寄存器SR的保護是中斷處理過程自動完成的。中斷函數中用到的任何寄存器都會用PUSH Rxx指令保護,中斷服務結束用后POP Rxx指令恢復;RETI指令會自動恢復狀態(tài)寄存器SR和從中斷返回。

2  對匯編語言函數的約定

一個能被C語言函數調用的匯編語言函數必須做到以下幾點:
    (1)符合C語言編譯器的參數傳遞規(guī)則。
    (2)具有PUBLIC入口標號。
    (3)對C語言調用者函數聲明為外部函數,并且允許參數類型檢查和提升(可選)。

2.1  局部存儲分配

如果匯編語言函數需要局部存儲空間,有兩種分配方法:
    (1)分配在硬件堆棧
    (2)分配在靜態(tài)空間,但是函數不能重入。

2.2 中斷函數

因為中斷可能發(fā)生在程序執(zhí)行的任何期間,所以調用約定并不適用于中斷函數。因此必需注意以下幾點:
    (1)必須保護所有用到的寄存器。
    (2)必須用RETI返回。
    (3)把SR中各標志位當做未定義來使用。
    (4)中斷向量定義在INTVEC段

3 混合編程

明確了以上約定,混合編程就非常容易。基本做法是:
    (1)C語言源文件用‘extren’關鍵字導入被匯編語言源文件導出的標號。
    (2)匯編語言源文件用‘PUBLIC’關鍵字把標號導出給C語言源文件。
    (3)匯編語言源文件用‘EXTREN’關鍵字導入被C語言源文件導出的標號。
    (4)C語言源文件把標號導出給匯編語言文件,則不需要關鍵字。
    (5)把寫好的C語言源文件和匯編語言源文件加入工程,并用各自調用函數的指令調用即可。

4 應用實例

4.1  C 語言函數和匯編語言函數相互調用

在這個示例中C語言函數main()調用匯編語言函數get_rand()以得到一個隨機數;匯編語言函數get_rand()首先調用C語言的標準庫函數rand()得到一個整型隨機值,然后用調用C語言函數mult()的方法把這個隨機值乘以main()函數傳遞給自己的實參,并把乘積值返回給 main()函數。

4.1.1  C語言源文件
/**************************************************************/
/* 文件名:c_source.c                                 2003-01-05 */
/* C語言和匯編語言混合編程,C源程序                          */
/* 這段源程序調用匯編語言函數get_rand()                         */
/* 注意工程必需包含匯編語言源文件 "asm_source.s43"               */
/**************************************************************/
#include <MSP430x14x.h>     /* 頭文件 */
extern unsigned long get_rand(unsigned char seed);    /* 匯編語言函數原型聲明 */
/****************************************************************/
/* 主函數                                                       */
/****************************************************************/
void main( void )
{
    unsigned char seed;   /* 局部變量定義*/
    unsigned long value;
// === 系統(tǒng)初始化 ==========================================
    IFG1 = 0;     /* 清除中斷標志1 */
    WDTCTL = WDTPW+WDTHOLD;   /* 停止看門狗 */
    P1DIR = 0xff;
// === 系統(tǒng)初始化結束========================================
   
    seed = 0x55;
    value = get_rand(seed);  /* 調用匯編語言函數get_rand()得到一個隨機數 */
    while(1);   /*程序結束*/
}
// === 主程序結束 ==================================================
/******************************************************************/
/* 乘法子程序,供匯編語言函數調用 */
/******************************************************************/
unsigned long mult(int x , int y)
{
    return (x *y);   /*x乘y */
}
// === 乘法子程序結束 ================================================

4.1.2 匯編語言源程序
; ******************************************************************
; 文件名: asm_source.s43
; C語言和匯編語言混合編程,匯編語言源程序
; 這段源程序調用兩個C語言函數,標準庫函數rand()和用戶自定義函數mult()
; *******************************************************************
        #include "msp430x14x.h"     ; 頭文件
        NAME asmfile
       
        EXTERN rand                 ; C語言標準庫函數rand()
        EXTERN mult                 ; c_source.c中用戶自定義函數   
       
;====================================================================
; get_rand
;====================================================================
        PUBLIC get_rand             ; 導出函數名給C語言函數
        RSEG CODE
get_rand;
        push R11                    ; 普通寄存器入棧保護
        mov.b R12,R11               ; C 函數傳遞的實參在R12中,送入R16暫存
       
        Call #rand                   ; 調用 C 函數 rand()
                                    ; 函數值為整型返回在R12中
       
                                    ; rand()函數值作為mult()函數的第一實參
                                    ; 送入R12進行參數傳遞
        mov R11,R14                 ; C 函數傳遞的實參作為mult()函數的第二實參
                                    ; 送入R14進行參數傳遞
        Call #mult                   ; mult()值返回在 R12 / R13寄存器對
        pop R11                     ; 出?;謴图拇嫫鲀热?nbsp;                                  
        ret       
END

4.2 匯編語言編寫中斷服務程序

為了提高整個系統(tǒng)響應速度,要求中斷服務程序的執(zhí)行時間較短,執(zhí)行速度較快,因此最好的方法就是用匯編語言編寫中斷服務程序。但要注意:1、中斷服務程序不能有參數傳遞和返回值。2、中斷服務程序中所有被用到的寄存器都需要保護。本示例用匯編語言編寫了看門狗定時器的中斷服務程序,用C語言編寫了主程序。

4.2.1  C語言主程序
/********************************************************************/
/* 文件名:c_main.c                                        2003-01-08 */
/* C語言和匯編語言混合編程,C源程序                                */
/* 這段源程序被看門狗定時器中斷后執(zhí)行匯編語言函數編寫的中斷服務程序 */
/* 注意工程必需包含匯編語言源文件 "wdt_int.s43"                       */
/********************************************************************/
#include <MSP430x14x.h> /*  頭文件  */
/********************************************************************/
/*主函數                                                            */
/********************************************************************/
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)
}
// === 主函數結束 ==============================================

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

5 結束語


以上方法已用于筆者的實際項目,取得良好效果,但是要注意編譯器的某些選項對程序生成代碼是有影響的。例如:匯編語言函數對標號大小寫敏感與否,影響C語言函數的變量名、程序名。若使用ROM MONTIOR,則C編譯器要用-ur45選項編譯,并且匯編語言中只要使用R4和R5,都要加以保護,否則無法返回ROM MONTIOR。

參考文獻
[1] IAR MSP430 C Compiler Programming Guide
[2] IAR MSP430 Assembler, Linker and Librarian Programming Guide
[3] MSP430x3xx Family User’s Guide, literature number SLAU012
[4] MSP430x1xx Family User’s Guide, literature number SLAU049
[5] MSP430x4xx Family User’s Guide, literature number SLAU056
 

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

?MSP430電容觸摸?是指使用MSP430微控制器(MCU)實現的電容觸摸感應技術。MSP430系列MCU以其低功耗和豐富的外設模塊著稱,特別適用于電容觸摸應用。

關鍵字: MSP430

在許多領域得到廣泛的應用,特別是它的超級低功耗特性,是目前所有其他單片機無法比擬的

關鍵字: TI公司 MSP430

在微控制器領域,MSP430與STM32無疑是兩顆璀璨的明星。它們各自憑借其獨特的技術特點和廣泛的應用領域,在市場上占據了重要的位置。本文將深入解析MSP430與STM32之間的區(qū)別,探討它們在不同應用場景下的優(yōu)勢和局限...

關鍵字: MSP430 STM32 單片機

在科研以及應用軟件領域,LabVIEW和MATLAB作為比較常用的2款工具,相信很多人都用過吧。簡單的概括一下,LabVIEW側重測試測量和數據采集,MATLAB側重科學計算和數據分析。

關鍵字: LabVIEW matlab 混合編程

MCS-51單片機的匯編語言程序由若干條匯編語言指令和偽指令構成。指令存放在程序存儲器中,被單片機讀取并執(zhí)行,且執(zhí)行結果將影響單片機自身的狀態(tài)。

關鍵字: 匯編語言 偽指令

目前,結構化是程序設計的基本要求,可以使程序結構清晰、易于讀寫且方便調試,也能夠提高程序設計的效率。在結構化程序設計中,程序的基本結構有三種,即順序結構、分支結構及循環(huán)結構。而子程序(也被稱為函數或過程)是一種提高程序模...

關鍵字: 匯編語言 順序程序設計

在單片機系統(tǒng)設計中,程序設計是重要的一環(huán),它的質量直接影響到整個系統(tǒng)的功能。用匯編語言進行程序設計的過程和用高級語言設計程序有相似之處,其設計過程大致可以分為以下幾個步驟:

關鍵字: 匯編語言 程序設計 單片機

匯編語言(Assembly Language)是任何一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符代替機器指令的操作碼,用地址符號或標號代替指令或操作數的地址。在...

關鍵字: 匯編語言 指令 單片機

摘 要:為了能通過串口采集電能參數,完成一種基于串口的三相電能采集設備的研制,設計了電能采集設備的硬件和軟件部分。其中硬件采用MCU+專用電能計量芯片的結構,結構簡單;軟件則用于實現輸入、輸出、三相電能參數的采集和串行通...

關鍵字: 電能采集 ATT7022B MSP430 串口

C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特點。它由美國貝爾研究所的D.M.Ritchie于1972年推出,1978年后,C語言已先后被移植到大、中、小及微型機上,它可以作為工作系統(tǒng)設計語言...

關鍵字: C語言 匯編語言
關閉