0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Uboot啟動(dòng)延時(shí)和讀取命令行輸入

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:Hcoco ? 2023-12-04 17:16 ? 次閱讀

1.啟動(dòng)延時(shí)

如果配置了啟動(dòng)延遲功能,U-Boot等待用戶(hù)從控制臺(tái)(一般為串口)輸入字符,等待的時(shí)間由頂層配置文件中的宏定義 CONFIG_BOOTDELAY 決定 。在此期間,只要用戶(hù)按下任意按鍵就會(huì)中斷等待,進(jìn)入命令行輸入模式。

如果沒(méi)有配置啟動(dòng)延時(shí)功能或者啟動(dòng)延時(shí)超過(guò)了設(shè)置的時(shí)間, U-Boot 運(yùn)行啟動(dòng)命令行參數(shù),啟動(dòng)命令參數(shù)在頂層配置文件中,由 CONFIG_BOOTCOMMAND宏定義。

2.讀取命令行輸入

命令行輸入模式實(shí)際上是一個(gè)死循環(huán),循環(huán)體簡(jiǎn)化后如下所示:

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;
                }
            }

每次循環(huán)調(diào)用readline函數(shù)從控制臺(tái)讀取命令行,并且讀取到的字符存儲(chǔ)在console_buffer緩沖區(qū)中。

console_buffer緩沖區(qū)的長(zhǎng)度在頂層文件中通過(guò)CONFIG_SYS_CBSIZE宏定義。

當(dāng)該函數(shù)在接收到一個(gè)回車(chē)鍵時(shí)認(rèn)定為命令行輸入結(jié)束,返回命令行長(zhǎng)度len。

如果len大于0,將存儲(chǔ)在緩沖區(qū)的命令行拷貝至靜態(tài)數(shù)組lastcommand中,flag設(shè)置為0。

如果len等于0,即readline函數(shù)僅僅接收到一個(gè)回車(chē)鍵,即直接返回,flag設(shè)置為CMD_FLAG_REPEAT,lastcommand數(shù)組存放的數(shù)據(jù)不變。

flag用于標(biāo)志是否重復(fù)上次操作,每個(gè)命令都有一個(gè) repeatable標(biāo)志,當(dāng)命令的該標(biāo)志為1時(shí),此時(shí),命令能夠重復(fù)操作。

把lastcommand和flag作為run_command函數(shù)的參數(shù),進(jìn)而調(diào)用run_command函數(shù)。

從 run_command 函數(shù)是否會(huì)返回的角度看,U-Boot 的命令分為兩類(lèi)。

一類(lèi)是函數(shù)返回?cái)?shù)值rc,rc小于等于0 ,則傳入的命令行參數(shù)有誤,命令無(wú)效,此時(shí)把lastcommand數(shù)組清零,不再執(zhí)行重復(fù)操作。

另外一類(lèi)是不再返回,一去不再?gòu)?fù)返 ,例如bootm、go等命令,這類(lèi)用于啟動(dòng)內(nèi)核,將CPU的管理權(quán)從U-Boot交付給內(nèi)核,完成自己?jiǎn)?dòng)內(nèi)核的終極使命。

3.解析命令行

傳入的 lastcommand 參數(shù)僅僅是 readline 函數(shù)讀取到用戶(hù)輸入的字符,接下來(lái)最主要的工作是解析命令行。

首先判斷傳入的lastcommand參數(shù)是否為空,如果是返回?1,否則繼續(xù)往下解析。截取函數(shù)的關(guān)鍵代碼如下,str指針指向 lastcommand區(qū)域 。

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允許命令行存在多個(gè)命令,命令間用“;”或者“;”字符分割。

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;

首先解析一個(gè)命令,token指向待解析命令的地址。

parse_line函數(shù)分離出命令的各個(gè)參數(shù),分別存放在argv中,參數(shù)的數(shù)目為argc,接著調(diào)用common/command.c文件中的cmd_process函數(shù)處理解析得到的命令。

