历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | 1_5.1.5_U-boot分析与使用_u-boot分析之u-boot命令实现_P

2021-08-19 来源:eefocus

使用u-boot的命令,首先就是输入一个命令(字符串),然后回车,u-boot接收到命令之后就会执行相应的动作(函数)。


猜测是u-boot中有一个命令结构体,里面包含了命令的name和fun,run_command()函数就是在这个结构体里面查找命令并调用对应的函数。


下面来分析一下run_command()函数。


下图是指令解析,通过注释可以知道,可以在同一行输入两个命令,两个命令用;隔开即可。

在这里插入图片描述

可以看到,输入print; md.w 0,u-boot依次执行了print操作和md.w 0操作。

在这里插入图片描述

然后是处理一些宏,我们使用网卡或usb下载程序或执行某些操作,会生成一些环境变量或者宏,这个函数就是来处理这些宏的。

在这里插入图片描述

然后是解析行命令,比如输入md.w 0,那么这条指令就会被分割为两个部分,会有一个数组来保存它们,md.w被保存到argv[0],0被保存到argv[1]。

在这里插入图片描述

然后是查找命令,可以看出是根据argv[0]来查找命令。

在这里插入图片描述

cmdtp是一个结构体,组成如下,可以猜测是通过名字调用对应的函数。不输入命令重复执行就是执行完一条执行,需要再次执行这条指令时,是否需要重新输入这条指令还是直接按回车就可以执行。

在这里插入图片描述

比如md.w 0这条指令,在第一次执行时输入这个指令,第二次第三次不输入指令直接回车,u-boot同样执行了这个指令。

在这里插入图片描述

长的命令和短的命令则是,比如输入help,显示的就是短的帮助信息,输入help md,输出的就是长的帮助信息。

在这里插入图片描述

然后来看一下find_cmd函数,可以看到是从__u_boot_cmd_start开始,到__u_boot_cmd_end停止,在这个范围内查找指令的。

在这里插入图片描述

__u_boot_cmd_start和__u_boot_cmd_end都是在链接脚本中定义的,表示的是u_boot_cmd这个段的起始和结束地址。

在这里插入图片描述

所以这里for循环的意思就是,从u_boot_cmd这个段中不断的取一个结构体的名字,来和输入的指令比较,如果比较到匹配的指令,就返回这个匹配到的结构体,如果没有或者找到多个对应的指令就返回NULL,因为如果对应多个指令则表示该指令的目的不明确,u-boot不接受模糊的指令。


下面来看一下这个u_boot_cmd段,这个段在哪里定义的?搜索一下u_boot_cmd,在include/command.h文件中找到了这样的描述。

在这里插入图片描述

在这里插入图片描述

同样使用指令来分析它,使用启动内核的指令bootm 0x30007fc0来分析。搜索bootm指令,可以找到下图信息,其中U_BOOT_CMD是一个宏。

在这里插入图片描述

查找U_BOOT_CMD宏,发现它的定义如下图所示,其中Struct_Section就和u_boot_cmd段的定义联系起来了。

在这里插入图片描述

综合这些信息进行分析,就可以知道这个U_BOOT_CMD是定义了一个结构体,结构体的名字是__u_boot_cmd_bootm,属性表明定义这个结构体定义在了u_boot_cmd段,然后是名字,最大参数,是否可重复执行,do_bootm则是该指令调用的函数,然后是短的帮助信息,然后是长的帮助信息,可以看到,长的帮助信息时多个字符串,这些字符串中间没有用,分隔开,表示他们都是结构体参数中的某一个项。

在这里插入图片描述

可以看到,代码里面,所有用U_BOOT_CMD宏定义起来的结构体,都会有一个属性就是属于u_boot_cmd段,所以说所有的这些命令最后都会放在u_boot_cmd段。


了解了这些,那么如果要增加一个hello命令,这个命令会在终端上显示一个字符串“Hello world!”,那么要怎么做呢?


首先模仿cmd_bootm.c文件,创建一个cmd_hello.c文件,将cmd_bootm.c中包含的头文件全部都包含进来,然后是do_hello函数,然后创建一个U_BOOT_CMD结构体。

在这里插入图片描述

还需要修改common目录的Makefile,在末尾加上cmd_hello.o,这样编译时才会编译cmd_hello.c。


然后编译u-boot并下载,进入u-boot命令页面,输入help指令,可以看到出现了hello命令。

在这里插入图片描述

输入hello,终端输出Hello world!, 1,符合预期,重复执行没问题,输出长信息也没问题,这样,一个自定义的hello命令就完成了。

在这里插入图片描述
在这里插入图片描述

推荐阅读

史海拾趣

昭华(CHA)公司的发展小趣事

为了满足市场的不断增长的需求,昭华公司在2016年成立了昭华智硕东莞工厂。这座工厂拥有先进的生产设备和完善的生产流程,能够大幅提高公司的生产效率和产品质量。同时,昭华公司还不断优化供应链管理,加强与供应商的合作,确保原材料的稳定供应。这些举措不仅提高了公司的产能,还降低了生产成本,增强了公司的市场竞争力。

Cosel公司的发展小趣事

在电子行业,技术创新是企业发展的关键。Cosel公司深知这一点,因此在发展过程中不断引进先进的技术和管理理念。1979年,公司引进了质量控制圈(QC circle)活动,通过全员参与的方式提高产品质量和客户满意度。随后,公司又引进了TQC(全面质量管理)和方针管理,进一步提升了企业的运营效率和产品质量。这些举措使得Cosel公司的产品在市场上获得了良好的口碑。

