u boot 中的命令實現

2021-08-18 02:18:55 字數 2038 閱讀 4410

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中,新增一些供自己除錯和開發的命令,這樣會更方便快捷...