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

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

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

1.1 寄存器應(yīng)用

C語(yǔ)言編譯器把單片機(jī)的寄存器分成兩組來(lái)使用:

(1)高速暫存器(R12-R15),這組寄存器專門(mén)用作參數(shù)傳遞,因此調(diào)用時(shí)不需要保護(hù)。

(2)其它普通寄存器(R4-R11),這組寄存器主要用作寄存器變量和保存中間結(jié)果,因此調(diào)用時(shí)必需保護(hù),這一點(diǎn)C語(yǔ)言編譯器是自動(dòng)處理的。

1.2 堆棧結(jié)構(gòu)和參數(shù)傳遞

每一次函數(shù)調(diào)用會(huì)創(chuàng)建一個(gè)如圖所示的堆棧結(jié)構(gòu)

 一個(gè)調(diào)用者函數(shù)傳遞給被調(diào)用函數(shù)的參數(shù)按照從右到左的順序傳遞的,換句話說(shuō)就是除了最左邊的兩個(gè)參數(shù)用寄存器傳遞外,其余參數(shù)用堆棧傳遞,并按從右到左的順序入棧。若最左邊的兩個(gè)參數(shù)屬于結(jié)構(gòu)或聯(lián)合類型,那么它們也用堆棧傳遞。函數(shù)的返回結(jié)果根據(jù)其類型存放在R12或R13:R12寄存器對(duì),若返回結(jié)果屬于結(jié)構(gòu)或聯(lián)合類型,那么R12中存放的是指向返回結(jié)果的指針。

1.3 中斷函數(shù)

C語(yǔ)言編譯器編譯中斷函數(shù)時(shí)會(huì)自動(dòng)保護(hù)所有用到的寄存器(包括R12-R15在內(nèi)),狀態(tài)寄存器SR的保護(hù)是中斷處理過(guò)程自動(dòng)完成的。中斷函數(shù)中用到的任何寄存器都會(huì)用PUSH Rxx指令保護(hù),中斷服務(wù)結(jié)束用后POP Rxx指令恢復(fù);RETI指令會(huì)自動(dòng)恢復(fù)狀態(tài)寄存器SR和從中斷返回。

2  對(duì)匯編語(yǔ)言函數(shù)的約定

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

2.1  局部存儲(chǔ)分配

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

2.2 中斷函數(shù)

因?yàn)橹袛嗫赡馨l(fā)生在程序執(zhí)行的任何期間,所以調(diào)用約定并不適用于中斷函數(shù)。因此必需注意以下幾點(diǎn):
    (1)必須保護(hù)所有用到的寄存器。
    (2)必須用RETI返回。
    (3)把SR中各標(biāo)志位當(dāng)做未定義來(lái)使用。
    (4)中斷向量定義在INTVEC段

[!--empirenews.page--]

3 混合編程

明確了以上約定,混合編程就非常容易?;咀龇ㄊ牵?br />     (1)C語(yǔ)言源文件用‘extren’關(guān)鍵字導(dǎo)入被匯編語(yǔ)言源文件導(dǎo)出的標(biāo)號(hào)。
    (2)匯編語(yǔ)言源文件用‘PUBLIC’關(guān)鍵字把標(biāo)號(hào)導(dǎo)出給C語(yǔ)言源文件。
    (3)匯編語(yǔ)言源文件用‘EXTREN’關(guān)鍵字導(dǎo)入被C語(yǔ)言源文件導(dǎo)出的標(biāo)號(hào)。
    (4)C語(yǔ)言源文件把標(biāo)號(hào)導(dǎo)出給匯編語(yǔ)言文件,則不需要關(guān)鍵字。
    (5)把寫(xiě)好的C語(yǔ)言源文件和匯編語(yǔ)言源文件加入工程,并用各自調(diào)用函數(shù)的指令調(diào)用即可。

4 應(yīng)用實(shí)例

4.1  C 語(yǔ)言函數(shù)和匯編語(yǔ)言函數(shù)相互調(diào)用

