uboot命令行模式run_command函数的实现

uboot命令行模式大家应该都清楚,实际上都是靠run_command函数

我是基于AM3358的uboot来说明的,其实其他的都一样,各个版本uboot的这个函数好像都是一个样子的。

1.先看一下u-boot.lds文件,其中有如下一段,先记着这个事情。

2.在command.h中有如下代码:

一:

二:

三:

这些代码要记着,之后就会揭晓他们的作用啦!

3.举一个例子进行分析,cmd_menu.c中

这里就是重点啦!看到U_BOOT_CMD就是2中的一个宏定义,这段代码结合2中的代码看,可以发现这段代码的作用就是:定义一个cmd_tbl_t结构体,其中这个结构体的成员中,最重要的就是名字为menu,参数个数为3,要执行的动作是do_menu这个函数。最后这个结构体属性就是存在1中所展现的链接脚本的u_boot_cmd段。

这只是其中一例,会有很多这样的.c文件,也就是说会有很多cmd_tbl_t结构体的!会有很多的名字,很多的名字所对应的执行动作函数!

4.进入run_command函数看一看:

发现这个函数前半段是在解析参数。

后面会调用一个find_cmd函数,这个函数作用就是从__uboot_cmd_start开始根据第一个参数寻找到__uboot_cmd_stop,找到名字相同的cmd_tbl_t结构体,并返回。

最后就是执行找到的这个结构体中的执行动作函数啦,参数就是run_command的参数。

举个例子来说更好。run_command("nand read 0x300000000 kernel")

这个函数会根据nand这个名字遍历所有的处于_uboot_cmd这个段中的cmd_tbl_t结构体,找到结构体成员变量名字也是nand的这个结构体,返回这个结构体。然后调用这个结构体成员函数——所对应的执行动作函数(do_nand),这个在cmd_nand.c中找就ok了。然后read 0x300000000 kernel就是do_nand的参数。

也就是说run_command("nand read 0x300000000 kernel")相当于do_nand("read 0x300000000 kernel")

总结:

1:在command目录下有很多cmd_name.c类似的文件。每个文件都传建一个cmd_tbl_t结构体并存在uboot_cmd段中。主要指定名字和所要执行的函数do_name

2:run_command函数接受参数,解析,然后根据参数第一个单词,遍历uboot_cmd段,找到name相同的结构体,调用该结构体的do_name函数。


--------------------- 
作者:无人机大嘴猴 
来源:CSDN 
原文:https://blog.csdn.net/bmouth_monkey/article/details/72782070 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值