U_BOOT_CMD 介绍
来源:互联网 发布:菠萝饭软件评价 编辑:程序博客网 时间:2024/06/06 12:55
以 2013.04 u-boot为例
1. 通过 U_BOOT_CMD 定义一个类型为 cmd_tbl 的变量,而 cmd_tbl 的成员就是宏函数 U_BOOT_CMD 的参数
2. 所有通过U_BOOT_CMD 定义的变量,都通过脚本链接到 uboot.bin 的一个 section 中
3. 使用函数 find_cmd 遍历整个 section,找到 cmd
在 u-boot 中,命令的实现代码都是在目录 \common 下,命令的添加是通过宏函数 U_BOOT_CMD 实现的。而 U_BOOT_CMD 的定义是在目录 \include 下
#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help)\U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)
#define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \ll_entry_declare(cmd_tbl_t, _name, cmd) =\U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,\_usage, _help, _comp);
#define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,\_usage, _help, _comp)\{ #_name, _maxargs, _rep, _cmd, _usage,\_CMD_HELP(_help) _CMD_COMPLETE(_comp) }ll_entry_declare 也是一个宏函数,定义也是目录 \include 下的文件 link_lists.h中
#define ll_entry_declare(_type, _name, _list)\_type _u_boot_list_2_##_list##_2_##_name __aligned(4)\__attribute__((unused,\section(".u_boot_list_2_"#_list"_2_"#_name)))比如说,命令 bootz 的定义是在文件 cmd_bootm.c 中,我们就以这个为例讲一下。
U_BOOT_CMD(bootz,CONFIG_SYS_MAXARGS,1,do_bootz,"boot Linux zImage image from memory", bootz_help_text);
根据以上给出的宏定义展开之后得到
ll_entry_declare(cmd_tbl_t, bootz, cmd) = \ U_BOOT_CMD_MKENT_COMPLETE(bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, \ "boot Linux zImage image from memory", bootz_help_text, NULL);进一步展开(关于"##name的用法大家可以网上查")
cmd_tbl_t _u_boot_list_2_cmd_2_bootz __aligned(4)\__attribute__((unused, section(".u_boot_list_2_"#_list"_2_"#_name))) = \{bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, "boot Linux zImage image from memory", bootz_help_text, NULL}_aligned(4) 和 _attribute_(……) 是修饰变量 _u_boot_list_2_cmd_2_bootz 的,这个不是我们讨论的重点,暂且忽略它。那这样的话,可以写成这样
cmd_tbl_t _u_boot_list_2_cmd_2_bootz = \ {bootz, CONFIG_SYS_MAXARGS, 1, do_bootz, "boot Linux zImage image from memory", bootz_help_text, NULL}我们再来看看结构体 cmd_tbl_t 的定义: typedef struct cmd_tbl_s cmd_tbl_tstruct cmd_tbl_s {char*name;/* Command Name*/intmaxargs;/* maximum number of arguments*/intrepeatable;/* autorepeat allowed?*//* Implementation function*/int(*cmd)(struct cmd_tbl_s *, int, int, char * const []);char*usage;/* Usage message(short)*/#ifdefCONFIG_SYS_LONGHELPchar*help;/* Help message(long)*/#endif#ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */int(*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);#endif};刚好和上式的内容相符,只是最后一个成员的值为 "NULL"。
- U_BOOT_CMD 介绍
- U_BOOT_CMD
- U_BOOT_CMD
- U_BOOT_CMD分析
- U_BOOT_CMD 分析
- U_BOOT_CMD命令的实现
- U_BOOT_CMD命令的实现
- U_BOOT_CMD 命令数据结构
- U_BOOT_CMD 命令数据结构
- U_BOOT_CMD命令的实现
- U_BOOT_CMD命令的实现
- U_BOOT_CMD源码 分析
- U_BOOT_CMD 分析【转】
- U_BOOT_CMD 命令实现分析
- U_BOOT_CMD命令的实现
- U_BOOT_CMD命令的实现
- U_BOOT_CMD命令格式
- U_BOOT_CMD命令的实现
- xcode5开发者预览版高速下载地址by lwxshow
- WINCE 系统中的同步机制
- 如何用摄像头来测距(opencv)
- A10_DatePicker的对话框设置
- 深入浅出 REST
- U_BOOT_CMD 介绍
- 关于WinCE6.0补丁包的一点说明
- glib中的陷阱
- 搭建Spring开发环境
- 详解 Android 的 Activity 组件
- 用firebird自带的工具的管理数据库
- java类集合 Set ,List ,Map ,数组之间相互转化
- 8583报文
- Android和java创建xml文件和解析xml文件剖析