在這個(gè)示例中C語(yǔ)言函數(shù)main()調(diào)用匯編語(yǔ)言函數(shù)get_rand()以得到一個(gè)隨機(jī)數(shù);匯編語(yǔ)言函數(shù)get_rand()首先調(diào)用C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù)rand()得到一個(gè)整型隨機(jī)值,然后用調(diào)用C語(yǔ)言函數(shù)mult()的方法把這個(gè)隨機(jī)值乘以main()函數(shù)傳遞給自己的實(shí)參,并把乘積值返回給 main()函數(shù)。

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

[!--empirenews.page--]

4.1.2 匯編語(yǔ)言源程序
; ******************************************************************
; 文件名: asm_source.s43
; C語(yǔ)言和匯編語(yǔ)言混合編程,匯編語(yǔ)言源程序
; 這段源程序調(diào)用兩個(gè)C語(yǔ)言函數(shù),標(biāo)準(zhǔn)庫(kù)函數(shù)rand()和用戶自定義函數(shù)mult()
; *******************************************************************
        #include "msp430x14x.h"     ; 頭文件
        NAME asmfile
       
        EXTERN rand                 ; C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)rand()
        EXTERN mult                 ; c_source.c中用戶自定義函數(shù)   
       
;====================================================================
; get_rand
;====================================================================
        PUBLIC get_rand             ; 導(dǎo)出函數(shù)名給C語(yǔ)言函數(shù)
        RSEG CODE
get_rand;
        push R11                    ; 普通寄存器入棧保護(hù)
        mov.b R12,R11               ; C 函數(shù)傳遞的實(shí)參在R12中,送入R16暫存
       
        Call #rand                   ; 調(diào)用 C 函數(shù) rand()
                                    ; 函數(shù)值為整型返回在R12中
       
                                    ; rand()函數(shù)值作為mult()函數(shù)的第一實(shí)參
                                    ; 送入R12進(jìn)行參數(shù)傳遞
        mov R11,R14                 ; C 函數(shù)傳遞的實(shí)參作為mult()函數(shù)的第二實(shí)參
                                    ; 送入R14進(jìn)行參數(shù)傳遞
        Call #mult                   ; mult()值返回在 R12 / R13寄存器對(duì)
        pop R11                     ; 出?;謴?fù)寄存器內(nèi)容                                   
        ret       
END

4.2 匯編語(yǔ)言編寫(xiě)中斷服務(wù)程序

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

4.2.1  C語(yǔ)言主程序
/********************************************************************/
/* 文件名:c_main.c                                        2003-01-08 */
/* C語(yǔ)言和匯編語(yǔ)言混合編程,C源程序                                */
/* 這段源程序被看門(mén)狗定時(shí)器中斷后執(zhí)行匯編語(yǔ)言函數(shù)編寫(xiě)的中斷服務(wù)程序 */
/* 注意工程必需包含匯編語(yǔ)言源文件 "wdt_int.s43"                       */
/********************************************************************/
#include <MSP430x14x.h> /*  頭文件  */
/********************************************************************/
/*主函數(shù)                                                            */
/********************************************************************/
void main( void )
{
// === 系統(tǒng)初始化 =============================================
    IFG1=0;    /* 清除中斷標(biāo)志1 */
    WDTCTL=WDT_MDLY_32;     /* 看門(mén)狗的定時(shí)間隔為 32ms */
    P1DIR = 0x01;   /* P1.0 設(shè)置為輸出 */
    IFG1 &= ~WDTIFG; /* 清除已掛起的看門(mén)狗定時(shí)器中斷 */
    IE1 |= WDTIE;   /* 允許看門(mén)狗定時(shí)器中斷 */
    _EINT();
// === 系統(tǒng)初始化結(jié)束===========================================
    while(1);   /*主程序是一段死循環(huán)
}
// === 主函數(shù)結(jié)束 ==============================================

[!--empirenews.page--]

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

5 結(jié)束語(yǔ)


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

參考文獻(xiàn)
[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
 

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