网站建设招标评分标准,郑州网站建设三猫网络,徐州做网站的设计师,兴文县建设工程网站一、uboot 命令体系基础
1、使用 uboot 命令
(1) uboot 启动后进入命令行环境下#xff0c;在此输入命令按回车结束#xff0c;uboot 会收取这个命令然后解析#xff0c;然后执行。 2、uboot 命令体系实现代码在哪里
(1) uboot 命令体系的实现代码在 uboot/common/cmd_xx…一、uboot 命令体系基础
1、使用 uboot 命令
(1) uboot 启动后进入命令行环境下在此输入命令按回车结束uboot 会收取这个命令然后解析然后执行。 2、uboot 命令体系实现代码在哪里
(1) uboot 命令体系的实现代码在 uboot/common/cmd_xxx.c 中。有若干个 .c 文件和命令体系有关。还有 command.c main.c 也是和命令有关的 3、每个命令对应一个函数
(1) 每一个 uboot 的命令背后都对应一个函数。这就是 uboot 实现命令体系的一种思路和方法。
(2) 我们要找到每一个命令背后所对应的那个函数而且要分析这个函数和这个命令是怎样对应起来的。 4、命令参数以 argc argv 传给函数
(1) 有些 uboot 的命令还支持传递参数。也就是说命令背后对应的函数接收的参数列表中有 argc 和 argv然后命令体系会把我们执行命令时的命令参数md 30000000 10以 argc3和 argvargv[0]md, argv[1]30000000 argv[2]10的方式传递给执行命令的函数。
举例分析以 help 命令为例 help 命令背后对应的函数名叫do_help。在 uboot/common/command.c 的236行。int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) 二、uboot 命令解析和执行过程分析
1、从 main_loop 说起
(1) uboot 启动的第二阶段在初始化了所有该初始化的东西后进入了一个死循环死循环的循环体就是 main_loop。
(2) main_loop 函数执行一遍就是一个获取命令、解析命令、执行命令的过程。
(3) run_command 函数就是用来执行命令的函数。 2、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) 执行命令。最后用函数指针的方式调用执行了对应函数。 思考关键点就在于 find_cmd 函数如何查找到这个命令是不是 uboot 的合法支持的命令这取决于 uboot 的命令体系机制uboot 是如何完成命令的这一套设计的命令如何去注册、存储、管理、索引。。 三、uboot如何处理命令集1
1、可能的管理方式
(1) 数组。结构体数组数组中每一个结构体成员就是一个命令的所有信息。
(2) 链表。链表的每个节点 data 段就是一个命令结构体所有的命令都放在一条链表上。这样就解决了数组方式的不灵活。坏处是需要额外的内存开销然后各种算法遍历、插入、删除等需要一定复杂度的代码执行。
(3) 有第三种吗uboot 没有使用数组或者链表而是使用了一种新的方式来实现这个功能。 2、命令结构体 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 会去这些结构体实例中查找查找方法和存储管理的方法有关。如果找到则执行命令如果未找到则提示命令未知。 3、uboot 实现命令管理的思路 (1) 填充 1 个结构体实例构成一个命令
(2) 给命令结构体实例附加特定段属性用户自定义段链接时将带有该段属性的内容链接在一起排列挨着的不会夹杂其他东西也不会丢掉一个带有这种段属性的但是顺序是乱序的。
(3) uboot 重定位时将该段整体加载到 DDR 中。加载到 DDR 中的 uboot 镜像中带有特定段属性的这一段其实就是命令结构体的集合有点像一个命令结构体数组。
(4) 段起始地址和结束地址链接地址、定义在 u-boot.lds 中决定了这些命令集的开始和结束地址。 四、uboot 如何处理命令集2
1、uboot 命令定义具体实现分析
(1) U_BOOT_CMD 宏基本分析 这个宏定义在 uboot/include/command.h 中。
U_BOOT_CMD( version, 1, 1, do_version, “version - print monitor version\n”, NULL );
这个宏替换后变成
cmd_tbl_t __u_boot_cmd_version attribute ((unused,section (“.u_boot_cmd”))) {#name, maxargs, rep, cmd, usage, help} 总结这个 U_BOOT_CMD 宏的理解关键在于结构体变量的名字和段属性。名字使用 ## 作为连字符附加了用户自定义段属性以保证链接时将这些数据结构链接在一起排布。
(2) 链接脚本。 2、find_cmd 函数详解 (1) find_cmd 函数的任务是从当前 uboot 的命令集中查找是否有某个命令。如果找到则返回这个命令结构体的指针如果未找到返回 NULL。
(2) 函数的实现思路很简单如果不考虑命令带点的情况md.b md.w 这种就更简单了。查找命令的思路其实就是 for 循环遍历数组的思路不同的是数组的起始地址和结束地址是用地址值来给定的数组中的元素个数是结构体变量类型。 3、U_BOOT_CMD 宏详解
(1) 这个宏其实就是定义了一个命令对应的结构体变量这个变量名和宏的第一个参数有关因此只要宏调用时传参的第一个参数不同则定义的结构体变量不会重名。 4、命令举例version 命令 五、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中添加命令非常简单。 源自朱友鹏老师.