歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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;
}

Copyright © Linux教程網 All Rights Reserved