今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。
首先来看一下cc430x613x.h 中的3个#define的例子:
#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的用法是一样的。首先我可以发现,在宏定义里面都有一个关键字__no_init。查看了《MSP430 IAR C/EC++ Compiler Reference Guide》内的IAR Language Extension Overview 可以发现,__no_init是IAR扩展语法里面的一个扩展关键字。作用是声明一个non-volatile类型的内存地址(Support non-valotile memory)。
于是解决了__no_init的问题。
再者对@这个字符存在一定的疑问,于是上网查了查资料。虽然对于@这个字符的用法还是不是很明确,但是可以明确的是:
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFC(name, address) sfrb name = address;
这两种定义是等价的,但是后者是基于汇编嵌入式编程的情况下才成立。也就是说“=”是MSP430汇编中数据分配伪指令中的一种。我们来看一下MSP430汇编的数据分配伪指令有哪些:
这类指令有以下一些:
SET (VAR, ASSIGN) 赋予一个临时值;