研究了一下uboot中怎麼用do_run()函數來執行定義好的一些命令,發現其實也挺簡單的,關鍵是得把do_run函數的幾個參數吃透,這幾個參數都是由uboot commmod 的
cmd_tbl_s結構體決定的,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, help}
struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage; /* Usage message (short) */
#ifdef CONFIG_SYS_LONGHELP
char *help; /* Help message (long) */
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
}
對比兩者後很容易就明白了怎樣去定義一個uboot下的命令。
接下來看看do_run函數的定義(在../boot/common/main.c下):
#if defined(CONFIG_CMD_RUN) 查找命令,然後執行命令
int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
int i;
if (argc < 2) { //參數個數小於2則提示重新輸入
cmd_usage(cmdtp);
return 1;
}
for (i=1; i<argc; ++i) {
char *arg;
if ((arg = getenv (argv[i])) == NULL) {
printf ("## Error: \"%s\" not defined\n", argv[i]);
return 1;
}
#ifndef CONFIG_SYS_HUSH_PARSER
if (run_command (arg, flag) == -1){ //調用run_command函數,先
return 1;
}
#else
if (parse_string_outer(arg,
FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0){
return 1;
}
#endif
}
return 0;
}