当前位置:
首页 >
u-boot分析之命令实现(四)
发布时间:2025/4/5
43
豆豆
生活随笔
收集整理的这篇文章主要介绍了
u-boot分析之命令实现(四)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
u-boot(四)命令实现
- 分析run_command
- 小结
- 自定义一个命令
- 代码
- makefile
u-boot(四)命令实现
命令是如何实现的?
所以会有一个命令的结构体[name,fun],该结构体含有命令的name和对应的fun函数。
分析run_command
函数原型如下 int run_command (const char *cmd, int flag)
命令搜索if ((cmdtp = find_cmd(argv[0])) == NULL),可以发现结构体
struct cmd_tbl_s {char *name; /* Command Name */int maxargs; /* maximum number of arguments */int repeatable; /* autorepeat allowed? *//* Implementation function */int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);char *usage; /* Usage message (short) */ #ifdef CFG_LONGHELPchar *help; /* Help message (long) */ #endif #ifdef CONFIG_AUTO_COMPLETE/* do auto completion on the arguments */int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]); #endif };查看函数,可以发现是在__u_boot_cmd_start和__u_boot_cmd_end中遍历,这个地址是在链接脚本中定义的,也就是命令这个东西,有一个特殊的属性,定位到某个地址.
. = .;__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;搜索这个段属性.u_boot_cmd,在include\command.h有这么一个宏
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))再搜索下这个宏
#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}再搜索一下这个U_BOOT_CMD,可以发现其实就是命令了,搜索下命令bootm,在common\cmd_bootm.c中
U_BOOT_CMD(bootm, CFG_MAXARGS, 1, do_bootm,"bootm - boot application image from memory\n",//注意,下面的几个是没有逗号,是整体"[addr [arg ...]]\n - boot application image stored in memory\n""\tpassing arguments 'arg ...'; when booting a Linux kernel,\n""\t'arg' can be the address of an initrd image\n" );尝试着展开这个宏,可以发现就是定义了一个段属性特殊的结构体,也就是命令结构体
cmd_tbl_t __u_boot_cmd_bootm Struct_Section= {"bootm",CFG_MAXARGS,1,do_bootm,"bootm - boot application image from memory\n",//下面的字符串是一个整体"[addr [arg ...]]\n - boot application image stored in memory\n""\tpassing arguments 'arg ...'; when booting a Linux kernel,\n""\t'arg' can be the address of an initrd image\n" }- repeatable 可重复,指的是直接按回车是否继续执行上次命令
- usage,短的help,指的是直接输入help查看的所有命令显示的帮助
- help,具体的help,指的是help cmd 查看的具体的信息
小结
自定义一个命令
参考common/cmd_bootm.c的头文件,编写源代码cmd_hello.c
代码
#include <common.h> #include <watchdog.h> #include <command.h> #include <image.h> #include <malloc.h> #include <zlib.h> #include <bzlib.h> #include <environment.h> #include <asm/byteorder.h> int do_hello (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {int i ;printf ("hello world %d \n,", argc);//打印下参数for(i=0;i<argc;i++){printf ("argv[%d] is %s \n",i,argv[i]);}return 0; }U_BOOT_CMD(hello, CFG_MAXARGS, 1, do_hello,"this is short help for hello just test\n","this is long help for hello just test\n" );makefile
修改common的makefile,只需要在COBJS上加上cmd_hello.o
转载:https://www.cnblogs.com/zongzi10010/p/10023679.html
总结
以上是生活随笔为你收集整理的u-boot分析之命令实现(四)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: u-boot分析之内核启动(五)
- 下一篇: u-boot分析之两阶段代码分析(三)