新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430頭文件中 DEFC DEFW 及周邊的解釋

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

        作者: 時間:2016-11-25 來源:網絡 收藏
        現象:

        從這看見DEFC DEFW

        本文引用地址:http://www.104case.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;

        解釋:

        數值分配偽指令:主要用于對符合的數值定義,以下是常見的定義

        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 寄存器類型的字。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 遂宁市| 寻乌县| 黑龙江省| 都江堰市| 中山市| 阿巴嘎旗| 鹿邑县| 桃源县| 镇赉县| 潮安县| 察雅县| 乌兰县| 建昌县| 西昌市| 隆德县| 观塘区| 正宁县| 视频| 长阳| 长宁区| 隆德县| 丹寨县| 玉林市| 通州市| 门源| 惠水县| 七台河市| 林西县| 色达县| 内黄县| 鸡泽县| 威远县| 新和县| 余姚市| 崇阳县| 澄迈县| 大港区| 福建省| 弥勒县| SHOW| 喀喇|