msp430頭文件中 DEFC DEFW 及周邊的解釋
#define __MSP430_HAS_SD16_A1__
#define SD16INCTL0_
DEFC(
#define SD16AE_
DEFC(
#define SD16CONF0_
DEFC(
#define SD16CONF1_
DEFC(
#define SD16CTL_
DEFW(
#define SD16CCTL0_
DEFW(
#define SD16IV_
DEFW(
#define SD16MEM0_
DEFW(
#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
#define DEFXW
#endif
#ifdef __IAR_SYSTEMS_ASM__
#define DEFC(name, address) sfrb name = address;
#define DEFW(name, address) sfrw name = address;
解釋:
數(shù)值分配偽指令:主要用于對(duì)符合的數(shù)值定義,以下是常見(jiàn)的定義
EQU
=
DEFINE
sfrb和sfrw
DEFC
READ_ONLY DEFC
3.3.1
關(guān)鍵字的概念前面已經(jīng)介紹過(guò)。下面是除了 C語(yǔ)言標(biāo)準(zhǔn)關(guān)鍵字之外的擴(kuò)展部分,這里只
介紹常用的擴(kuò)展關(guān)鍵字。
1.a(chǎn)sm
也可以寫(xiě)成 __asm。功能是在 C 程序中直接嵌入?yún)R編語(yǔ)言。
語(yǔ)法:
asm ("string");
其中 string 必須是有效的匯編語(yǔ)句。
2.__interrupt
放在函數(shù)前面,標(biāo)志中斷函數(shù)。下面這段程序是異步串行口 UART0 的接收中斷函數(shù)。
UART0RX_VECTOR 為異步串行口 UART0 的接收中斷向量。
舉例:
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_R(void)
{
}
3.__monitor
放在函數(shù)前面, 功能是當(dāng)這一函數(shù)執(zhí)行的時(shí)候自動(dòng)關(guān)閉中斷。 應(yīng)該盡量縮短這樣的函數(shù),
否則,中斷事件無(wú)法得到及時(shí)的響應(yīng)。
4.__no_init
放在全局變量前面,功能是使程序啟動(dòng)時(shí)不為變量賦初值。
5.__raw
編譯中斷函數(shù)時(shí),編譯器會(huì)自動(dòng)生成一段代碼,首先保存當(dāng)時(shí)所用到 CPU 內(nèi)寄存器的內(nèi)
容,退出中斷程序時(shí)再進(jìn)行恢復(fù)。將__raw放在中斷函數(shù)前可以禁止保存 CPU內(nèi)寄存器的過(guò)
程,當(dāng)然退出時(shí)也不會(huì)恢復(fù)。是否為中斷函數(shù)使用此關(guān)鍵字要根據(jù)需要而定。
6.__regvar
放在變量前面,作用是聲明變量為寄存器變量??梢杂糜谡麛?shù)、指針、32 位浮點(diǎn)數(shù)以及
只含有一個(gè)元素的結(jié)構(gòu)和聯(lián)合。寄存器變量的地址只能為 R4 或者R5,也不能用指針指向這
個(gè)寄存器變量,而且必須用__no_init 禁止初始化。如:
__regvar __no_init unsigned char q0 @ __R4;
– 57 –
其他不常用的關(guān)鍵字還有:__data16、__intrinsic、__noreturn、 __root、__task、__word16。
IAR編程環(huán)境 _no_init
extern volatile BYTE sppTxStatus;
__no_init SPP_RX_STRUCT rxData @ "PM0_XDATA";
__no_init SPP_TX_STRUCT txData @ "PM0_XDATA";
大俠告訴我,后兩句是什么意思?_no_init在編程環(huán)境中是藍(lán)色的字。
@ 符號(hào)什么意思。
@就是指定地址,這個(gè)應(yīng)該沒(méi)什么好說(shuō)的了,大部分編譯器都這么用。你應(yīng)該理解這個(gè)吧。
你定義全局變量的時(shí)候比如int char;
今天在閱讀RF_Example_Code_v1.0中頭文件cc430x613x.h時(shí)發(fā)現(xiàn)了幾部分的疑問(wèn)。
首先來(lái)看一下cc430x613x.h 中的3個(gè)#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
{
} @ address;
前面的兩個(gè)#define的用法是一樣的。首先我可以發(fā)現(xiàn),在宏定義里面都有一個(gè)關(guān)鍵字__no_init。查看了《MSP430 IAR C/EC++ Compiler Reference Guide》內(nèi)的IAR Language Extension Overview 可以發(fā)現(xiàn),__no_init是IAR擴(kuò)展語(yǔ)法里面的一個(gè)擴(kuò)展關(guān)鍵字。作用是聲明一個(gè)non-volatile類型的內(nèi)存地址(Support non-valotile memory)。
于是解決了__no_init的問(wèn)題。
再者對(duì)@這個(gè)字符存在一定的疑問(wèn),于是上網(wǎng)查了查資料。雖然對(duì)于@這個(gè)字符的用法還是不是很明確,但是可以明確的是:
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFC(name, address) sfrb name = address;
這兩種定義是等價(jià)的,但是后者是基于匯編嵌入式編程的情況下才成立。也就是說(shuō)“=”是MSP430匯編中數(shù)據(jù)分配偽指令中的一種。我們來(lái)看一下MSP430匯編的數(shù)據(jù)分配偽指令有哪些:
SET (VAR, ASSIGN) 賦予一個(gè)臨時(shí)值;
EQU (=) 在當(dāng)前模塊中賦予一個(gè)永久的值;
DEFINE 定義一個(gè)整個(gè)文件中都有效的值;
sfrb 寄存器類型的字節(jié);
sfrw 寄存器類型的字。
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開(kāi)關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論