嵌入式开发——uboot中命令执行函数(main_loop函数)

2023-10-27

1、main_loop()函数源码

从uboot中摘抄的部分main_loop函数,为了便于理解,函数只保留了主线部分代码,一些用宏定义控制的代码被删除掉了。

void main_loop (void)
	{
		static char lastcommand[CFG_CBSIZE] = { 0, };
		int len;
		int rc = 1;
		int flag;

	#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0) //是否有bootdelay
		char *s;
		int bootdelay;
	#endif

	#ifdef CONFIG_BOOTCOUNT_LIMIT //启动次数的限制
		unsigned long bootcount = 0;
		unsigned long bootlimit = 0;
		char *bcs;
		char bcs_set[16];
	#endif /* CONFIG_BOOTCOUNT_LIMIT */

	#ifdef CONFIG_BOOTCOUNT_LIMIT
		bootcount = bootcount_load();//读取已经启动的次数
		bootcount++;
		bootcount_store (bootcount);//将启动次数加1再写回去保存起来
		sprintf (bcs_set, "%lu", bootcount);
		setenv ("bootcount", bcs_set); //设置已经启动的次数到环境变量bootcount
		bcs = getenv ("bootlimit");//从环境变量获取启动次数的上限,此时返回的是字符串还需要转换成整数
		bootlimit = bcs ? simple_strtoul (bcs, NULL, 10) : 0;
	#endif /* CONFIG_BOOTCOUNT_LIMIT */

	#ifdef CONFIG_VERSION_VARIABLE	//设置ver环境变量,里面保存的是uboot的版本
		{
			extern char version_string[];

			setenv ("ver", version_string);  /* set version variable */
		}
	#endif /* CONFIG_VERSION_VARIABLE */

	#ifdef CONFIG_AUTO_COMPLETE //命令的自动补全功能
		install_auto_complete();
	#endif

	#ifdef CONFIG_FASTBOOT//支持fastboot刷机
		if (fastboot_preboot())
			run_command("fastboot", 0);
	#endif

	/* 下面就是实现uboot启动延时机制bootdelay的代码 */
	#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
		s = getenv ("bootdelay"); /* 从环境变量获取启动延时的秒数 */
		bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;

		debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);

	/* 检查启动次数是否超过上限*/
	#ifdef CONFIG_BOOTCOUNT_LIMIT
		if (bootlimit && (bootcount > bootlimit)) {
			printf ("Warning: Bootlimit (%u) exceeded. Using altbootcmd.\n",
					(unsigned)bootlimit);
			s = getenv ("altbootcmd");
		}
		else
	#endif /* CONFIG_BOOTCOUNT_LIMIT */
			s = getenv ("bootcmd"); /* 从环境变量获取启动内核的命令 */

		debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");

		/*abortboot函数是检测在bootdelay时间内是否有人按键:如果有人按键则返回1;
			超过bootdelay的时间没有人按键则返回0,if条件满足则启动内核*/
		if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
	#ifdef CONFIG_AUTOBOOT_KEYED
			int prev = disable_ctrlc(1);	/* 禁止 ctrl+c 功能 */
	#endif
			run_command (s, 0);	//启动内核

	#ifdef CONFIG_AUTOBOOT_KEYED
			disable_ctrlc(prev);	/* 恢复 ctrl+c 功能 */
	#endif
		}

	#endif	/* CONFIG_BOOTDELAY */

		/*
		 * 下面是一个死循环,不停的从控制台读取命令解析,直到执行bootm命令去启动内核
		 */
		for (;;) {
			len = readline (CFG_PROMPT); //从控制台读取一行指令,存放在console_buffer

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

2、abortboot函数

该函数的传参是bootdelay,函数内部会不停的去检测当前是否有按键被按下,如果有则返回1,超时则返回0。

3、readline函数

该函数是从控制台读取一行数据,也就是从串口读取,但是有控制台实现了行缓冲。

4、run_command函数

以输入"setenv bootdelay 5"为例。
传参是readline读取到的指令;内部parse_line函数先进行字符处理,解析成argc=3, argv[0]=setenv ,argv[1]=bootdelay, argv[0]=5;cmdtp = find_cmd(argv[0])去查找当前是否有该命令,如果找到会返回该命令的结构体;执行命令:(cmdtp->cmd) (cmdtp, flag, argc, argv)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式开发——uboot中命令执行函数(main_loop函数) 的相关文章

  • U-Boot相关命令开发板烧写问题及解决方案

    前言 最近在学习u boot命令在开发板的烧写 在进行该实验的过程中 出现了很多问题和错误 在这里我根据自己的开发历程 将我出现的几大问题进行了汇总 并附有相关解决办法 这些解决方案都经过我亲自验证有效 希望能让大家在开发过程中有所启发 问
  • 嵌入式开发——uboot如何启动内核(以zImage详解)

    1 vmlinuz vmlinux Image zImage与uImage的区别 参考博客 vmlinuz vmlinux Image zImage与uImage的区别 uboot启动内核的大致步骤 1 首先uboot要通过读取SD卡 fl
  • iMX6ULL-UBoot移植

    U Boot移植 文章目录 U Boot移植 1 获取源码 1 1 从u boot官网获取 1 2 从芯片厂商获取 1 3 从开发板厂商获取 2 移植 2 1 生成自己的配置文件 2 1 1 拷贝参考板的配置文件 2 1 2 生成修改配置文
  • linux文件系统初始化过程(2)---挂载rootfs文件系统

    一 目的 本文主要讲述linux3 10文件系统初始化过程的第一阶段 挂载rootfs文件系统 rootfs是基于内存的文件系统 所有操作都在内存中完成 也没有实际的存储设备 所以不需要设备驱动程序的参与 基于以上原因 linux在启动阶段
  • uboot编译报错解决

    uboot编译报错 root ubuntu home gjt uboot u boot 2015 01 make scripts kconfig conf silentoldconfig Kconfig scripts kconfig co
  • 02_uboot的工作方式_常用命令_常用环境变量

    一 uboot的工作方式 1 uboot的本质 uboot的本质是一个裸机程序 由若干的 c文件和 h文件组成 配置编译后生成uboot bin 把这个镜像文件烧录至启动介质中给soc启动 一般的uboot大小在180k 400k之间 我你
  • s5p4418的uboot网络无法使用问题解决

    一 前言 s5p4418 是一个三星的基于ARM的 cortex A9的四核处理器 这个 处理器目前常用的两个系统层固件分别是 uboot2014 linux3 4 39 和 uboot2016 linux4 4 172 两个版本 本次针对
  • uboot联网以及uboot重启问题

    一 配置uboot联网 虚拟机联网 配置uboot联网 1 配置uboot环境变量 setenv ipaddr 192 168 10 50 开发板ip地址 setenv ethaddr 00 04 9f 04 d2 35 mcu期间地址 多
  • TQ210烧写uboot secureCRT和minicom都没有信息输出

    前几天一直在纠结TQ210烧写uboot 串口没有信息打印信息输出 结果又是这样的 说明波特率 串口号都是正确的 开发板一上电 按住空格键 结果还是一样 本以为是这个软件是破解版 有BUG 好 切换到LINUX 使用minicom 试试 还
  • [ZYNQ随笔] uboot移植中bitstream比特流加载问题:zynq_validate_bitstream: Bitstream is not validated yet

    问题介绍 由于项目设计需要 需要频繁的更换比特流文件 之前使用petalinux生成的boot bin每次都需要合并比特流 比较麻烦 遂换了一个uboot版本 米联客默认的u boot 将bitstream放到了独立于boot bin的文件
  • 海思芯片(hi3516dv300)uboot镜像生成过程详解

    1 前言 1 本文介绍的uboot编译过程是基于海思提供SDK包里的uboot源码进行编译 具体的编译参数是根据hi3516dv300芯片来设置的 编译生成的uboot烧录镜像也是用于hi3516dv300芯片的uboot镜像 2 对于Ma
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 为什么使用 uImage 而不是 zImage

    我正在尝试了解 zImage 和 uImage 之间的区别 以我的理解uImage是通过运行得到的mkimage on the Image结果它添加了一个 U Boot 包装器 我不知道它到底包含什么 其中包含header加上加载地址和入口
  • 嵌入式linux ARM启动地址

    我按照一些文档通过 sdcard 在 ARM 板 例如 Freescale Vybrid tower 上启动嵌入式 Linux 在文档中 有构建 uImage 并将 u boot 写入 sdcard 的步骤 如下所示 sudo dd if
  • lv12 uboot移植深化 9

    u boot 2013 0 1移植 实验目的 了解 u boot 的代码结构及移植 的基本 方法 实验环境 u buntu 14 04
  • 在 U-Boot 中使用 I2C 读取多个字节

    我的 Freescale p1022tw 板的 I2C 驱动程序有问题 U Boot 的控制台上有一个从 I2C 设备读取的命令 i2c md chip address 0 1 2 of objects 当我从 id 为 0x60 地址为
  • 为什么补丁找不到这个文件?

    我想对 u boot 源代码应用补丁 但是 Linux 不允许我这么做 我拥有的 reg ubuntu NextGen trunk FW thirdparty u boot patch p1 lt u boot u boot 2013 01
  • u-boot 可以支持多个以太网端口吗?

    我想从多个以太网端口执行 ping 操作 u boot 仅支持单个以太网端口是否存在固有限制 u boot 可以支持多个以太网端口吗 是的 在最近版本的 U Boot 中 至少可以追溯到 2012 10 突出的代码是eth current
  • 基于 BBB DT 的方法

    我已经使用平台设备模型成功为我的自定义协议实现了基于 GPIO 的驱动程序 我想使用设备树方法升级它 因此 对于初学者来说 我有一个 beaglebone black 并且我使用在 uboot 控制台消息显示期间启用和验证的设备树配置交叉编
  • Beaglebone Black 的 U-boot 无法构建 - 目标 CPU 不支持 THUMB 指令

    我正在尝试按照 Chris Simmonds 的 掌握嵌入式 Linux 编程 中的说明为 Beagle Bone Black 构建 u boot 我已经构建了交叉工具链 现在正在尝试使用该工具链构建 Das U boot 但由于不支持 T

随机推荐

  • FastDFS是如何解决数据一致性问题的?

    FastDFS是如何解决数据一致性问题的 本篇文章转载于 FastDFS 作者 余庆 大佬的 FastDFS分享与交流 公众号 保证数据一致性是分布式系统面临的最大难题 尤其是要做到数据强一致性 FastDFS 作为一款分布式文件系统 是如
  • springboot pageHelper实现分页

    pom xml 节点 dependencies 下添加 pagehelper 依赖
  • MyBatis3框架详解(二)

    一 MyBatis全局配置文件 MyBatis的全局配置文件包含设置 settings 和属性 properties 信息 文档结构如下 二 全局配置文件中 引入dtd约束 目的 为了在全局配置文件 mybatis config xml 中
  • PHPStorm常用插件及安装方法

    进入 File gt Settings gt Plugins gt Browse repositories 搜索你想要的插件 推荐几个常用插件 env files support 可以在env函数使用是提示 env文件中所有的key值的自动
  • 鸿蒙开发初体验从注册开始带你跑第一个页面

    文章目录 1 HUAWEI DevEco Studio 1 1 运行环境要求 1 2 华为账号与实名认证 1 2 1 注册华为账号 1 2 2 实名认证 1 2 3 个人银行卡认证 1 3 下载和安装DevEco Studio 1 4 下载
  • C函数 printf 拼接字符串

    C函数 printf 拼接字符串 从前学C语言 最常用的函数可能就是 printf 了 但是往往是这样 printf 年龄是 d a 由于不懂得怎么拼接字符串 有时候只能用两个printf 语句 很难受 使用多个双引号 printf hel
  • 将普通Maven项目改成Web项目的步骤

    第一步 新建一个Maven项目 第二步 项目右键Properties 选择Project Facets 勾选Dynamic Web Module 第三步 点击下面的Further configuration available 第四步 设置
  • Selenium/webdriver介绍以及工作原理

    最近在看一些底层的东西 driver翻译过来是驱动 司机的意思 如果将webdriver比做成司机 竟然非常恰当 我们可以把WebDriver驱动浏览器类比成出租车司机开出租车 在开出租车时有三个角色 乘客 他 她告诉出租车司机去哪里 大概
  • zotero使用说明

    工欲善其事 必先利其器 Zotero作为一款文献管理软件 其所实现的功能满足了我对 文献管理 的所有想象 从基础的文献存储 文献分类 文献阅读 到文献阅读 笔记 文献之间的关联 再到丰富的插件 它像一个工具箱 阅读文献不再需要来自各个软件工
  • idrac给服务器重装系统,DELL服务器如何使用iDRAC安装操作系统

    一 IDRAC远程控制卡的介绍 iDRAC卡相当于是附加在服务器上的一台独立运行的小型pc 通过与服务器主板上的管理芯片BMC进行通信 监控与管理服务器的硬件状态信息 它拥有自己的系统和IP地址 与服务器上的OS无关 是服务器管理员进行远程
  • IOS UItableView 滚动到底 触发事件

    开发过程中 在使用UItableView 总会遇到加载更多的问题 到底是手势响应瀑布流的方法好 还是添加一个底端cell点击触发加载更多好 我也想有自己的判断 但是我们老板总说了算 没办法 谁叫我给人家打工呢 cell触发式略 这个很简单
  • stm32cube配置定时器

    STM32Cube 是一种支持 STM32 微控制器的软件工具 用于快速配置和生成嵌入式应用程序代码 在 STM32Cube 中配置定时器的步骤如下 打开 STM32CubeMX 工具 创建一个新工程 在 Pinout Configurat
  • r语言进行go富集分析_生信实操

    看图说话栏目曾介绍过GSEA的原理 看图说话 GSEA分析 教你解锁高级的富集分析 今天我们来看一下如何利用R语言进行GSEA分析 如果你有RNA seq的数据 就可以这样做 先把数据整成这样 一共两列 一列是SYMBOL 一列是foldC
  • Python 练习实例03:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    题目 一个整数 它加上100后是一个完全平方数 再加上168又是一个完全平方数 请问该数是多少 解题思路 首先根据题目体去除所需要的关键信息 什么是完全平方数 可以写成某个整数的平方的数1 1 4 2 9 3 1 首先 x 100 n 2
  • CICD 流程学习(一)Git 介绍与使用

    一 版本控制 1 基本概念 版本控制是管理修改的艺术 指对软件开发过程中各种程序代码 配置文件及说明文档等文件的变更管理 是软件管理配置的核心思想之一 2 版本控制的好处 优雅的备份 本地和服务器均保存备份文件 当文件出现问题时可以通过服务
  • 2019人工智能科普--汇总

    2019 3 2 中科馆大讲堂直播 从 流浪地球 到 三体 解读科幻与现实中的人工智能 https www cdstm cn zhibo 201902 t20190222 909511 html 关键点 1 人工智能 弱人工智能的应用 2
  • linux710权限可以吗,Linux权限管理

    一 基本权限 基本概述 不同用户有不同权限 在服务器上 每个用户都会定义合理的等级 一般只有一个管理员 其他都是普通用户 二 文件基本权限 1 Linux文件权限的设定 r w x 文件类型 普通文件 d 目录文件 l 软连接文件 R 读
  • RHCE第二次作业

    1 配置ntp时间服务器 确保客户端主机能和服务主机同步时间 2 设置ssh免密登录能够实现客户端主机通过服务端的red hat账号进行基于公钥验证方式的远程连接 root server timedatectl systemctl stop
  • 三层架构介绍

    文章目录 一 什么是三层架构 1 1概述 1 2表示层 1 3业务逻辑层 1 4数据访问层 1 5层与层的关系 二 为什么需要三层架构 三 层架构的应用 3 1原则 3 2例子 实现登录功能 一 什么是三层架构 1 1概述 三层架构 3 t
  • 嵌入式开发——uboot中命令执行函数(main_loop函数)

    1 main loop 函数源码 从uboot中摘抄的部分main loop函数 为了便于理解 函数只保留了主线部分代码 一些用宏定义控制的代码被删除掉了 void main loop void static char lastcomman