uboot启动流程-run_main_loop 到 cmd_process处理说明一

news2024/11/15 13:29:29

一.   uboot启动

uboot命令模式:uboot 启动以后会进入 3 秒倒计时,如果在 3 秒倒计时结束之前按下按下回车键,那么就会进入 uboot 的命令模式。
如果在 uboot 倒计时结束以后都没有按下回车键,就会自动启动 Linux 核 , 这 个 功 能 就 是 由 run_main_loop 函 数 来 完 成 的 。

二.  run_main_loop函数 到 cmd_process处理

1.  run_main_loop函数

run_main_loop 函 数 定 义 在 文 件 common/board_r.c 中,函数内容如下:
static int run_main_loop(void)
{
#ifdef CONFIG_SANDBOX
	sandbox_main_loop_init();
#endif
	/* main_loop() can return to retry autoboot, if so just run it again */
	for (;;)
		main_loop();
	return 0;
}

" for (;;) " " while(1) " 功能一样,死循环里面就一个 main_loop 函数。

2.  main_loop 函数

main_loop 函数定义在 common/main.c 文件 里面。 代码如下:
void main_loop(void)
{
	const char *s;

	bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");

#ifndef CONFIG_SYS_GENERIC_BOARD
	puts("Warning: Your board does not use generic board. Please read\n");
	puts("doc/README.generic-board and take action. Boards not\n");
	puts("upgraded by the late 2014 may break or be removed.\n");
#endif

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

	cli_init();

	run_preboot_environment_command();

#if defined(CONFIG_UPDATE_TFTP)
	update_tftp(0UL, NULL, NULL);
#endif /* CONFIG_UPDATE_TFTP */

	s = bootdelay_process();
	if (cli_process_fdt(&s))
		cli_secure_boot_cmd(s);

	autoboot_command(s);

	cli_loop();
}

main_loop 函数中:

5 行,调用 bootstage_mark_name 函数,打印出启动进度。

13 行,如果定义了宏 CONFIG_VERSION_VARIABLE 就会执行函数 setenv ,设置
变量 ver 的值为 version_string ,也就是设置版本号环境变量。 version_string 定义在文件
cmd/version.c 中,定义如下:
const char __weak version_string[] = U_BOOT_VERSION_STRING;
经过搜索,一系列分析可知,Uboot打印如下:

U-Boot 2016.03 (Jul 07 2023 - 17:11:27 +0800)

17 行, cli_init 函数,跟命令初始化有关,初始化 hush shell 相关的变量。
19 行, run_preboot_environment_command 函数,获取环境变量 perboot 的内容, perboot 是一些预启动命令,一般不使用这个环境变量。
25 行, bootdelay_process 函数,此函数会读取环境变量 bootdelay bootcmd 的内容, 然后将 bootdelay 的值赋值给全局变量 stored_bootdelay ,返回值为环境变量 bootcmd 的值。
26 行, 如果定义了 CONFIG_OF_CONTROL 的话函数 cli_process_fdt 就会实现,如果 没有定义 CONFIG_OF_CONTROL 的话函数 cli_process_fdt 直接返回一个 false 在本 uboot 中没有定义 CONFIG_OF_CONTROL ,因此 cli_process_fdt 函数返回值为 false

29 行, autoboot_command 函数,此函数就是检查倒计时是否结束?倒计时结束之前有 没有被打断?此函数定义在文件 common/autoboot.c

74 行的 cli_loop 函数,这个就是命令处理函数。如果倒计时结束之前按下按键, 那么就会执行 cli_loop 函数,负责接收好处理输入的命令。

cli_loop 函数是 uboot 的命令行处理函数,我们在 uboot 中输入各种命令,进行各种操作就
是有 cli_loop 来处理的,此函数定义在文件 common/cli.c 中。cli_loop函数如下:
void cli_loop(void)
{
#ifdef CONFIG_SYS_HUSH_PARSER
	parse_file_outer();
	/* This point is never reached */
	for (;;);
#else
	cli_simple_loop();
#endif /*CONFIG_SYS_HUSH_PARSER*/
}

