u-boot命令处理机制

以前在u-boot中添加自定命令时,非常惊讶在u-boot中添加自定义命令是如此的简单。只需要使用u-boot提供的一个宏定义,就可以将自己写好的命令添加到u-boot中。对于一些高级语言,比如说java可能通过反射的机制很容易实现。但是对于C这种语言,要达到如此高的灵活度,实在是无法想象。由于当时比较忙,对于细节也没有深入研究。趁如今比较闲,深入了解一下。

如何在u-boot中添加命令

u-bootcommon下,建立自己的命令文件,如cmd_test.c


#include<common.h>

#include<command.h>


intdo_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

printf("justa test \n");

return0;

}


U_BOOT_CMD(


dfu, 1, 1, do_test,

"enterthe dfu mode.",

"\n enter the dfu mode . "

);



只需要将自己定义的要实现的功能intdo_test(cmd_tbl_t *cmdtp, int flag, int argc, char*argv[])用改格式封装好(至于为什么要如此封装,与cmd_tbl_t的结构有关),并使用定义U_BOOT_CMD宏将do_test方法封装一下就好了。当然还需要修改common下的Makefile文件,将cmd_test.c加入编译方可。

实现分析

先看一下U_BOOT_CMD的定义,在common.h中。U_BOOT_CMD的定义如下:


#defineU_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \

cmd_tbl_t__u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd,usage, help}


其中Struct_Secion的定义如下:


#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))



由此可见,被U_BOOT_CMD定义过的结构体,最终回被放到一个u_boot_cmd段中。可以通过readef工具进行验证,会发现在生成的目标文件中,确实多了一个.u_boot_mcd段。

再看一下u-boot的链接脚本,其中有这么一段:


.u_boot_cmd: {

__u_boot_cmd_start= .;

*(.u_boot_cmd)

__u_boot_cmd_end= .;

}

uboot_end_data= .;


可以发现该脚本将所有的.u_boot_cmd放在了一起。而起还定义了两个常量__u_boot_cmd_start__u_boot_cmd_end还表示所有命令的起始位置和结束位置。最后只需对该段进行遍历就可以得到所有的命令了。最后生成的u-boot可执行文件中会包含如下的一段.



获取所有U_BOOT_CMD的命令如下:

cmd_tbl_t *find_cmd (const char *cmd)
{
    int len = &__u_boot_cmd_end - &__u_boot_cmd_start;
    return find_cmd_tbl(cmd, &__u_boot_cmd_start, len);
}
cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len)
{
    cmd_tbl_t *cmdtp_temp = table;    /*Init value */

    for (cmdtp = table;
         cmdtp != table + table_len;
         cmdtp++) {
            ….
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值