国产毛片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成年视频免费观看
|
国产精品亚洲一区二区麻豆
|
成人精品视频在线观看播放
|
九月婷婷丁香
|
国产精品日韩一区二区三区
|
插菊花网站
|
一级欧美日韩
|