打印

msp430头文件中 DEFC DEFW 及周边的解释(转)

[复制链接]
772|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qwe890asd|  楼主 | 2018-8-15 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
msp430头文件中 DEFC DEFW 及周边的解释




现象:

     从这看见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    是新的版本定义只读功能模块寄存器

扩展关键字


关键字的概念前面已经介绍过。下面是除了 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。



相关帖子

沙发
dirtwillfly| | 2018-8-15 16:50 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

455

主题

583

帖子

5

粉丝