u-boot 中的命令實現
我們知道,u-boot的執行過程是首先進行一些初始化化工作,然後在乙個死
迴圈中不斷接收串列埠的命令並進行解釋執行,下面我們就看看執行部分**的實
現,見common/main.c中的run_command:
int run_command (const char *cmd, int flag)
/* look up command in command table */
if ((cmdtp = find_cmd(argv[0])) == null)
/* found - check max args */
if (argc > cmdtp->maxargs) …
/* ok - call function to do the command */
if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0)
repeatable &= cmdtp->repeatable;
/* did the user stop this? */
if (had_ctrlc ())
return 0; /* if stopped then not repeatable */ }
return rc ? rc : repeatable; }
很簡單的乙個過程,擴充套件巨集定義 -> 分析命令及其引數 -> 查詢命令 -> 執
行命令,有意思的地方在查詢命令上(common/command.c):
cmd_tbl_t *find_cmd (const char *cmd)
} if (n_found == 1)
return null; /* not found or ambiguous command */ }
看起來還是很簡單的乙個過程,在乙個命令陣列中查詢是否有指定名稱的命
令。問題是,在這裡使用的兩個符號__u_boot_cmd_start和__u_boot_cmd_end,
在所有的c檔案中都找不到它們的定義,那麼它們的空間從**來呢?這些分散
在不同檔案中的結構體又是如何能夠放在同乙個陣列中呢?
答案就在board/bf561-ezkit/u-boot.lds.s中,這個檔案其實就是乙個鏈
接檔案,類似於vdsp中的ldf檔案,see see:
___u_boot_cmd_start = .;
.u_boot_cmd :
___u_boot_cmd_end = .;
這幾句話的意思其實就是指示鏈結器將所有.u_boot_cmd資料段中的內容全
部放在一起,而且___u_boot_cmd_start和___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 =
__attribute__ ((unused,section (".u_boot_cmd")))就指示編譯器將這些用u_boot_cmd定
義的結構體放在.u_boot_cmd這個資料段中。
如果要在vdsp中編譯u-boot,那麼就需要在ldf檔案中也定義這樣乙個數
據段:.u_boot_cmd
> mem_sdram_u_boot
不過讓人鬱悶的是:如果在乙個定義命令的c檔案中沒有乙個函式被其它文
件引用,vdsp在鏈結時將認為這是乙個多餘的檔案,從而不會將這個檔案中的
函式鏈結進來,當然就無法使用其中定義的這些命令,如cmd_load.c。
解決的辦法可以是在這些檔案中新增乙個空函式,並在主函式中呼叫它們,
這樣vdsp就會把這個檔案鏈結進來了。
uboot命令的實現
這是一篇介紹uboot命令實現的文章 這uboot命令的實現過程中,使用到了鏈結文字uboot.lds中定義的內容。這裡,我有順便檢視了鏈結文字的使用 這裡定義的lds文字主要是被聯結器做 鏈結時使用的,arm gcc ld 就是常見的聯結器 比如有 test.lds a.o b.o 運用命令arm...
u boot中新增命令
看下ping命令實現的例子 檔案common cmd net.c static int do ping cmd tbl t cmdtp,int flag,int argc,char const argv printf host s is alive n argv 1 return 0 u boot ...
U boot中定製自己的命令
我們使用u boot的時候,大多數都是直接編譯再移植了,很少改動裡面的具體內容,特別是其中包含的命令等。雖然裡面包含了一些常用的提供給使用者進行互動的命令,並且也比較實用了。但是,根據某些開發板的特殊操作和使用者的特定需求,還是不得不去在uboot中,新增一些供自己除錯和開發的命令,這樣會更方便快捷...