国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 來個宏定義玩玩,呵呵~ [打印本頁]

作者: 一朝成名    時間: 2009-7-14 16:38
標題: 來個宏定義玩玩,呵呵~
從驅動接口宏定義抽出來

第一個數據結構


// Driver functions:驅動函數
CYG_ADC_FUNCTIONS( lpc2xxx_adc_funs,
                   lpc2xxx_adc_enable,
                   lpc2xxx_adc_disable,
                   lpc2xxx_adc_set_rate );

//doc中的解釋說明
The macro CYG_ADC_FUNCTIONS() instantiates a function table called example_adc_funs and populates it with the ADC driver functions



//宏定義原型

#define CYG_ADC_FUNCTIONS( __name, __enable, __disable, __set_rate )    \
cyg_adc_functions __name =                                              \
{                                                                                         \
    .enable               = __enable,                                          \
    .disable              = __disable,                                          \
    .set_rate            = __set_rate                                         \
};



//adc函數定義原型,一個結構體包含了三個函數指針

struct cyg_adc_functions
{  
    void (*enable)( cyg_adc_channel *chan );
    void (*disable)( cyg_adc_channel *chan );

    void (*set_rate)( cyg_adc_channel *chan, cyg_uint32 rate );
};


/******************************************************************/
宏展開的結果:定義了一個cyg_adc_funtions包含了函數指針的結構體

cyg_adc_functions  lpc2xxx_adc_funs{

    .enable               =  lpc2xxx_adc_enable,                                    
    .disable              =  lpc2xxx_adc_disable,                           
    .set_rate            =  lpc2xxx_adc_set_rate

}      
/********************************************************************/


//ADC信息的私有數據
static lpc2xxx_adc_info lpc2xxx_adc_info0 =
{
    .base               = CYGARC_HAL_LPC2XXX_REG_AD_BASE,
    .vector             = CYGNUM_HAL_INTERRUPT_TIMER1,
    .intprio            = CYGNUM_DEVS_ADC_ARM_LPC24XX_INTPRIO,
    .int_handle         = 0,
#if CYGPKG_DEVS_ADC_ARM_LPC24XX_DEBUG_LEVEL > 0
    .isr_cnt            = 0,
#endif
    .chan_mask          = 0
};

//ADC驅動的總結構,包含了上述的兩部分驅動函數和私有數據
CYG_ADC_DEVICE( lpc2xxx_adc_device,               //名字
                &lpc2xxx_adc_funs,                                 //驅動函數
                &lpc2xxx_adc_info0,                                //驅動信息私有數據
                CYGNUM_DEVS_ADC_ARM_LPC24XX_DEFAULT_RATE);    //默認采樣率
宏定義
#define CYG_ADC_DEVICE(__name, __funs, __dev_priv, __rate )     \
cyg_adc_device __name =                                         \
{                                                               \
    .funs                    = __funs,                               \
    .dev_priv             = __dev_priv,                           \
    .config.rate         = __rate,                               \
    .init               = false                                 \
};

/********************************************************************************************/
展開宏定義的結果

cyg_adc_device lpc2xxx_adc_device =                                             \
{                                                                                                            \
    .funs                   = lpc2xxx_adc_funs, ,                                            \
    .dev_priv            = lpc2xxx_adc_info0,                                             
    .config.rate          =CYGNUM_DEVS_ADC_ARM_LPC24XX_DEFAULT_RATE,                                         
    .init                      = false                                                                     
};
/**********************************************************************************************/


//ADC0~7驅動的注冊
LPC2XXX_ADC_CHANNEL(0~7)

//原型
#define LPC2XXX_ADC_CHANNEL( __chan )                                    \
CYG_ADC_CHANNEL( lpc2xxx_adc_channel##__chan,                            \
                 __chan,                                                 \
                 CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL##__chan##_BUFSIZE,  \
                 &lpc2xxx_adc_device );                                  \
                                                                         \
