1. 程式人生 > >Uboot命令實現與實現原理

Uboot命令實現與實現原理

1.實現過程

(1)在./common資料夾下新建cmd_study.c,並在此檔案中新增如下內容

#include<common.h>
#include<command.h>



int do_study (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	printf("I'm learning the uboot !")
		return 0;
}



U_BOOT_CMD(
 	study,	2,	1,	do_study,
 	"I'm learning uboot .....",
 	"I'm learining uboot  I'mlenaring uboot jidjidfjdiajfdld...!"
);

(2)在./common/Makefile中新增:

obj-y += cmd_itxiebo.o

(3)在linux環境下,重新編譯u-boot,得到u-boot.bin,並升級到自己的開發板中驗證

2 實現原理

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 = {#name, maxargs, rep, cmd, usage, help}

引數解釋:
name:命令名字
maxargs:命令引數個數最大值,CFG_MAXARGS=16
rep:可重複
cmd:操作函式
usage:簡單的幫助資訊
help:詳細的幫助資訊
把U_BOOT_CMD巨集展開:
cmd_tbl_t _u_boot_cmd##name attribute ((unused,section (".u_boot_cmd"))) =
{#name, maxargs, rep, cmd, usage, help}

對於每個使用U_BOOT_CMD巨集來定義的命令,其實都是在“.u_boot_cmd”段中定義一個cmd_tbl_t結構。連結指令碼u-boot.lds中有如下程式碼:
在這裡插入圖片描述


程式中就是根據命令的名字在記憶體段__u_boot_cmd_start~__u_boot_cmd_end找到它的cmd_tbl_t結構,然後呼叫它的函式。

cmd_tbl_t _u_boot_cmd##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
定義一個cmd_tbl_t結構體,其中這個結構體的成員就是#name, maxargs, rep, cmd, usage, help,
亦即巨集U_BOOT_CMD的作用。

3.study命令的執行過程:

在U-Boot中輸入(串列埠終端)“study”命令執行時,U-Boot接收輸入的字串“study”,傳遞給run_command()函式。run_command()函式呼叫common/command.c中實現的find_cmd()函式在u_boot_list段內查詢命令,並返回study命令的cmd_tbl_t結構。然後run_command()函式使用返回的cmd_tbl_t結構中的函式指標呼叫study命令的響應函式ddo_study,從而完成了命令的執行。