1、**位置
(1)uboot命令體系的實現**在uboot/common/cmd_***.c中。有若干個.c檔案和命令體系有關。(還有command.c main.c也是和命令有關的)
2、傳參方式
命令引數以argc&argv傳給函式
(1)有些uboot的命令還支援傳遞引數。也就是說命令背後對應的函式接收的引數列表中有argc和argv,然後命令體系會把我們執行命令時的命令+引數(md 30000000 10)以argc(3)和argv(argv[0]=md, argv[1]=30000000 argv[2]=10)的方式傳遞給執行命令的函式。
3、uboot命令解析和執行過程分析
(1)uboot啟動的第二階段,在初始化了所有該初始化的東西後,進入了乙個死迴圈,死迴圈的迴圈體就是main_loop。
(2)main_loop函式執行一遍,就是乙個獲取命令、解析命令、執行命令的過程。
(3)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)執行命令。最後用函式指標的方式呼叫執行了對應函式。
3、儲存方式
__u_boot_cmd_start = .;
.u_boot_cmd :
__u_boot_cmd_end = .;
命令結構體cmd_tbl_t
struct cmd_tbl_s ;(1)name:命令名稱,字串格式。typedef struct cmd_tbl_s cmd_tbl_t;
(2)maxargs:命令最多可以接收多少個引數
(3)repeatable:指示這個命令是否可重複執行。重複執行是uboot命令列的一種工作機制,就是直接按回車則執行上一條執行的命令。
(4)cmd:函式指標,命令對應的函式的函式指標,將來執行這個命令的函式時使用這個函式指標來呼叫。
(5)usage:命令的短幫助資訊。對命令的簡單描述。
(6)help:命令的長幫助資訊。細節的幫助資訊。
(7)complete:函式指標,指向這個命令的自動補全的函式。
總結:uboot的命令體系在工作時,乙個命令對應乙個cmd_tbl_t結構體的乙個例項,然後uboot支援多少個命令,就需要多少個結構體例項。uboot的命令體系把這些結構體例項管理起來,當使用者輸入了乙個命令時,uboot會去這些結構體例項中查詢(查詢方法和儲存管理的方法有關)。如果找到則執行命令,如果未找到則提示命令未知。
4、uboot實現命令管理的思路
(1)填充1個結構體例項構成乙個命令
(2)給命令結構體例項附加特定段屬性(使用者自定義段),鏈結時將帶有該段屬性的內容鏈結在一起排列(挨著的,不會夾雜其他東西,也不會丟掉乙個帶有這種段屬性的,但是順序是亂序的)。
(3)uboot重定位時將該段整體載入到ddr中。載入到ddr中的uboot映象中帶有特定段屬性的這一段其實就是命令結構體的集合,有點像乙個命令結構體陣列。
(4)段起始位址和結束位址(鏈結位址、定義在u-boot.lds中)決定了這些命令集的開始和結束位址。
uboot命令定義具體實現分析
(1)u_boot_cmd巨集基本分析
這個巨集定義在uboot/common/command.h中。
u_boot_cmd(5、.uboot中增加自定義命令version, 1, 1, do_version,
"version - print monitor version\n",
null
);這個巨集替換後變成:
cmd_tbl_t __u_boot_cmd_version __attribute__ ((unused,section (".u_boot_cmd"))) =
1、在已有的c檔案中直接新增命令
(1)在uboot/common/command.c中新增乙個命令,叫:mycmd
(2)在已有的.c檔案中新增命令比較簡單,直接使用u_boot_cmd巨集即可新增命令,給命令提供乙個do_***的對應的函式這個命令就齊活了。
(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中新增命令非常簡單。
#include #include intdo_mycmd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv)
u_boot_cmd(
mycmd, 1, 1, do_mycmd,
"version - print monitor version\n",
null
);
UBOOT的命令體系分析
uboot啟動後進入命令列模式,即可輸入命令 uboot會進行命令接收,命令解析,命令執行操作 uboot的命令體系實現 在uboot common cmd xx.c中 command.c 和main.c也和命令相關 每個命令都對應乙個函式 有些命令支援傳參 和main引數傳參差不多 使用argc ...
uboot移植之uboot命令體系解析
1 回歸到main loop uboot啟動第二階段的最後,進入死迴圈main loop 函式,命令列中沒輸出一次命令,就會執行一次main loop函式,完成一次命令的獲取 解析和執行。2 uboot命令體系的實現原理 uboot中裡面維護了很多命令,每個命令對應乙個結構體變數,當我們在命令列輸入...
uboot命令的實現
這是一篇介紹uboot命令實現的文章 這uboot命令的實現過程中,使用到了鏈結文字uboot.lds中定義的內容。這裡,我有順便檢視了鏈結文字的使用 這裡定義的lds文字主要是被聯結器做 鏈結時使用的,arm gcc ld 就是常見的聯結器 比如有 test.lds a.o b.o 運用命令arm...