zoukankan      html  css  js  c++  java
  • uboot 的命令体系

    1、代码位置

    (1)uboot命令体系的实现代码在uboot/common/cmd_xxx.c中。有若干个.c文件和命令体系有关。(还有command.c  main.c也是和命令有关的)

    2、传参方式

    命令参数以argc&argv传给函数
    (1)有些uboot的命令还支持传递参数。也就是说命令背后对应的函数接收的参数列表中有argc和argv,然后命令体系会把我们执行命令时的命令+参数(md 30000000 10)以argc(3)和argv(argv[0]=md, argv[1]=30000000 argv[2]=10)的方式传递给执行命令的函数。

    3、uboot命令解析和执行过程分析

    (1)uboot启动的第二阶段,在初始化了所有该初始化的东西后,进入了一个死循环,死循环的循环体就是main_loop。
    (2)main_loop函数执行一遍,就是一个获取命令、解析命令、执行命令的过程。
    (3)run_command函数就是用来执行命令的函数。

    关键点分析
    (1)控制台命令获取
    (2)命令解析。parse_line函数把"md 30000000 10"解析成argv[0]=md, argv[1]=30000000 argv[2]=10;
    (3)命令集中查找命令。find_cmd(argv[0])函数去uboot的命令集合当中搜索有没有argv[0]这个命令,
    (4)执行命令。最后用函数指针的方式调用执行了对应函数。

    3、存储方式

    uboot没有使用数组或者链表,而是使用了一种新的方式来实现这个功能。指定起始地址与结束地址,将命令依次排布(在链接脚本中实现。)

    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }
    __u_boot_cmd_end = .;

    命令结构体cmd_tbl_t

    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    CFG_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
    };
    typedef struct cmd_tbl_s    cmd_tbl_t;

    (1)name:命令名称,字符串格式。
    (2)maxargs:命令最多可以接收多少个参数
    (3)repeatable:指示这个命令是否可重复执行。重复执行是uboot命令行的一种工作机制,就是直接按回车则执行上一条执行的命令。
    (4)cmd:函数指针,命令对应的函数的函数指针,将来执行这个命令的函数时使用这个函数指针来调用。
    (5)usage:命令的短帮助信息。对命令的简单描述。
    (6)help:命令的长帮助信息。细节的帮助信息。
    (7)complete:函数指针,指向这个命令的自动补全的函数。
    总结:uboot的命令体系在工作时,一个命令对应一个cmd_tbl_t结构体的一个实例,然后uboot支持多少个命令,就需要多少个结构体实例。uboot的命令体系把这些结构体实例管理起来,当用户输入了一个命令时,uboot会去这些结构体实例中查找(查找方法和存储管理的方法有关)。如果找到则执行命令,如果未找到则提示命令未知。

    4、uboot实现命令管理的思路

    (1)填充1个结构体实例构成一个命令
    (2)给命令结构体实例附加特定段属性(用户自定义段),链接时将带有该段属性的内容链接在一起排列(挨着的,不会夹杂其他东西,也不会丢掉一个带有这种段属性的,但是顺序是乱序的)。
    (3)uboot重定位时将该段整体加载到DDR中。加载到DDR中的uboot镜像中带有特定段属性的这一段其实就是命令结构体的集合,有点像一个命令结构体数组。
    (4)段起始地址和结束地址(链接地址、定义在u-boot.lds中)决定了这些命令集的开始和结束地址。

    uboot命令定义具体实现分析
    (1)U_BOOT_CMD宏基本分析
    这个宏定义在uboot/common/command.h中。

    U_BOOT_CMD(
    version,    1,    1,    do_version,
    "version - print monitor version
    ",
    NULL
    );
    这个宏替换后变成:
    cmd_tbl_t __u_boot_cmd_version __attribute__ ((unused,section (".u_boot_cmd"))) = {#name, maxargs, rep, cmd, usage, help}

    总结:这个U_BOOT_CMD宏的理解,关键在于结构体变量的名字和段属性。名字使用##作为连字符,附加了用户自定义段属性,以保证链接时将这些数据结构链接在一起排布。

    5、.uboot中增加自定义命令

    1、在已有的c文件中直接添加命令
    (1)在uboot/common/command.c中添加一个命令,叫:mycmd
    (2)在已有的.c文件中添加命令比较简单,直接使用U_BOOT_CMD宏即可添加命令,给命令提供一个do_xxx的对应的函数这个命令就齐活了。
    (3)添加完成后要重新编译工程(make distclean; make x210_sd_config; make),然后烧录新的uboot去运行即可体验新命令。
    (4)还可以在函数中使用argc和argv来验证传参。

    2、自建一个c文件并添加命令
    (1)在uboot/common目录下新建一个命令文件,叫cmd_aston.c(对应的命令名就叫aston,对应的函数就叫do_aston函数),然后在c文件中添加命令对应的U_BOOT_CMD宏和函数。注意头文件包含不要漏掉。
    (2)在uboot/common/Makefile中添加上aston.o,目的是让Make在编译时能否把cmd_aston.c编译链接进去。
    (3)重新编译烧录。重新编译步骤是:make distclean; make x210_sd_config; make

    3、体会:uboot命令体系的优点
    (1)uboot的命令体系本身稍微复杂,但是他写好之后就不用动了。我们后面在移植uboot时也不会去动uboot的命令体系。我们最多就是向uboot中去添加命令,就像本节课所做的这样。
    (2)向uboot中添加命令非常简单。

    #include <common.h>
    #include <command.h>
    
    int
    do_mycmd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
    {
        extern char version_string[];
        printf ("
    %s
    ", version_string);
        return 0;
    }
    
    U_BOOT_CMD(
        mycmd,    1,        1,    do_mycmd,
        "version - print monitor version
    ",
        NULL
    );
  • 相关阅读:
    js 点击列表li,获得当前li的id
    PHP松散比较与严格比较的区别详解
    电赛总结(二)——AD芯片总结之AD7705
    C++Premer Plus学习(五)——函数探幽
    FPGA学习
    AD7715
    电赛初探(二)——语音采集回放系统
    MATLAB信号与系统分析(五)——连续时间信号的频谱分析
    MATLAB信号与系统分析(四)——离散信号与系统的复频域分析及MATLAB实现
    MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6407932.html
Copyright © 2011-2022 走看看