<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430頭文件中 DEFC DEFW 及周邊的解釋

          msp430頭文件中 DEFC DEFW 及周邊的解釋

          作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
          現(xiàn)象:

          從這看見(jiàn)DEFC DEFW

          本文引用地址:http://www.ex-cimer.com/article/201611/321175.htm


          #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;

          解釋?zhuān)?/p>

          數(shù)值分配偽指令:主要用于對(duì)符合的數(shù)值定義,以下是常見(jiàn)的定義

          EQU在當(dāng)前模塊中賦予一個(gè)永久的值

          =同上

          DEFINE 在多個(gè)模塊環(huán)境下,定義一個(gè)在整個(gè)文件中都有效的值

          sfrb和sfrw 是老的版本對(duì)功能寄存器的定義

          DEFC 是新的版本對(duì)功能寄存器的定義

          READ_ONLY DEFC 是新的版本定義只讀功能模塊寄存器

          3.3.1 擴(kuò)展關(guān)鍵字
          關(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) //UART0接收中斷
          {
          TXBUF0=RXBUF0;
          }
          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

          2008-10-20 14:58
          提問(wèn)者:侯寧05電61 | 懸賞分:10 | 瀏覽次數(shù):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在編程環(huán)境中是藍(lán)色的字。
          @ 符號(hào)什么意思。
          最佳答案
          @是指定地址,__no_init 是一個(gè)SEGMENT,是給LINKER用的,定義到不初始化的塊中去。
          @就是指定地址,這個(gè)應(yīng)該沒(méi)什么好說(shuō)的了,大部分編譯器都這么用。你應(yīng)該理解這個(gè)吧。
          你定義全局變量的時(shí)候比如int char; 即使你沒(méi)有賦值給他,編譯器還是會(huì)給他一個(gè)初始化值0,編譯的時(shí)候編譯器把他分配到初始化為零的那個(gè)SEGMENG中去了。編譯器默認(rèn)的有幾個(gè)塊,初始化為零的塊,初始化不為零的塊,和不初始化的塊,你可以定義自己的塊,如你的PM0_XDATA,這個(gè)就是你自己定義的一個(gè)塊,那你的這個(gè)塊是個(gè)什么屬性呢,就是,__no_init 屬性,有了這個(gè)屬性,編譯器只給你分配空間,不給你初始化。
          贊同43
          回答者: 0223050423 | 二級(jí)
          昵稱(chēng):sharkdo IAR 430 頭文件中#define定義的部分解釋

          今天在閱讀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

          {

          struct

          {

          volatile unsigned charname##_L;

          volatile unsigned charname##_H;

          };

          volatile unsigned short name;

          } @ 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類(lèi)型的內(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 寄存器類(lèi)型的字節(jié);

          sfrw 寄存器類(lèi)型的字。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: msp430頭文件DEFCDEF

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();