新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430頭文件中 DEFC DEFW 及周邊的解釋

        msp430頭文件中 DEFC DEFW 及周邊的解釋

        作者: 時間:2016-11-25 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/321175.htm

        使用語法如下:

        label SET expr

        label EQU expr

        label = expr

        label DEFINE expr

        [const] sfrb register = value

        [const] sfrw register = value

        其中,

        label 定義一個標志符、

        expr 標志符的值、

        register 特殊功能寄存器、

        value 特殊功能寄存器的值。

        在下面的例子中使用了局部變量與全局變量,在模塊add1 中定義了符號value ,同樣在

        模塊add2 中也定義了符號value,但它們表示兩個不同的量,都只在各自的模塊內部有效,

        這是局部變量。而在模塊add1 中定義的locn 則為全局變量,在兩個模塊中表示同一個值。

        NAME add1

        locn DEFINE 100H

        value EQU 77

        MOV locn,R4

        ADD #value,R4

        ENDMOD

        NAME add2

        value EQU 88

        MOV locn,R5

        ADD #value,R5

        END

        很明顯,“=”也就是EQU,作用是:在當前模塊中賦予一個永久的值。

        至此,

        #define DEFCW(name, address) __no_init union

        {

        struct

        {

        volatile unsigned charname##_L;

        volatile unsigned charname##_H;

        };

        volatile unsigned short name;

        } @ address;

        這種定義也變得相對好理解。以上的這種定義只是多了一個union的定義,將一個16位的地址存儲空間分成2個8bits或者1個16位。可以實現字訪問,也可以實現字節訪問。以上定義是將一個無名的union與address聯系起來,使得訪問address對應的內存時,就像訪問union一樣。

        那么對于下面的一些看起來貌似比較復雜的定義就相對比較好理解了:

        #defineRF1AIFCTL1_ (0x0F02u)

        DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

        #defineRF1AIFIFG RF1AIFCTL1_L

        #defineRF1AIFIE RF1AIFCTL1_H

        可以發現,第一個宏定義,“RF1AIFCTL1_”在字符串的最后帶一個下劃線,其實代表這只是一個地址。而通過宏擴展DEFCW( RF1AIFCTL1 , RF1AIFCTL1_),將會被擴展為:

        __no_init union

        {

        struct

        {

        volatile unsigned charRF1AIFCTL1_L;

        volatile unsigned charRF1AIFCTL1_H;

        };

        volatile unsigned short RF1AIFCTL1;

        } @ (0x0F02u);

        關于@的用法,今天查閱了《MSP430 IAR C/EC++ Compiler Reference Guide》,找到了結果:

        A variable that has been explicitly placed at an address, for example by using the compiler @ syntax, will be placed in either the DATA16_AC or the DATA16_AN segment.

        從中可以看出,@是一種語法。那么它的作用很明顯就是將變量放置到對應的地址中。使用@,一個變量可以明確的制定一個存儲地址。

        因此之前的宏定義就變得好理解了。

        #define DEFC(name, address) __no_init volatile unsigned char name @ address;

        就是將name變量存放在address地址中,那么如此一來就可以為每個寄存器進行命名了,也就是說可以實現每個寄存器對應一個或者多個變量。

        至此頭文件中另外一個問題也迎刃而解:

        #defineRF1AIFCTL1_ (0x0F02u)

        DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

        #defineRF1AIFIFG RF1AIFCTL1_L

        #defineRF1AIFIE RF1AIFCTL1_H

        我們將DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)展開:

        __no_init union

        {

        struct

        {

        volatile unsigned charRF1AIFCTL1_L;

        volatile unsigned charRF1AIFCTL1_H;

        };

        volatile unsigned short RF1AIFCTL1;

        } @ (0x0F02u);

        那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已經聲明成為一個變量,存放的地址分別是0x0F02u,0x0F02u+1,0x0F02u。因此接下來后面兩條宏定義就自然的解開了。

        #defineRF1AIFIFG RF1AIFCTL1_L

        #defineRF1AIFIE RF1AIFCTL1_H

        功能只是為變量RF1AIFCTL1_L,RF1AIFCTL1_H定義了另外的一種名字作為替換。



        上一頁 1 2 下一頁

        關鍵詞: msp430頭文件DEFCDEF

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 铁岭县| 民县| 徐水县| 榆林市| 宜川县| 三门县| 黑水县| 连云港市| 论坛| 舟山市| 石台县| 柳州市| 钦州市| 湖北省| 靖西县| 通山县| 九江县| 松潘县| 原阳县| 通榆县| 博客| 郁南县| 六安市| 海原县| 儋州市| 安达市| 玛多县| 南陵县| 印江| 孝昌县| 鹤庆县| 邵武市| 长白| 闽清县| 三门峡市| 澄城县| 平安县| 南涧| 鄂温| 贡山| 宣化县|