0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Uboot启动延时和读取命令行输入

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-04 17:16 次阅读

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

    文章

    10991

    浏览量

    206735
  • 控制台
    +关注

    关注

    0

    文章

    82

    浏览量

    10229
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27873
收藏 人收藏

    评论

    相关推荐

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh
    发表于 12-09 11:32 1623次阅读

    uboot启动怎么停在uboot命令行

    256M的nandflash已经装入了uboot1.1.6和linux2.6.22. 在启动的时候,我想让板子启动时停在uboot命令行,但
    发表于 06-17 05:45

    为什么uboot启动命令行之后一直重复内容?

    最近遇到一个问题,uboot启动命令行之后,用md 命令显示内存 但是每隔16M都会重复flash的内容。比如 md 0x1c000000 和0x1d000000以及0x1e0000
    发表于 08-19 05:01

    如何通过uboot命令行去更新内核呢

    如何通过uboot命令行去更新内核、dtb、uboot文件?
    发表于 01-11 07:07

    C语言入门教程-命令行参数

    命令行参数 在C中,获取用户输入命令行参数是很方便的。程序的主函数会接受一个argv参数。有许多高级的库函数都会用到argv结构,所以了解此结构对一个C程序员来
    发表于 07-29 14:22 2475次阅读

    caxa命令行中的应用

    caxa命令行中的应用 命令行对于大多用户来说往往只是输入数据的作用,但是其中的奥妙还有很多,下面就给大家
    发表于 10-18 18:18 2164次阅读

    博达环网配置命令行

    博达工业交换要环网配置命令行
    发表于 12-27 16:24 0次下载

    CMD的命令行高级教程

    CMD的命令行高级教程
    发表于 10-24 08:31 30次下载
    CMD的<b class='flag-5'>命令行</b>高级教程

    Golang基于flag库实现一个命令行工具

    Golang 标准库中的 flag 库提供了解析命令行选项的能力,我们可以基于此来开发命令行工具。
    的头像 发表于 10-28 09:26 976次阅读

    一个开源MCU级的命令行交互组件

    一个开源MCU级命令行交互组件~
    的头像 发表于 10-17 16:26 192次阅读
    一个开源MCU级的<b class='flag-5'>命令行</b>交互组件

    linux虚拟机怎么调出命令行

    在Linux虚拟机中调出命令行界面,可以通过以下步骤实现: 打开虚拟机,进入到Linux系统。 在桌面或应用菜单中找到终端或命令行图标,点击打开。 输入命令行指令,执行相应的操作。 另
    的头像 发表于 11-08 11:28 1644次阅读

    linux切换到命令行模式

    在Linux中,可以通过以下步骤切换到命令行模式: 打开终端。可以在应用菜单中找到终端或命令行终端。 在终端中输入命令“exit”或“logout”,然后按回车键。 系统会提示您
    的头像 发表于 11-13 16:47 817次阅读

    linux虚拟机怎么调出命令行

    命令行的方式可以因不同的虚拟机软件而异,下面将介绍几种常用的虚拟机软件以及它们调出命令行的方法。 VMware虚拟机 VMware是一个功能强大的虚拟机软件,它具有广泛的应用领域和用户群体。在VMware虚拟机中,你可以通过以下步骤调出
    的头像 发表于 11-17 09:55 2151次阅读

    linux命令行运行步骤

    现光标右边出现了一个类似于“ ”或“#”的字符,这就是命令行提示符。在大多数Linux发行版中,普通用户的提示符是“ ”,而管理员或root用户的提示符是“#”。 查找可用的命令 Linux系统有许多命令可供使用,可以通过
    的头像 发表于 11-17 10:18 348次阅读

    idea如何输入命令行参数

    在许多软件开发和系统管理的任务中,我们经常需要向应用程序传递命令行参数。命令行参数是在运行时传递给程序的值,用于指定程序的行为和配置选项。本文将详细介绍如何在不同的编程语言和操作系统中输入命令
    的头像 发表于 12-06 15:01 369次阅读