转:http://www.embedu.org/Column/Column464.htm

作者:曾宏安,华清远见嵌入式学院讲师。

u-boot是嵌入式系统中广泛使用的一种bootloader。它不仅支持众多的平台和参考板,而且支持丰富的命令,可以让用户对开发板进行各种操作。关于u-boot使用和移植的资料很多,这里不再赘述。下面用问答的方式介绍u-boot中命令的实现机制。

Q1: u-boot中命令的实现代码在什么地方?

A1: 在u-boot源码的common目录下。通常一个或多个命令在对应的某个C文件中实现。如果用户要增加一个新命令的话,要在common目录下添加对应的C文件,并在Makefile中指定编译该文件。

Q2: 能不能给个命令的实现模板先?

A2: #include <common.h>
               #include <command.h>

int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
               {
                       printf(“hello world\n”);
                       return 0;
               }
               U_BOOT_CMD(hello, CONFIG_SYS_MAXARGS, 1, do_hello, “usage info”,  “help info”);

以下是上面代码的解释:

U_BOOT_CMD是u-boot中定义的宏,上面的宏定义展开后如下:

cmd_tbl_t __u_boot_cmd_hello Struct_Section = {“hello”, CONFIG_SYS_MAXARGS, 1, do_hello, “usage info”, “help info”};

这下清楚了,实际上就是定义一个类型为cmd_tbl_t的结构体并对其赋值。

u-boot中每个命令都用这样的一个结构体来描述,类型定义如下:

typedef struct cmd_tbl_s cmd_tbl_t;
        struct cmd_tbl_s {
                char *name;        // 命令的名称
                int maxargs;        // 最多支持的参数的个数
                int repeatable;        // 是否可重复执行
                int (*cmd)(struct cmd_tbl_s *, int, int, char *const[]);        // 命令对应的处理函数
                char *usage;        // 命令简要使用信息
                char *help;        // 命令详细帮助信息
        }

成员cmd是个函数指针,需要指向该命令对应的处理函数。这也是在前面的模板中先定义一个处理函数的原
因。所有命令的处理函数的接口都是一致的:参数cmdtp指向命令对应的cmt_tbl_t结构体;参数flag可以忽略不处理;参数argc和参数
argv的作用和它们在main函数中是一样的。

Q3: 当用户输入命令后,u-boot是如何执行的?

A3: 前面用U_BOOT_CMD定义结构体时用到了另外一个宏Struct_Section,它表示把该结构体放到一个专门的段。u_boot_cmd,没错,u-boot中所有命令对应的结构体都集中放在这个段里,该段里的内容会被包含在编译好的u-boot里。

这下就容易理解了:u-boot接收到用户的命令后在.u_boot_cmd段中依次查找每个
cmd_tbl_t,根据成员name比较是否和用户命令匹配。若成功则执行第三个成员cmd指向的函数,否则查找下个cmd_tbl_t。具体的实现请
参考u-boot中的函数find_cmd的代码。

小结:在我看来,u-boot不仅是一个功能强大的bootloader,而且是一个很好的嵌入式编程的学习对象,其中很多编程的思想和实现的方法都值得大家借鉴。

在u-boot中添加命令的更多相关文章

  1. spring boot 中添加mongodb支持

    1.添加maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  2. 在Spring Boot中添加全局异常捕捉提示

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 全局异常捕捉: 新建一个类GlobalDefaultExceptionHandler, 在class注解上@Controll ...

  3. visual studio 中添加命令行参数

    argc argv

  4. 在U-Boot中添加自定义命令以实现自动下载程序【转】

    本文转载自:https://gaomf.cn/2016/06/26/%E5%9C%A8U-Boot%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9 ...

  5. uboot自定义添加命令

    1.添加命令 1.u-boot的命令格式: U_BOOT_CMD(name,maxargs,repeatable,command,”usage”,"help") name:命令的名 ...

  6. spring boot中注册拦截器

    拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重 ...

  7. 在VS中向命令行添加参数的方法

    在VS中向命令行添加参数的方法 在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击要 添加参数的工程-->属性-->配置属性-->调试,在右侧“命令参数”栏输入 ...

  8. step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework

    文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...

  9. Fedora 21 中添加及更新源的命令

    原文: Fedora 21 中添加及更新源的命令 fedora的软件源信息文件(*.repo)都是放在 /etc/yum.repos.d 目录下的.可以通过# ls -l /etc/yum.repos ...

随机推荐

  1. [路由] -- Yii2 url地址美化与重写

    转载:http://blog.csdn.net/lmjy102/article/details/53857520

  2. java中的逻辑运算符,以及&与&&的区别,|与||的区别

    原创,转载请留言联系 逻辑运算符: & 与 false&true=false:true&true=true:false&false=false 必须两个都是true才返 ...

  3. Centos7 环境准备

    Centos7 环境准备 #关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭selinux sed -i 's/SELINU ...

  4. [PAT] 1142 Maximal Clique(25 分)

    1142 Maximal Clique(25 分) A clique is a subset of vertices of an undirected graph such that every tw ...

  5. jpa缓存导致无法查询到更新后的数据&android出现ANR的一个解决办法

    1. 向服务器更新记录后查询,始终查询不到更新后的信息 只能查到更新之前的,马上推断出是缓存的问题.网上搜索一番,将问题定位为jpa缓存,我们要设置jpa查询时不从缓存中取,直接从数据库中取,这样便能 ...

  6. TCP Socket Port Check

    写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不 ...

  7. 用webpy实现12306余票查询

    效果

  8. initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 解决办法

    initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 1. 设置 ...

  9. 前端读者 | 如何判断Javascript对象是否存在

    本文来自@阮一峰 Javascript语言的设计不够严谨,很多地方一不小心就会出错. 举例来说,请考虑以下情况. 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对它进行声明.用自然语言 ...

  10. lvm笔记

    安装LVMyum -y install lvm* 创建PV# pvcreate /dev/md5 /dev/sdf1 /dev/sdg 查看PV# pvdisplay 还可以使用命令pvs 和pvsc ...