u-bootu-bootu-bootu-boot 命令处理机制
以前在 u-boot中添加自定命令时,非常惊讶在 u-boot中添加自定义命令是如
此的简单。只需要使用 u-boot提供的一个宏定义,就可以将自己写好的命令添
加到 u-boot中。对于一些高级语言,比如说 java可能通过反射的机制很容易实
现。但是对于 C这种语言,要达到如此高的灵活度,实在是无法想象。由于当
时比较忙,对于细节也没有深入研究。趁如今比较闲,深入了解一下。
如何在 u-bootu-bootu-bootu-boot中添加命令
在 u-boot的 common下,建立自己的命令文件,如 cmd_test.c。
只需要将自己定义的要实现的功能 int do_test(cmd_tbl_t *cmdtp, int
flag, int argc, char *argv[])用改格式封装好(至于问什么要如此封装,与
cmd_tbl_t的结构有关),并使用定义 U_BOOT_CMD宏将 do_test方
法封装一下就好了。当然还需要修改 common下的Makefile文件,将
cmd_test.c加入编译方可。
实现
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
先看一下 U_BOOT_CMD的定义,在 common.h中。U_BOOT_CMD
#include
#include
int do_test(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
printf("just a test \n");
return 0;
}
U_BOOT_CMD(
dfu, 1 , 1, do_test,
"enter the dfu mode.",
"\n enter the dfu mode . "
);
的定义如下:
其中 Struct_Secion的定义如下:
由此可见,被 U_BOOT_CMD定义过的结构体,最终回被放到一个
u_boot_cmd段中。可以通过 readef工具进行验证,会发现在生成的
目标文件中,确实多了一个.u_boot_mcd段。
再看一下 u-boot的链接脚本,其中有这么一段:
可以发现该脚本将所有的.u_boot_cmd放在了一起。而起还定义了两
个常量__u_boot_cmd_start和__u_boot_cmd_end还表示所有命令的起
始位置和结束位置。最后只需对该段进行遍历就可以得到所有的命令
了。最后生成的 u-boot可执行文件中会包含如下的一段:
#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}
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
.u_boot_cmd : {
__u_boot_cmd_start = .;
*(.u_boot_cmd)
__u_boot_cmd_end = .;
}
uboot_end_data = .;
.text
. . .其 他 段
.U_BO O T_C M D
_ _ U_BO O T_C M D _START
_ _ U_BO O T_C M D _START
. . .
获取所有 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++) {
….
}
}
如何在u-boot中添加命令
实现分析