DEVTAB_ENTRY( lpc2xxx_adc_channel##__chan##_device,                      \
              CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL##__chan##_NAME,        \
              0,                                                         \
              &cyg_io_adc_devio,                                         \
              lpc2xxx_adc_init,                                          \
              lpc2xxx_adc_lookup,                                        \
              &lpc2xxx_adc_channel##__chan );

(1)第一步展開,將"##__chan"和"##_chan##"替換為__chan的數值,假設為0

CYG_ADC_CHANNEL( lpc2xxx_adc_channel0,                                        \
                 0,                                                                                                  \
                 CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_BUFSIZE,  \
                 &lpc2xxx_adc_device );                                                            \
                                                                                                                    \
DEVTAB_ENTRY( lpc2xxx_adc_channel0_device,                                 \
              CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_NAME,        \
              0,                                                                                                 \
              &cyg_io_adc_devio,                                                                      \
              lpc2xxx_adc_init,                                                                             \
              lpc2xxx_adc_lookup,                                                                       \
              &lpc2xxx_adc_channel0 );


//CYG_ADC_CHANNEL宏定義原型
#define CYG_ADC_CHANNEL( __name, __channel, __bufsize, __device )      
static cyg_adc_sample_t __name##_buf[__bufsize];                                    
cyg_adc_channel __name =                                                                              
{                                                                                                                          
    .channel            = __channel,                                    \
    .buf                = __name##_buf,                                 \
    .len                = __bufsize,                                    \
    .put                = 0,                                            \
    .get                = 0,                                            \
    .device             = __device,                                     \
    .init               = false                                         \
};


(2-1)CYG_ADC_CHANNLE再次展開后的結果:
static cyg_adc_sample_t lpc2xxx_adc_channel0_buf[CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_BUFSIZE];                        \
cyg_adc_channel lpc2xxx_adc_channel0 =                                                                   \
{                                                                                                                                        \
    .channel            = 0,                                                                                                     \
    .buf                    = lpc2xxx_adc_channel0_buf,                                                           \
    .len                    = CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_BUFSIZE,       \
    .put                   = 0,                                                                           \
    .get                   = 0,                                                                           \
    .device              = &lpc2xxx_adc_device,                                                           \
    .init                    = false                                                                         \
};


(2-2)DEVTAB_ENTRY宏定義的原型
         
    #define DEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv) \
                   CHAR_DEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv)
    #define CHAR_DEVTAB_ENTRY(_l,_name,_dep_name,_handlers,_init,_lookup,_priv)  
       cyg_devtab_entry_t _l CYG_HAL_TABLE_ENTRY(devtab) = {                  
       _name,                                                               
       _dep_name,                                                           
       _handlers,                                                           
       _init,                                                               
       _lookup,                                                            
       _priv,                                                               
       CYG_DEVTAB_STATUS_CHAR                                               
    };
           
        展開結果
          cyg_devtab_entry_t _l CYG_HAL_TABLE_ENTRY(devtab) = {                  
       lpc2xxx_adc_channel0_device,                                                                                                        
       CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_NAME,                                                                                               
       0,                                                                                                   
       lpc2xxx_adc_init,                                                                                          
       lpc2xxx_adc_lookup,                                                                             
       &lpc2xxx_adc_channel0,                                                                              
       CYG_DEVTAB_STATUS_CHAR                                               
    };      
      CYG_HAL_TABLE_ENTRY()原型
    #define CYG_HAL_TABLE_ENTRY( _name ) \
                CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data")
            CYGBLD_ATTRIB_USED

      展開結果
                CYGBLD_ATTRIB_SECTION(".ecos.table.devtab.data")
            CYGBLD_ATTRIB_USED
      CYGBLD_ATTRIB_SECTION原型
        #define CYGBLD_ATTRIB_SECTION(__sect__) __attribute__((section (__sect__)))
      展開結果
       __attribute__((section (".ecos.table.devtab.data")))
       展開CYGBLD_ATTRIB_USED
    __attribute__((used))

    CYG_HAL_TABLE_ENTRY()的展開結果為
      __attribute__((section (".ecos.table.devtab.data")))
    __attribute__((used))
    DEVTAB_ENTRY的展開結果為
          cyg_devtab_entry_t _l  __attribute__((section (".ecos.table.devtab.data"))) __attribute__((used)) = {                  
           lpc2xxx_adc_channel0_device,                                                                                                            
           CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_NAME,                                                                                               
           0,                                                                                                                                    
           lpc2xxx_adc_init,                                                                                                   
           lpc2xxx_adc_lookup,                                                                                                
           &lpc2xxx_adc_channel0,                                                                                       
           CYG_DEVTAB_STATUS_CHAR                                                                                   
    };      



