#define _RedBoot_init(_f_,_p_) \
struct init_tab_entry _init_tab_##_p_##_f_ \
CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_inits,_p_##_f_) = { _f_ };
#define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_)
RedBoot_init(load_flash_config, RedBoot_INIT_SECOND);
#ifndef CYG_HAL_TABLE_QUALIFIED_ENTRY
#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \
__xstring(_qual)) \
CYGBLD_ATTRIB_USED
#endif
命令的定义:
比如:
local_cmd_entry("list",
"Display contents of FLASH Image System [FIS]",
FIS_LIST_OPTS,
fis_list,
FIS_cmds
);
[redboot.h]
#define local_cmd_entry(_s_,_h_,_u_,_f_,_n_) \
static _cmd_entry(_s_,_h_,_u_,_f_,0,0,_n_)
#define _cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_) \
cmd_fun _f_; \
struct cmd _cmd_tab_##_f_ CYG_HAL_TABLE_QUALIFIED_ENTRY(_n_,_f_) = {_s_, _h_, _u_, _f_, _subs_, _sube_};
#ifndef CYG_HAL_TABLE_QUALIFIED_ENTRY
#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \
__xstring(_qual)) \
CYGBLD_ATTRIB_USED
#endif
# if !defined(CYGBLD_ATTRIB_SECTION)
# define CYGBLD_ATTRIB_SECTION(__sect__) __attribute__((section (__sect__)))
# endif
#define CYG_HAL_TABLE_ENTRY( _name ) \
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data")
CYG_HAL_TABLE_BEGIN( __DEVTAB__, devtab );
CYG_HAL_TABLE_END( __DEVTAB_END__, devtab );
上面的宏会利用了GCC的attribute扩展特性定义了三个section:
.ecos.table.devtab.begin
.ecos.table.devtab.finish
.ecos.table.devtab.data
链接脚本中.data段包含KEEP(*( SORT (.ecos.table.*))),以上的三个section会按字母顺序链接到.data段,.ecos.table.devtab.data就是设备表,__DEVTAB__和__DEVTAB_END__分别定位到这张表的表头和表尾地址,cyg_io_init函数中就是根据这两个地址依次调用表项中的初始化函数指针。
网络设备同理。
"aw"表示定义的section的属性是:allocatable writable
阅读(1280) | 评论(0) | 转发(0) |