浅析ecos二维命令表section巧妙存储和检索
CYG_HAL_TABLE_BEGIN( __RedBoot_INIT_TAB__, RedBoot_inits );//__RedBoot_INIT_TAB__指向.ecos.table.RedBoot_inits.begin首地址[luther.gliethttp]
".ecos.table.RedBoot_inits.begin"
#ifndef CYG_HAL_TABLE_BEGIN
#define CYG_HAL_TABLE_BEGIN( _label, _name ) \
__asm__(".section \".ecos.table." __xstring(_name) ".begin\",\"aw\"\n" \
".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \
".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \
".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \
__xstring(CYG_LABEL_DEFN(_label)) ":\n" \
".previous\n" \
)
#endif
".ecos.table.RedBoot_inits.data.RedBoot_INIT_FIRST.load_flash_config"
RedBoot_init(load_flash_config, RedBoot_INIT_FIRST);
#define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_)
#define _RedBoot_init(_f_,_p_) \
struct init_tab_entry _init_tab_##_p_##_f_ \
CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_inits,_p_##_f_) = { _f_ };
#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \
CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \
__xstring(_qual))
# define CYGBLD_ATTRIB_SECTION(__sect__) __attribute__((section (__sect__)))
".ecos.table.RedBoot_commands.begin"
".ecos.table.RedBoot_commands.finish"
packages/redboot/v2_0/src/main.c|119| CYG_HAL_TABLE_BEGIN( __RedBoot_CMD_TAB__, RedBoot_commands );
cyg_start
==>parse
==>return cmd_search(__RedBoot_CMD_TAB__, &__RedBoot_CMD_TAB_END__, argv[0]);//遍历__RedBoot_CMD_TAB__指向section为.ecos.table的存储节中的所有[luther.gliethttp]
#define RedBoot_cmd(_s_,_h_,_u_,_f_) cmd_entry(_s_,_h_,_u_,_f_,0,0,RedBoot_commands)
#define cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_) \
extern _cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_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_};
如果命令如下:
RedBoot_cmd("fconfig",
"Manage configuration kept in FLASH memory",
"[-i] [-l] [-n] [-f] [-d] | [-d] nickname [value]",
do_flash_config
);
那么展开结果如下[luther.gliethttp]:
extern cmd_fun do_flash_config;
struct cmd _cmd_tab_do_flash_config __attribute__((section (".ecos.table.RedBoot_commands.data.do_flash_config") )) = {
"fconfig",
"Manage configuration kept in FLASH memory",
"[-i] [-l] [-n] [-f] [-d] | [-d] nickname [value]",
do_flash_config,
0, 0 };
#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_};
如果命令如下:
local_cmd_entry("list",
"Display contents of FLASH Image System [FIS]",
FIS_LIST_OPTS,
fis_list,
FIS_cmds
);
那么展开结果如下[luther.gliethttp]:
static cmd_fun fis_list;
struct cmd _cmd_tab_fis_list __attribute__((section (".ecos.table.FIS_cmds.data.fis_list") )) = {
"list",
"Display contents of FLASH Image System [FIS]",
FIS_LIST_OPTS,
fis_list,
0, 0 };
CYG_HAL_TABLE_BEGIN( __FIS_cmds_TAB__, FIS_cmds);
CYG_HAL_TABLE_END( __FIS_cmds_TAB_END__, FIS_cmds);
所以将会出现对".ecos.table.FIS_cmds.begin"段引用
#define RedBoot_nested_cmd(_s_,_h_,_u_,_f_,_subs_,_sube_) cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,RedBoot_commands)
#define cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_) \
extern _cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_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_};
如果命令如下:
RedBoot_nested_cmd("fis",
"Manage FLASH images",
"{cmds}",
do_fis,
__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__
);
那么展开结果如下[luther.gliethttp]:
extern cmd_fun do_fis;
struct cmd _cmd_tab_do_fis __attribute__((section (".ecos.table.RedBoot_commands.data.do_fis") )) = {
"fis",
"Manage FLASH images",
"{cmds}",
do_fis,
__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__ };
CYG_HAL_TABLE_BEGIN( __FIS_cmds_TAB__, FIS_cmds);
CYG_HAL_TABLE_END( __FIS_cmds_TAB_END__, FIS_cmds);
".ecos.table.FIS_cmds.begin"
看看使用二维命令数组的一个实例:
static void
do_fis(int argc, char *argv[])
{
struct cmd *cmd;
if (argc < 2) {
fis_usage("too few arguments");
return;
}
if (!do_flash_init()) {
diag_printf("Sorry, no FLASH memory is available\n");
return;
}
// 第二维命令检索[luther.gliethttp]
// command[RedBoot_commands][FIS_cmds]
if ((cmd = cmd_search(__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__,
argv[1])) != (struct cmd *)0) {
(cmd->fun)(argc, argv);
return;
}
fis_usage("unrecognized command");
}
阅读(2040) | 评论(0) | 转发(0) |