命令處理
main.c中的代碼實(shí)現(xiàn)了將一個(gè)命令的所有參數(shù)分離存放在argv數(shù)組中,參數(shù)的數(shù)目為argc,完成了讀取命令行和解析命令行的工作。命令的處理由common/command.c文件中的函數(shù)完成。U-Boot在include/command.h中定義了一個(gè)非常重要的cmd_tbl_s結(jié)構(gòu)體,它在命令的實(shí)現(xiàn)方面起著至關(guān)重要的作用。
struct cmd_tbl_s {
char *name; /* 命令名稱 */
int maxargs; /* 命令的最大參數(shù) */
int repeatable; /* 是否可重復(fù)(按回車鍵是否會(huì)重復(fù)執(zhí)行)
*/
int (*cmd)(struct cmd_tbl_s *, int, int, char * const []); /* 命令響應(yīng)函數(shù)*/
char *usage; /* 簡(jiǎn)短的用法說明 */
#ifdef CONFIG_SYS_LONGHELP
char *help; /* 較詳細(xì)的幫助*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* 響應(yīng)自動(dòng)補(bǔ)全參數(shù)*/
int (*complete)(int argc,char*const argv[],char last_char,int maxv,char*cmdv[]);
#endif
};
cmd_tbl_s結(jié)構(gòu)體包含的成員變量:命令名稱、最大參數(shù)個(gè)數(shù)、可重復(fù)性、命令響應(yīng)函數(shù)、用法、幫助和命令補(bǔ)全函數(shù),每個(gè)命令都由這個(gè)結(jié)構(gòu)體來描述。當(dāng)輸入“help”或者“?”會(huì)打印出所有的命令和它的usage,輸入“help”或者“?”和命令名稱時(shí),會(huì)打印出help信息。
添加一個(gè)命令時(shí),利用宏U_BOOT_CMD定義一個(gè)新的cmd_tbl_s結(jié)構(gòu)體,并對(duì)這個(gè)結(jié)構(gòu)體初始化和定義結(jié)構(gòu)體的屬性。例如,在文件common/cmd_bdinfo.c中:
U_BOOT_CMD(
bdinfo, 1, 1, do_bdinfo,
"print Board Info structure",
""
);
增加了一個(gè)命令,它的名稱為bdinfo,最大參數(shù)數(shù)目為1,可重復(fù),響應(yīng)函數(shù)是do_bdinfo, usage為“print Board Info structure”,沒有幫助信息。U_BOOT_CMD宏在include/command.h中定義,當(dāng)不配置命令補(bǔ)全時(shí),它最終被展開為:
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)
cmd_tbl_t __u_boot_cmd_##name __attribute__((unused, section(".u_boot_cmd"), aligned( 4))) = {#name, maxargs, rep, cmd, usage, help}
其中,“##”與“#”是預(yù)編譯操作符,“##”表示字符串連接,“#”表示后面緊接著的是一個(gè)字符串。cmd_tbl_t就是struct cmd_tbl_s,用于__u_boot_cmd_##name結(jié)構(gòu)體。
__attribute__定義了結(jié)構(gòu)體的屬性,將結(jié)構(gòu)體放在.u_boot_cmd段中。簡(jiǎn)單的說,就是利用U_BOOT_CMD定義struct cmd_tbl_s結(jié)構(gòu)體變量,并把類變量都放在一個(gè)段中。
在鏈接腳本中指定了.u_boot_cmd段的起始地址和結(jié)束地址,又已知每個(gè)struct cmd_tbl_s結(jié)構(gòu)體占用內(nèi)存空間的大小,這樣就很方便地遍歷所有的struct cmd_tbl_s結(jié)構(gòu)體。這種巧妙的方式充分利用了鏈接器的功能特點(diǎn),避免了花費(fèi)大量的精力,去維護(hù)和更新命令結(jié)構(gòu)體表。
cmdtp = find_cmd(argv[0]);
if (cmdtp == NULL) {
printf("Unknown command '%s' - try 'help'n", argv[0]);
return 1;
}
cmd_process函數(shù)首先調(diào)用find_cmd函數(shù)根據(jù)傳入的參數(shù),在.u_boot_cmd段區(qū)域查找命令,如果沒有找到對(duì)應(yīng)的命令,打印出提示信息并返回。
如果找到則返回命令結(jié)構(gòu)體 cmdtp,再檢查傳入?yún)?shù)的合法性,最后通過cmd_call函數(shù)調(diào)用命令響應(yīng)函數(shù)(cmdtp->cmd)(cmdtp, flag, argc, argv)。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1373瀏覽量
40310 -
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209713 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4333瀏覽量
62699 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28249
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論