命令處理
main.c中的代碼實現了將一個命令的所有參數分離存放在argv數組中,參數的數目為argc,完成了讀取命令行和解析命令行的工作。命令的處理由common/command.c文件中的函數完成。U-Boot在include/command.h中定義了一個非常重要的cmd_tbl_s結構體,它在命令的實現方面起著至關重要的作用。
struct cmd_tbl_s {
char *name; /* 命令名稱 */
int maxargs; /* 命令的最大參數 */
int repeatable; /* 是否可重復(按回車鍵是否會重復執行)
*/
int (*cmd)(struct cmd_tbl_s *, int, int, char * const []); /* 命令響應函數*/
char *usage; /* 簡短的用法說明 */
#ifdef CONFIG_SYS_LONGHELP
char *help; /* 較詳細的幫助*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* 響應自動補全參數*/
int (*complete)(int argc,char*const argv[],char last_char,int maxv,char*cmdv[]);
#endif
};
cmd_tbl_s結構體包含的成員變量:命令名稱、最大參數個數、可重復性、命令響應函數、用法、幫助和命令補全函數,每個命令都由這個結構體來描述。當輸入“help”或者“?”會打印出所有的命令和它的usage,輸入“help”或者“?”和命令名稱時,會打印出help信息。
添加一個命令時,利用宏U_BOOT_CMD定義一個新的cmd_tbl_s結構體,并對這個結構體初始化和定義結構體的屬性。例如,在文件common/cmd_bdinfo.c中:
U_BOOT_CMD(
bdinfo, 1, 1, do_bdinfo,
"print Board Info structure",
""
);
增加了一個命令,它的名稱為bdinfo,最大參數數目為1,可重復,響應函數是do_bdinfo, usage為“print Board Info structure”,沒有幫助信息。U_BOOT_CMD宏在include/command.h中定義,當不配置命令補全時,它最終被展開為:
#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}
其中,“##”與“#”是預編譯操作符,“##”表示字符串連接,“#”表示后面緊接著的是一個字符串。cmd_tbl_t就是struct cmd_tbl_s,用于__u_boot_cmd_##name結構體。
__attribute__定義了結構體的屬性,將結構體放在.u_boot_cmd段中。簡單的說,就是利用U_BOOT_CMD定義struct cmd_tbl_s結構體變量,并把類變量都放在一個段中。
在鏈接腳本中指定了.u_boot_cmd段的起始地址和結束地址,又已知每個struct cmd_tbl_s結構體占用內存空間的大小,這樣就很方便地遍歷所有的struct cmd_tbl_s結構體。這種巧妙的方式充分利用了鏈接器的功能特點,避免了花費大量的精力,去維護和更新命令結構體表。
cmdtp = find_cmd(argv[0]);
if (cmdtp == NULL) {
printf("Unknown command '%s' - try 'help'n", argv[0]);
return 1;
}
cmd_process函數首先調用find_cmd函數根據傳入的參數,在.u_boot_cmd段區域查找命令,如果沒有找到對應的命令,打印出提示信息并返回。
如果找到則返回命令結構體 cmdtp,再檢查傳入參數的合法性,最后通過cmd_call函數調用命令響應函數(cmdtp->cmd)(cmdtp, flag, argc, argv)。
-
內核
+關注
關注
3文章
1402瀏覽量
40905 -
Linux
+關注
關注
87文章
11414瀏覽量
212248 -
函數
+關注
關注
3文章
4363瀏覽量
63778 -
Uboot
+關注
關注
4文章
126瀏覽量
28728
發布評論請先 登錄
相關推薦
uboot啟動怎么停在uboot命令行
編譯IMX6ULL開發板的Uboot和Linux內核
uboot與linux內核進行適配
uboot和linux內核構建的環境設置是否相同?
在github上下載Xilinx提供的Opensource linux和uboot內核gz格式壓縮包的方法

UBOOT命令總結
基于ARM9和NANDFlash對uboot和Linux內核進行修改

英創信息技術嵌入式Linux工控主板uboot命令簡介

【嵌入式】構建嵌入式Linux系統(uboot、內核、文件系統)

評論