您的位置 首页 主动

msp430头文件中 DEFC DEFW 及周边的解说

现象:从这看见DEFCDEFWdefine__MSP430_HAS_SD16_A1__defineSD16INCTL0_(0x00B0u)DEFC(SD16INCTL0,SD16INCTL0_)def

现象:

从这看见DEFC DEFW

#define __MSP430_HAS_SD16_A1__

#define SD16INCTL0_ (0x00B0u)
DEFC( SD16INCTL0 , SD16INCTL0_)
#define SD16AE_ (0x00B7u)
DEFC( SD16AE , SD16AE_)
#define SD16CONF0_ (0x00F7u)
DEFC( SD16CONF0 , SD16CONF0_)
#define SD16CONF1_ (0x00BFu)
DEFC( SD16CONF1 , SD16CONF1_)

#define SD16CTL_ (0x0100u)
DEFW( SD16CTL , SD16CTL_)
#define SD16CCTL0_ (0x0102u)
DEFW( SD16CCTL0 , SD16CCTL0_)
#define SD16IV_ (0x0110u)
DEFW( SD16IV , SD16IV_)
#define SD16MEM0_ (0x0112u)
DEFW( SD16MEM0 , SD16MEM0_)

接着找到下面的界说

#ifdef __IAR_SYSTEMS_ICC__
#include “in430.h”
#pragma language=extended

#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short name @ address;
#define DEFXC volatile unsigned char
#define DEFXW volatile unsigned short

#endif

#ifdef __IAR_SYSTEMS_ASM__
#define DEFC(name, address) sfrb name = address;
#define DEFW(name, address) sfrw name = address;

解说:

数值分配伪指令:首要用于对契合的数值界说,以下是常见的界说

EQU在其时模块中赋予一个永久的值

=同上

DEFINE 在多个模块环境下,界说一个在整个文件中都有用的值

sfrb和sfrw 是老的版别对功用寄存器的界说

DEFC 是新的版别对功用寄存器的界说

READ_ONLY DEFC 是新的版别界说只读功用模块寄存器

3.3.1 扩展关键字
关键字的概念前面现已介绍过。下面是除了 C言语规范关键字之外的扩展部分,这儿只
介绍常用的扩展关键字。
1.asm
也能够写成 __asm。功用是在 C 程序中直接嵌入汇编言语。
语法:
asm (“string”);
其间 string 有必要是有用的汇编句子。
2.__interrupt
放在函数前面,标志中止函数。下面这段程序是异步串行口 UART0 的接纳中止函数。
UART0RX_VECTOR 为异步串行口 UART0 的接纳中止向量。
举例:
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_R(void) //UART0接纳中止
{
TXBUF0=RXBUF0;
}
3.__monitor
放在函数前面, 功用是当这一函数履行的时分主动封闭中止。 应该尽量缩短这样的函数,
不然,中止事情无法得到及时的呼应。
4.__no_init
放在全局变量前面,功用是使程序启动时不为变量赋初值。
5.__raw
编译中止函数时,编译器会主动生成一段代码,首要保存其时所用到 CPU 内寄存器的内
容,退出中止程序时再进行康复。将__raw放在中止函数前能够制止保存 CPU内寄存器的过
程,当然退出时也不会康复。是否为中止函数运用此关键字要根据需求而定。
6.__regvar
放在变量前面,作用是声明变量为寄存器变量。能够用于整数、指针、32 位浮点数以及
只含有一个元素的结构和联合。寄存器变量的地址只能为 R4 或许R5,也不能用指针指向这
个寄存器变量,并且有必要用__no_init 制止初始化。如:
__regvar __no_init unsigned char q0 @ __R4;
– 57 –
其他不常用的关键字还有:__data16、__intrinsic、__noreturn、 __root、__task、__word16。

IAR编程环境 _no_init

2008-10-20 14:58
发问者:侯宁05电61 | 悬赏分:10 | 阅览次数:1980次
extern volatile BYTE sppRxStatus;
extern volatile BYTE sppTxStatus;
__no_init SPP_RX_STRUCT rxData @ “PM0_XDATA”;
__no_init SPP_TX_STRUCT txData @ “PM0_XDATA”;
大侠告诉我,后两句是什么意思?_no_init在编程环境中是蓝色的字。
@ 符号什么意思。
最佳答案
@是指定地址,__no_init 是一个SEGMENT,是给LINKER用的,界说到不初始化的块中去。
@便是指定地址,这个应该没什么好说的了,大部分编译器都这么用。你应该了解这个吧。
你界说全局变量的时分比方int char; 即便你没有赋值给他,编译器仍是会给他一个初始化值0,编译的时分编译器把他分配到初始化为零的那个SEGMENG中去了。编译器默许的有几个块,初始化为零的块,初始化不为零的块,和不初始化的块,你能够界说自己的块,如你的PM0_XDATA,这个便是你自己界说的一个块,那你的这个块是个什么特点呢,便是,__no_init 特点,有了这个特点,编译器只给你分配空间,不给你初始化。
附和43
回答者: 0223050423 | 二级
昵称:sharkdo 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 charname##_L;

volatile unsigned charname##_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) 赋予一个临时值;

EQU (=) 在其时模块中赋予一个永久的值;

DEFINE 界说一个整个文件中都有用的值;

sfrb 寄存器类型的字节;

sfrw 寄存器类型的字。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/258938.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部