值得注意的是, 命令的第一個(gè)參數(shù)是命令的名稱(chēng) 。當(dāng)前命令處理完畢后, token指向命令行中的下一個(gè)命令,直到所有的命令都處理完畢。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11211

    瀏覽量

    208721
  • 控制臺(tái)
    +關(guān)注

    關(guān)注

    0

    文章

    85

    瀏覽量

    10328
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4284

    瀏覽量

    62325
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    125

    瀏覽量

    28127
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    uboot啟動(dòng)怎么停在uboot命令行

    256M的nandflash已經(jīng)裝入了uboot1.1.6和linux2.6.22. 在啟動(dòng)的時(shí)候,我想讓板子啟動(dòng)時(shí)停在uboot命令行,但
    發(fā)表于 06-17 05:45

    為什么uboot啟動(dòng)命令行之后一直重復(fù)內(nèi)容?

    最近遇到一個(gè)問(wèn)題,uboot啟動(dòng)命令行之后,用md 命令顯示內(nèi)存 但是每隔16M都會(huì)重復(fù)flash的內(nèi)容。比如 md 0x1c000000 和0x1d000000以及0x1e0000
    發(fā)表于 08-19 05:01

    如何通過(guò)uboot命令行去更新內(nèi)核呢

    如何通過(guò)uboot命令行去更新內(nèi)核、dtb、uboot文件?
    發(fā)表于 01-11 07:07

    cmd網(wǎng)絡(luò)經(jīng)典命令行

    cmd網(wǎng)絡(luò)經(jīng)典命令行:
    發(fā)表于 06-11 15:17 ?36次下載
    cmd網(wǎng)絡(luò)經(jīng)典<b class='flag-5'>命令行</b>

    caxa命令行中的應(yīng)用

    caxa命令行中的應(yīng)用 命令行對(duì)于大多用戶(hù)來(lái)說(shuō)往往只是輸入數(shù)據(jù)的作用,但是其中的奧妙還有很多,下面就給大家
    發(fā)表于 10-18 18:18 ?2276次閱讀

    博達(dá)環(huán)網(wǎng)配置命令行

    博達(dá)工業(yè)交換要環(huán)網(wǎng)配置命令行
    發(fā)表于 12-27 16:24 ?0次下載

    CMD的命令行高級(jí)教程

    CMD的命令行高級(jí)教程
    發(fā)表于 10-24 08:31 ?30次下載
    CMD的<b class='flag-5'>命令行</b>高級(jí)教程

    通過(guò)命令行操控電腦的命令大全匯總

    下面提供多種方法和各種參數(shù),你可以使用這些參數(shù)通過(guò)命令行重新啟動(dòng)本地和遠(yuǎn)程計(jì)算機(jī)。
    發(fā)表于 05-05 17:29 ?3834次閱讀

    Linux命令行與shell腳本編寫(xiě)

    Linux命令行與shell腳本編寫(xiě)
    發(fā)表于 01-11 16:50 ?4次下載

    linux命令行與shell編程實(shí)戰(zhàn)

    Linux命令行與Shell編程實(shí)戰(zhàn)主要涉及以下內(nèi)容: Linux命令行基礎(chǔ):學(xué)習(xí)Linux命令行的基本操作,如文件管理、進(jìn)程管理、網(wǎng)絡(luò)配置等。熟悉使用命令行能夠提高工作效率,提升自己
    的頭像 發(fā)表于 11-08 10:57 ?715次閱讀

    linux虛擬機(jī)怎么調(diào)出命令行

    在Linux虛擬機(jī)中調(diào)出命令行界面,可以通過(guò)以下步驟實(shí)現(xiàn): 打開(kāi)虛擬機(jī),進(jìn)入到Linux系統(tǒng)。 在桌面或應(yīng)用菜單中找到終端或命令行圖標(biāo),點(diǎn)擊打開(kāi)。 輸入命令行指令,執(zhí)行相應(yīng)的操作。 另
    的頭像 發(fā)表于 11-08 11:28 ?2942次閱讀

    linux切換到命令行模式

    在Linux中,可以通過(guò)以下步驟切換到命令行模式: 打開(kāi)終端。可以在應(yīng)用菜單中找到終端或命令行終端。 在終端中輸入命令“exit”或“l(fā)ogout”,然后按回車(chē)鍵。 系統(tǒng)會(huì)提示您
    的頭像 發(fā)表于 11-13 16:47 ?1692次閱讀

    linux命令行運(yùn)行步驟

    現(xiàn)光標(biāo)右邊出現(xiàn)了一個(gè)類(lèi)似于“ ”或“#”的字符,這就是命令行提示符。在大多數(shù)Linux發(fā)行版中,普通用戶(hù)的提示符是“ ”,而管理員或root用戶(hù)的提示符是“#”。 查找可用的命令 Linux系統(tǒng)有許多命令可供使用,可以通過(guò)
    的頭像 發(fā)表于 11-17 10:18 ?735次閱讀

    eclipse怎么使用命令行

    命令行中使用Eclipse來(lái)完成一些特定的任務(wù)。本文將詳細(xì)介紹如何在命令行中使用Eclipse。 首先,我們需要確保已經(jīng)正確安裝了JDK(Java Development Kit)和Eclipse
    的頭像 發(fā)表于 12-06 11:26 ?2348次閱讀

    idea如何輸入命令行參數(shù)

    在許多軟件開(kāi)發(fā)和系統(tǒng)管理的任務(wù)中,我們經(jīng)常需要向應(yīng)用程序傳遞命令行參數(shù)。命令行參數(shù)是在運(yùn)行時(shí)傳遞給程序的值,用于指定程序的行為和配置選項(xiàng)。本文將詳細(xì)介紹如何在不同的編程語(yǔ)言和操作系統(tǒng)中輸入命令
    的頭像 發(fā)表于 12-06 15:01 ?1032次閱讀