Dytran Instruments Inc公司的发展小趣事

尽管已经被收购并进行了业务整合,但Dytran并没有停止其创新的步伐。公司继续加大研发投入,推动传感器技术的不断创新和升级。同时,Dytran还积极探索新的应用领域和市场空间,以满足不断变化的客户需求。

在未来,Dytran将继续致力于为客户提供高质量、高性能的传感器产品和解决方案。同时,公司还将积极参与国际竞争和合作,推动传感器技术的国际化和标准化进程。通过不断创新和发展,Dytran有望在电子行业中继续保持其领先地位并实现更加辉煌的未来。

以上五个故事框架概述了Dytran Instruments Inc.公司在电子行业中的发展历程、技术创新、市场拓展、被收购与业务整合以及未来展望等方面的重要事件和里程碑。这些故事展示了Dytran如何凭借其技术实力和市场洞察力在竞争激烈的电子行业中脱颖而出并实现持续发展。

Continental Industries公司的发展小趣事

在电子行业的初期,Continental Industries凭借其深厚的技术积累,成功研发出了一款固态继电器。这款继电器以其高度可靠性、长寿命和减少电磁干扰的特性,迅速在市场中占据了重要地位。公司不断投入研发资源,优化产品性能,逐渐在工业自动化和建筑环境控制领域树立起了技术领先的形象。

谷峰(GOFORD)公司的发展小趣事

GStek登丰微电子成立于2007年,正值中国电子产业快速发展之际。公司自创立之初便明确了其在电源管理领域的战略定位,专注于为市场提供高效、可靠的电源管理解决方案。通过深入研究市场需求和技术趋势,GStek迅速开发出包括线性稳压IC、PWM控制IC、电池保护IC及照明装置驱动IC在内的核心产品,奠定了其在行业内的技术基础。这一时期,GStek积极与国内外知名企业建立合作关系,不断拓展其市场份额。

DFRobot公司的发展小趣事

在机器人和开源硬件领域取得一定成绩后,DFRobot开始关注教育市场。他们发现,越来越多的学校和教育机构开始引入机器人和编程课程,以培养学生的创新能力和实践能力。于是,DFRobot推出了一系列针对青少年和创客爱好者的教育产品,如机器人套件、3D打印机等,并通过举办各类竞赛和培训活动,吸引更多的学生和教师参与。这一举措不仅拓展了公司的业务领域,也为公司的长期发展奠定了人才基础。

问答坊 | AI 解惑

开关和插接件基本术语

概述:开关和插接件的规格种类是非常多的。除了刀位数,操作方式,结构尺寸等基本要求以外, 还对开关有更为详细的技术要求。   技术含义:   1 容量   ----包括额定电压, 额定电流以及额定功率。他们指的是在开关正常状态下可允许的电 ...…

查看全部问答>

RFID文献之dickson结构

所有现行UHF RFID主流rectifier结构的创始人,dickson写的,因此也叫dickson结构,想从头开始了解这种结构优缺点以及得来历史的可以读读,很古老 的文章了~ …

查看全部问答>

集成团队与并行开发

在某公司传统的产品开发流程中,开发中心占据了非常重要的位置,那么,产品开发是不是只是R&D的事情呢?如果样机开发出来没有测试设备、需要的器件迟迟没有订购、生产线不适合新产品的批量生产,做出来的产品在市场上卖不掉,也全是R&D的责任吗?反 ...…

查看全部问答>

项链式空气净化器

城市的不断发展同时也使得空气污染越来越严重,或许有一天,我们可能会需要佩戴空气净化器才可以行走在路上。这款可以带在脖子上的空气净化器,可以通过声音提醒告诉您何时应该带上它。使用时您只需将其展开,挡在脸部前面,吸入的空气就会被装置上 ...…

查看全部问答>

嵌入式linux下基于http协议的xml传输

采用嵌入式linux系统(2.6.16)的终端机(ARM)需要与后台服务器实现网络通信传输。 后台服务器: 基于webservice技术实现 通过http协议实现数据的传输 内容格式均通过XML传输 终端: HTTP协议采用libcurl传输库 XML采用LIBXML2库作解析,lib ...…

查看全部问答>

急!!!

现在开发一个仪器,超声波无损探伤仪,用到320×240的EL屏,刷新频率很高,不知道用ARM好还是用DSP好,也不知道用什么操作系统好,请各位赐教!!! …

查看全部问答>

W77E58+RTL8019,移植ZLIP协议栈,不能对RTL8019操作

板子上有W77E58、RTL8019以太网芯片和两个32K RAM,移植了ZLIP协议栈,将RTL8019基地址做了修改。运行代码后对RAM的操作一切正常,但对RTL8019操作时出了问题。在对芯片初始化时,可以完成芯片的上电复位,但不能进行读写操作!请高手指点!…

查看全部问答>

加了USB Remote NDIS Class Driver之后出现错误信息

加了USB Host Support中的USB Remote NDIS Class Driver之后sysgen出现错误信息: usbclient.lib(usbclient.obj) : error LNK2005: _IssueBulkTransfer already defined in usbd.lib(USBD.dll) usbclient.lib(usbclient.obj) : error LNK2005: _I ...…

查看全部问答>

请各位研究过入侵检测方面的大侠帮忙

小弟毕业设计要做入侵检测系统,现在苦无资料,请各位大侠推荐几本书,或网站。要是哪位大侠有做过的源码小弟就在此感激涕零了!小弟邮箱:zzhzh11123@163.com。…

查看全部问答>