U-Boot下用do_run()函数来执行U_BOOT_CMD定义的命令


研究了一下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;
}

  • 1
  • 2
  • 下一页

相关内容