1.啟動延時
如果配置了啟動延遲功能,U-Boot等待用戶從控制臺(一般為串口)輸入字符,等待的時間由頂層配置文件中的宏定義 CONFIG_BOOTDELAY 決定 。在此期間,只要用戶按下任意按鍵就會中斷等待,進入命令行輸入模式。
如果沒有配置啟動延時功能或者啟動延時超過了設置的時間, U-Boot 運行啟動命令行參數,啟動命令參數在頂層配置文件中,由 CONFIG_BOOTCOMMAND宏定義。
2.讀取命令行輸入
命令行輸入模式實際上是一個死循環,循環體簡化后如下所示:
for (;;) {
len = readline (CONFIG_SYS_PROMPT);
flag = 0; /* assume no special flags for now */
if (len > 0)
strcpy (lastcommand, console_buffer);
else if (len == 0)
flag |= CMD_FLAG_REPEAT;
if (len == -1)
puts ("< INTERRUPT >n");
else
rc = run_command(lastcommand, flag);
if (rc <= 0) {
/* invalid command or not repeatable, forget it */
lastcommand[0] = 0;
}
}
每次循環調用readline函數從控制臺讀取命令行,并且讀取到的字符存儲在console_buffer緩沖區中。
console_buffer緩沖區的長度在頂層文件中通過CONFIG_SYS_CBSIZE宏定義。
當該函數在接收到一個回車鍵時認定為命令行輸入結束,返回命令行長度len。
如果len大于0,將存儲在緩沖區的命令行拷貝至靜態數組lastcommand中,flag設置為0。
如果len等于0,即readline函數僅僅接收到一個回車鍵,即直接返回,flag設置為CMD_FLAG_REPEAT,lastcommand數組存放的數據不變。
flag用于標志是否重復上次操作,每個命令都有一個 repeatable標志,當命令的該標志為1時,此時,命令能夠重復操作。
把lastcommand和flag作為run_command函數的參數,進而調用run_command函數。
從 run_command 函數是否會返回的角度看,U-Boot 的命令分為兩類。
一類是函數返回數值rc,rc小于等于0 ,則傳入的命令行參數有誤,命令無效,此時把lastcommand數組清零,不再執行重復操作。
另外一類是不再返回,一去不再復返 ,例如bootm、go等命令,這類用于啟動內核,將CPU的管理權從U-Boot交付給內核,完成自己啟動內核的終極使命。
3.解析命令行
傳入的 lastcommand 參數僅僅是 readline 函數讀取到用戶輸入的字符,接下來最主要的工作是解析命令行。
首先判斷傳入的lastcommand參數是否為空,如果是返回?1,否則繼續往下解析。截取函數的關鍵代碼如下,str指針指向 lastcommand區域 。
while (*str) {
for (inquotes = 0, sep = str; *sep; sep++) {
if ((*sep==''') &&
(*(sep-1) != ''))
inquotes=!inquotes;
if (!inquotes &&
(*sep == ';') && /* separator */
( sep != str) && /* past string start */
(*(sep-1) != '')) /* and NOT escaped */
break;
}
U-Boot允許命令行存在多個命令,命令間用“;”或者“;”字符分割。
token = str;
if (*sep) {
str = sep + 1; /* start of command for next pass */
*sep = '?';
}
else
str = sep; /* no more commands for next pass */
/* Extract arguments */
if ((argc = parse_line (finaltoken, argv)) == 0) {
rc = -1; /* no command at all */
continue;
}
if (cmd_process(flag, argc, argv, &repeatable, NULL))
rc = -1;
首先解析一個命令,token指向待解析命令的地址。
parse_line函數分離出命令的各個參數,分別存放在argv中,參數的數目為argc,接著調用common/command.c文件中的cmd_process函數處理解析得到的命令。
值得注意的是, 命令的第一個參數是命令的名稱 。當前命令處理完畢后, token指向命令行中的下一個命令,直到所有的命令都處理完畢。
-
Linux
+關注
關注
87文章
11319瀏覽量
209830 -
控制臺
+關注
關注
0文章
85瀏覽量
10378 -
函數
+關注
關注
3文章
4338瀏覽量
62739 -
Uboot
+關注
關注
4文章
125瀏覽量
28256
發布評論請先 登錄
相關推薦
評論