總結LPC2XXX_ADC_CHANNEL(0)的宏定義結果為
static cyg_adc_sample_t lpc2xxx_adc_channel0_buf[CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_BUFSIZE];                        
cyg_adc_channel lpc2xxx_adc_channel0 =                                                                  
{                                                                                                                                       
    .channel            = 0,                                                                                                     
    .buf                    = lpc2xxx_adc_channel0_buf,                                                           
    .len                    = CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_BUFSIZE,      
    .put                   = 0,                                                                           
    .get                   = 0,                                                                           
    .device              = &lpc2xxx_adc_device,                                                           
    .init                    = false                                                                        
};

cyg_devtab_entry_t _l  __attribute__((section (".ecos.table.devtab.data"))) __attribute__((used)) = {                  
           lpc2xxx_adc_channel0_device,                                                                                                            
          CYGDAT_DEVS_ADC_ARM_LPC24XX_CHANNEL0_NAME,                                                                 
           0,                                                                                                                                
           lpc2xxx_adc_init,                                                                                                   
           lpc2xxx_adc_lookup,                                                                                                
           &lpc2xxx_adc_channel0,                                                                                          
           CYG_DEVTAB_STATUS_CHAR                                                                                   
    };      



   


因為公社的版本太窄了,導致很多行都亂了,所以把一些還行符刪掉了~
看人家老外做的程序,專業~看不懂~
我要是分析的不對的,大家指正
作者: 一朝成名    時間: 2009-7-14 16:44
自己沙發,消滅0回復
作者: 一朝成名    時間: 2009-7-16 09:39
果然是沒人看
作者: masonz    時間: 2009-8-25 13:24
cyg_adc_functions  lpc2xxx_adc_funs{

    .enable               =  lpc2xxx_adc_enable,                                    
    .disable              =  lpc2xxx_adc_disable,                           
    .set_rate            =  lpc2xxx_adc_set_rate

}      
看不懂,為何要加個點(.enable)




歡迎光臨 電子工程網 (http://m.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 忍者刺客韩国在线观看完整免费版 | 最近最新2019中文字幕6 | 国产精品一区二区国产 | 四虎影视入口 | 成人激情综合网 | 一级毛片在线全部免费播放 | 91最懂男人的午夜社区 | 欧美高清在线精品一区二区不卡 | 久久亚洲欧美成人精品 | a久久久久一级毛片护士免费 | 亚欧毛片 | 99无人区卡一卡二卡三乱码 | 99爱视频精品免视看 | 亚洲欧美一区二区三区麻豆 | 欧美精品超清在线播放 | 日韩一区二区三区四区五区 | 日本高清视频在线 | 国产精品免费看久久久久 | 免费一级大毛片a一观看不卡 | 欧美理论片手机在线观看片免费 | 99热成人精品国产免国语的 | 青青伊人精品 | 国产白嫩美女在线观看 | 亚洲免费影视 | 久久久久久国产精品免费免 | 99精品偷自拍 | 日韩亚洲人成在线 | 日韩一区二区精品久久高清 | 欧美亚洲综合图区在线 | 国产第一第二第三第四第五 | 欧美成人全部视频 | 欧美午夜在线观看 | 最新国语自产精品视频在 | 韩国一级片免费 | 78m成年视频免费观看 | 国产精品亚洲一区二区麻豆 | 成人精品视频在线观看播放 | 九月婷婷丁香 | 国产精品日韩一区二区三区 | 插菊花网站 | 一级欧美日韩 |