在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IAR 430 頭文件中#define定義的部分解釋

            IAR 430 頭文件中#define定義的部分解釋

            作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
            今天在閱讀RF_Example_Code_v1.0中頭文件cc430x613x.h時發(fā)現(xiàn)了幾部分的疑問。

            首先來看一下cc430x613x.h 中的3個#define的例子:

            本文引用地址:http://www.biyoush.com/article/201611/320882.htm

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

            #define DEFW(name, address) __no_init volatile unsigned short name @ address;

            #define DEFCW(name, address) __no_init union

            {

            struct

            {

            volatile unsigned char name##_L;

            volatile unsigned char name##_H;

            };

            volatile unsigned short name;

            } @ address;

            前面的兩個#define的用法是一樣的。首先我可以發(fā)現(xiàn),在宏定義里面都有一個關(guān)鍵字__no_init。查看了《MSP430 IAR C/EC++ Compiler Reference Guide》內(nèi)的IAR Language Extension Overview 可以發(fā)現(xiàn),__no_init是IAR擴(kuò)展語法里面的一個擴(kuò)展關(guān)鍵字。作用是聲明一個non-volatile類型的內(nèi)存地址(Support non-valotile memory)。

            于是解決了__no_init的問題。

            再者對@這個字符存在一定的疑問,于是上網(wǎng)查了查資料。雖然對于@這個字符的用法還是不是很明確,但是可以明確的是:

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

            #define DEFC(name, address) sfrb name = address;

            這兩種定義是等價的,但是后者是基于匯編嵌入式編程的情況下才成立。也就是說“=”是MSP430匯編中數(shù)據(jù)分配偽指令中的一種。我們來看一下MSP430匯編的數(shù)據(jù)分配偽指令有哪些:

            這類指令有以下一些:

            SET (VAR, ASSIGN) 賦予一個臨時值;

            EQU (=) 在當(dāng)前模塊中賦予一個永久的值;

            DEFINE 定義一個整個文件中都有效的值;

            sfrb 寄存器類型的字節(jié);

            sfrw 寄存器類型的字。

            使用語法如下:

            label SET expr

            label EQU expr

            label = expr

            label DEFINE expr

            [const] sfrb register = value

            [const] sfrw register = value

            其中,

            label 定義一個標(biāo)志符、

            expr 標(biāo)志符的值、

            register 特殊功能寄存器、

            value 特殊功能寄存器的值。

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

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

            這是局部變量。而在模塊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,作用是:在當(dāng)前模塊中賦予一個永久的值。

            至此,

            #define DEFCW(name, address) __no_init union

            {

            struct

            {

            volatile unsigned char name##_L;

            volatile unsigned char name##_H;

            };

            volatile unsigned short name;

            } @ address;

            這種定義也變得相對好理解。以上的這種定義只是多了一個union的定義,將一個16位的地址存儲空間分成2個8bits或者1個16位。可以實(shí)現(xiàn)字訪問,也可以實(shí)現(xiàn)字節(jié)訪問。以上定義是將一個無名的union與address聯(lián)系起來,使得訪問address對應(yīng)的內(nèi)存時,就像訪問union一樣。

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

            #define RF1AIFCTL1_ (0x0F02u)

            DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

            #define RF1AIFIFG RF1AIFCTL1_L

            #define RF1AIFIE RF1AIFCTL1_H

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

            __no_init union

            {

            struct

            {

            volatile unsigned char RF1AIFCTL1_L;

            volatile unsigned char RF1AIFCTL1_H;

            };

            volatile unsigned short RF1AIFCTL1;

            } @ (0x0F02u);

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

            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.

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

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

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

            就是將name變量存放在address地址中,那么如此一來就可以為每個寄存器進(jìn)行命名了,也就是說可以實(shí)現(xiàn)每個寄存器對應(yīng)一個或者多個變量。

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

            #define RF1AIFCTL1_ (0x0F02u)

            DEFCW( RF1AIFCTL1 , RF1AIFCTL1_)

            #define RF1AIFIFG RF1AIFCTL1_L

            #define RF1AIFIE RF1AIFCTL1_H

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

            __no_init union

            {

            struct

            {

            volatile unsigned char RF1AIFCTL1_L;

            volatile unsigned char RF1AIFCTL1_H;

            };

            volatile unsigned short RF1AIFCTL1;

            } @ (0x0F02u);

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

            #define RF1AIFIFG RF1AIFCTL1_L

            #define RF1AIFIE RF1AIFCTL1_H

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



            關(guān)鍵詞: IAR430頭文件define定

            評論


            技術(shù)專區(qū)

            關(guān)閉