IAR 430 头文件中#define定义的部分解释
今天在阅读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的基本用法再者对@这个字符存在一定的疑问,于是上网查了查资料。虽然对于@这个字符的用法还是不是很明确,但是可以明确的是:
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFC(name, address) sfrb name = address;
这两种定义是等价的,但是后者是基于汇编嵌入式编程的情况下才成立。也就是说“=”是MSP430汇编中数据分配伪指令中的一种。我们来看一下MSP430汇编的数据分配伪指令有哪些:
这类指令有以下一些:
SET (VAR, ASSIGN) 赋予一个临时值;
EQU (=) 在当前模块中赋予一个永久的值;
DEFINE 定义一个整个文件中都有效的值;
sfrb 寄存器类型的字节;
sfrw 寄存器类型的字。
使用语法如下:
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论