1.命令的注册
2.命令的调用
3.命令的执行
4.命令的返回
1 命令的注册(以help为例)
cmd/help.c
10 static int do_help(struct cmd_tbl *cmdtp, int flag, int argc,
11 char *const argv[])
12 {
13 #ifdef CONFIG_CMDLINE
14 struct cmd_tbl *start = ll_entry_start(struct cmd_tbl, cmd);
15 const int len = ll_entry_count(struct cmd_tbl, cmd);
16 return _do_help(start, len, cmdtp, flag, argc, argv);
17 #else
18 return 0;
19 #endif
20 }
21
22 U_BOOT_CMD(
23 help, CONFIG_SYS_MAXARGS, 1, do_help,
24 "print command description/usage",
25 "n"
26 " - print brief description of all commandsn"
27 "help command ...n"
28 " - print detailed usage of 'command'"
29 );
----------------------- 以上的代码展开为以下代码
----------------------- 具体怎么注册以及怎么查找的请参考 __attribute__
----------------------- __attribute__ demo : https://github.com/lisider/attribute_sample
static int do_help(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct cmd_tbl *start = ({ static char start[0] __attribute__((__aligned__(4))) __attribute__((unused, section(".u_boot_list_2_""cmd""_1"))); (struct cmd_tbl *)&start; });
const int len = ({ struct cmd_tbl *start = ({ static char start[0] __attribute__((__aligned__(4))) __attribute__((unused, section(".u_boot_list_2_""cmd""_1"))); (struct cmd_tbl *)&start; }); struct cmd_tbl *end = ({ static char end[0] __attribute__((__aligned__(4))) __attribute__((unused, section(".u_boot_list_2_""cmd""_3"))); (struct cmd_tbl *)&end; }); unsigned int _ll_result = end - start; _ll_result; });
return _do_help(start, len, cmdtp, flag, argc, argv);
}
struct cmd_tbl _u_boot_list_2_cmd_2_help __attribute__((__aligned__(4))) __attribute__((unused, section(".u_boot_list_2_""cmd""_2_""help"))) = { "help", 16, 1 ? cmd_always_repeatable : cmd_never_repeatable, do_help, "print command description/usage", "n" " - print brief description of all commandsn" "help command ...n" " - print detailed usage of 'command'",
# 22 "../cmd/help.c" 3 4
((void *)0)
# 22 "../cmd/help.c"
, };
2 命令的调用
cmd_call 被调用的时机
1. bootcmd
2. cmdline
所有的命令的调用都是 cmd_call 调用的 // cmd_call 不直接调用 do_xxx
以help 为例 , do_help的调用堆栈为
cmd_call
cmd_always_repeatable // 以该 字符串为关键字 在 全文搜索
do_help
common/command.c 564-585
564 /**
565 * Call a command function. This should be the only route in U-Boot to call
566 * a command, so that we can track whether we are waiting for input or
567 * executing a command.
568 *
569 * @param cmdtp Pointer to the command to execute
570 * @param flag Some flags normally 0 (see CMD_FLAG_.. above)
571 * @param argc Number of arguments (arg 0 must be the command text)
572 * @param argv Arguments
573 * @param repeatable Can the command be repeated
574 * @return 0 if command succeeded, else non-zero (CMD_RET_...)
575 */
576 static int cmd_call(struct cmd_tbl *cmdtp, int flag, int argc,
577 char *const argv[], int *repeatable)
578 {
579 int result;
580
上一篇:OK6410A 开发板 (三) 12 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 boot 详细解析1
下一篇:OK6410A 开发板 (三) 10 u-boot-2021.01 boot 解析 U-boot 镜像运行部分 cmdline
推荐阅读最新更新时间:2024-11-19 17:46
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 ADR421 的参考设计
- AM1G-4805SH30Z 5V 1W DC/DC 转换器的典型应用
- 谐振器底层(双层)
- LTC3539EDCB 演示板、2A、1MHz 同步升压型 DC/DC 转换器
- LTC3622IMSE-2 5V/3.3V Vout、突发模式操作、同相开关同步降压稳压器的典型应用电路
- EVB-USB2660,带有超快速闪存媒体控制器的 USB2660 USB 2.0 2 端口集线器评估板
- EVAL-AD7980SDZ,用于 AD7980BRMZ 10 引脚 MSOP 的 16 位、1 MSPS PulSAR ADC 评估板
- 具有双输入的 LTC3126EUFD 12V、2MHz 降压转换器的典型应用电路
- TCA830单片集成山东单片集成电路的典型应用
- OP413ESZ超精密RTD放大器的典型应用