msp430頭文件中 DEFC DEFW 及周邊的解釋
使用語法如下:
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,但它們表示兩個不同的量,都只在各自的模塊內(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,作用是:在當前模塊中賦予一個永久的值。
至此,
#define DEFCW(name, address) __no_init union
{
} @ address;
這種定義也變得相對好理解。以上的這種定義只是多了一個union的定義,將一個16位的地址存儲空間分成2個8bits或者1個16位??梢詫崿F(xiàn)字訪問,也可以實現(xiàn)字節(jié)訪問。以上定義是將一個無名的union與address聯(lián)系起來,使得訪問address對應的內(nèi)存時,就像訪問union一樣。
那么對于下面的一些看起來貌似比較復雜的定義就相對比較好理解了:
#define
DEFCW(
#define
#define
可以發(fā)現(xiàn),第一個宏定義,“RF1AIFCTL1_”在字符串的最后帶一個下劃線,其實代表這只是一個地址。而通過宏擴展DEFCW(
__no_init union
{
} @ (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地址中,那么如此一來就可以為每個寄存器進行命名了,也就是說可以實現(xiàn)每個寄存器對應一個或者多個變量。
至此頭文件中另外一個問題也迎刃而解:
#define
DEFCW(
#define
#define
我們將DEFCW(
{
} @ (0x0F02u);
那么可以知道,RF1AIFCTL1,RF1AIFCTL1_L,RF1AIFCTL1_H已經(jīng)聲明成為一個變量,存放的地址分別是0x0F02u,0x0F02u+1,0x0F02u。因此接下來后面兩條宏定義就自然的解開了。
#define
#define
功能只是為變量RF1AIFCTL1_L,RF1AIFCTL1_H定義了另外的一種名字作為替換。
評論