分类: 嵌入式
2010-12-03 11:29:43
u-boot命令
/*common/command.h*/
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}
在u-boot中,所有的命令都是由U_BOOT_CMD宏定义出来的,例如定义一条命令:
U_BOOT_CMD(boot, 0, 0, fun, "boot xxx");
##name将字符直接跟在后面,#name会将name这个字符中以“..."的形式放置。
展开后变成:
cmd_tbl_t __u_boot_cmd_boot __attribute___((unused, section(".u_boot_cmd"))) = {"boot", 0, 0, fun, "boot xxx"}
通过U_BOOT_CMD定义的cmd_tbl_t变量都放在.u_boot_cmd这个段中,具体放在什么地方由链接脚本指定。
/*cpu/arm920t/u-boot.lds*/
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
在u-boot第二阶段中有个死循环调用main_loop()函数,当你输入命令后,main_loop()会调用run_command()函数,run_command()函数它会到这个段中的__u_boot_cmd_start开始处去查找命令,如果找到了(name字段相同)则调用cmd这个函数去执行相应的命令,一般U_BOOT_CMD 添加命令时的cmd都定义成do_xx,所以你执行xx命令就会执行do_xx命令,函数也在cmd_xx.c中定义。