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

查看: 4484|回復: 3
打印 上一主題 下一主題

來個宏定義玩玩,呵呵~

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2009-7-14 16:38:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: 定義
從驅動接口宏定義抽出來

第一個數據結構


// 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:58 | 只看該作者
自己沙發,消滅0回復
板凳
 樓主| 發表于 2009-7-16 09:39:13 | 只看該作者
果然是沒人看
地板
發表于 2009-8-25 13:24:48 | 只看該作者
cyg_adc_functions  lpc2xxx_adc_funs{

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

}      
看不懂,為何要加個點(.enable)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情欧美成人狠狠色金八天国 | 欧美日韩综合在线视频免费看 | 上海一级毛片 | 国产欧美日韩专区 | 麻豆视频免费在线 | 久久91精品国产一区二区 | 午夜美女福利 | 麻豆成人久久精品二区三区小说 | 国产欧美精品区一区二区三区 | 高清视频一区二区 | 日韩精品视频免费网址 | 精品中文字幕一区在线 | 精品国产一区二区三区不卡蜜臂 | 四虎在线观看免费永久 | 亚洲91视频 | 999久久66久6只有精品 | 青青草久热精品视频在线观看 | 欧美大片在线看 | 国产麻豆精品免费密入口 | 2019天天做天天拍天天夜 | 色综合欧美色综合七久久 | 日韩免费一级 | 亚色中文 | 成人黄色免费看 | 在线精品国内视频秒播 | 亚洲 欧美 手机 在线观看 | 可以免费看污视频的网站 | 国产一区二区在免费观看 | 日本不卡在线 | 成人免费视频在线看 | 久9久9精品视频在线观看 | 青青青青草原国产免费 | 精品一区二区三区高清免费观看 | 亚洲欧美日韩国产精品一区 | 欧美天天视频 | 国产一区中文字幕 | 视频在线观看一区二区三区 | 91精品在线免费 | 五月天综合| 久久激情五月丁香伊人 | 丁香婷婷久久大综合 |