void cli_init(void)
{
#ifdef CONFIG_SYS_HUSH_PARSER
	u_boot_hush_start();
#endif

#if defined(CONFIG_HUSH_INIT_VAR)
	hush_init_var();
#endif
}
在文件 include/configs/mx6_common.h 中有定义宏 CONFIG_SYS_HUSH_PARSER ,而正点原子的 I.MX6ULL 开发板配置头文件 mx6ullevk.h 里面会引用 mx_common.h 这个头文件,因此 , CONFIG_SYS_HUSH_PARSER 有定义。
第 205 行,执行 parse_file_outer函数。
207 行,是死循环,永远不会执行到这里。

函数 parse_file_outer 定义在文件 common/cli_hush.c 中,去掉条件编译内容以后的函数内容
如下:
int parse_file_outer(void)
{
 int rcode;
 struct in_str input;

 setup_file_in_str(&input);
 rcode = parse_stream_outer(&input, FLAG_PARSE_SEMICOLON);
 return rcode;
}

6 行调用函数 setup_file_in_str 初始化变量 input 的成员变量。
7 行调用函数 parse_stream_outer ,这个函数就是 hush shell 的命令解释器,负责接收命 令行输入,然后解析并执行相应的命令,函数 parse_stream_outer 定义在文件 common/cli_hush.c 中,精简版的函数内容如下:
static int parse_stream_outer(struct in_str *inp, int flag)
{
......

do {
......
    if (rcode != 1 && ctx.old_flag == 0) {
    {
        run_list(ctx.list_head);
    }
......

} while (rcode != -1 && !(flag & FLAG_EXIT_FROM_LOOP) &&
 (inp->peek != static_peek || b_peek(inp)));
......
}

7~21 行中的 do-while 循环就是处理输入命令的。
9 行调用函数 parse_stream 进行命令解析。
14 行调用调用 run_list 函数来执行解析出来的命令。
函数 run_list 会经过一系列的函数调用,最终通过调用 cmd_process 函数来处理命令。

三.  总结

函数调用关系如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++结构体(struct)、结构体和函数、结构体指针

前言 在本文中,您将学习C 编程中的结构。它是什么,如何定义它并在程序中使用它。结构是一个单一名称下不同数据类型的变量的集合。它与类相似,两者都保存着不同数据类型的数据集合。 问题 例如:您要存储有关某个人的一些…

《向量数据库指南》——向量数据库 大模型的“海马体”

在大模型的高调火热之下,向量数据库也获得了前所未有的关注。 近两个月内,向量数据库迎来融资潮,Qdrant、Chroma、Weaviate先后获得融资,Pinecone宣布1亿美元B轮融资,估值达到7.5亿美元。 东北证券预测,到2030年,全球向量数据库市场规模有望达到500亿美元,国内向量数…

【LeetCode热题100】--155.最小栈

155.最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…

dubbo协议与triple协议的对比

分别使用dubbo协议和triple协议,按照官方文档搭建Demo。 两个流程对比下来发现,dubbo协议搭建起来比较简单直接,定义好接口,实现类,然后启动provider和consumer就完事了。而triple协议则需要先定义proto文件 然后增加…

(StackOverflow问答)使用Huggingface Transformers从磁盘加载预训练模型

这是在Stack Overflow上的一个问答,链接如下: Load a pre-trained model from disk with Huggingface Transformers - Stack Overflowhttps://stackoverflow.com/questions/64001128/load-a-pre-trained-model-from-disk-with-huggingface-transformers…

找不到vcomp140.dll,无法继续执行代码?别担心,解决方法在这里!

找不到vcomp140.dll,无法继续执行代码?这个问题很难解决么?在网上看到很多人在咨询这个问题,看来是很多人都遇到了缺失了vcomp140.dll文件的问题啊,小编觉得很有必要来给大家详细的科普一下vcomp140.dll文件,给大家介绍…

测试老鸟整理,Fiddle抓包实战-App数据包抓取,看这一篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 我们在做接口测试…

在线剪辑音频教程,从零开始,轻松上手

“在线怎么剪辑音频呀?最近参加了一个线上的歌手大赛,好不容易过了初赛,复赛要求我们准备一首流行歌曲,可是我的音频出了问题,需要进行剪辑,但是我不会进行操作,想求求大家帮帮忙。” 在这个数…

不容易解的题10.7

885.螺旋矩阵III 885. 螺旋矩阵 III - 力扣(LeetCode)https://leetcode.cn/problems/spiral-matrix-iii/?envTypelist&envIdZCa7r67M模拟题的一种,说难也难,说简单也简单。模拟题有很多套路题,它们的题解差不多&…

Vue 中 KeepAlive 内置缓存使用

KeepAlive 介绍及使用场景 KeepAlive 是 vue 中的内置组件&#xff0c;当多个组件动态切换时可以对实例状态进行缓存&#xff0c;用法如下 <router-view v-slot"{ Component }"><keep-alive><component :is"Component" /></keep-al…

Adobe Photoshop2018-2024mac/win合集:轻松掌控设计世界

Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems公司开发和发行的图像处理软件。Adobe Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑工作。 Adobe Photoshop在图像、图形、文字、视频、出版等…

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…

数字经济和法治背景下国企合规数字化转型思考

近年来&#xff0c;数字经济的快速发展已经深刻影响了各行各业的运营方式和商业模式。在这个数字化时代&#xff0c;企业要想保持竞争力和可持续发展&#xff0c;必须紧跟时代潮流&#xff0c;进行数字化转型。而对于国有企业来说&#xff0c;数字化转型中的合规问题显得尤为重…

景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级

我国一直以来都将自动驾驶作为新兴产业发展的重点领域之一&#xff0c;工信部等相关部委出台了一系列自动驾驶发展战略、规划和标准&#xff0c;一些地方政府也在积极开展关于自动驾驶的地方立法&#xff0c;为自动驾驶技术的研发和应用提供更加具体的法律保障。例如&#xff0…

记录:Unity脚本的编写3.0

目录 前言前置控制方法查看效果移动方式 前言 前面记录了一些通过脚本控制对象模型移动和通过用户的操作对模型进行变化的方法&#xff0c;那么为了让我们创造的不论是地形还是模型都拥有真实的物理引擎&#xff08;大雾&#xff09;&#xff0c;那么这次就使用脚本控制模型感…

purr map walk 学习教程 完整版

Function reference • purrrhttps://purrr.tidyverse.org/reference/index.htmlMap over multiple input simultaneously (in "parallel") — pmap • purrr

linux python 保存图形savefig import matplotlib.pyplot as plt

import matplotlib.pyplot as plt # 绘制图形 mod.plot_history(20)# 保存图形 plt.savefig("my_training_ephoes_plot.png") # 保存为PNG格式 # 保存图形并设置dpi参数 plt.savefig("my_plot.png", dpi600) # 保存为PNG格式&#xff0c;设置dpi为300

Conv1d与Conv2d函数用法

Conv1d 和 Conv2d 分别是卷积神经网络&#xff08;CNN&#xff09;中的两种卷积层操作&#xff0c;它们在处理不同维度的数据上有联系和区别&#xff0c;本文是一篇学习笔记。 本文主要包括以下内容&#xff1a; 1.联系2.区别3.Conv1d卷积4.Conv2d卷积5.图解Conv1d卷积&#x…

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论&#xff1a; HTTP协议没有规定GET请求不能携带请求体&#xff0c;但是部分浏览器会不支持&#xff0c;因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义&#xff0c;也就是即不要求也不禁止 GET 请求带 body。大多数…

教资一年可以考几次 教资考试每年次数介绍

教师资格证一年可以考两次。根据教师资格证考试规定&#xff0c;为了满足报考人员的工作需求&#xff0c;达到市场供求均衡的状态&#xff0c;教师资格证区别于其他的技术资格类的考试&#xff0c;会每年举行两次考试&#xff0c;分别在上半年和下半年各举行一次考试。 上半年…