笔记整理—uboot番外(1)命令体系

news2024/12/24 2:45:58

        在uboot启动进行命令行的环境下,当输入命令时,将会对命令进行先解析后执行的操作。

uboot/common/cmd_xxx.c    其中就有多个命令体系(mian.c和commann.c)

        uboot每个命令都对应了一个相关的函数,由此实现的命令体系与shell的方式相似。其中参数一int类型的argc与char*argv[]组成。命令+参数,在Linux体系中,之类也是算作argc中的一员。

eg:
help ping
argc=2;
argv[0]="help";
argv[1]="ping";

        相关的代码为int do_help(cmd_tbl_t *cmdtp,intflag,intargc,char *argv[]);

        

        mian_loop的函数命令解析过程:

        将console_buffer复制到last_command中,console_buffer是命令(输入的命令),并以run_command函数去执行命令。

        run_command(const char *cmd,int flag),clear_ctrlc()中断执行。

        CFG_CBSIZE,规定的最长命令码长度一般为256/512。

        将输入的指令复制到cmdbuf中进行解析,根据‘\’‘\\’‘;’等输入规则进行解析。

        parse_line负责进一步对指令进行解析,将md 30000000 10解析为:

argv[0]="md";
argv[1]="30000000";
argv[2]="10";

        find_cmd(argv[0]);用于查找是否有这个指令,将找到的指令写到cmdtp中,repeatable支持了在命令输入时的回车重复,max_args设定了最大的参数个数。

        cmdtp->cmd存有命令的函数指针。(cmdtp->cmd) (cmdtp,flag,argc,argv)。以函数指针去调用用于执行的对应函数。

        命令执行在于find_cmd对指令的查找,取决于uboot对命令体系的机制(注册、存储、管理、索引等)。

        存储指令集的方法常用的有两种:①数组:大小不好确定,很容易造成浪费或不够。②链表:虽然灵活但开销大。uboot只是一个裸机程序并没有使用上面的两个方式,而是使用了结构体进行存储。

struct cmd_tbl_s {
       char *name;//命令名称
       int maxargs;//最大参数个数
       int repeatable;//是否支持重复执行(回车)
       int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);//命令所对应的函数指针
       char *usage;//命令短的帮助信息
       #ifdefCFG_LONGHELP
       char *help;//命令长的帮助信息
        #endif
        #ifdef CONFIG_AUTO_COMPLETE
        int  (*complete)(intargc, char *argv[], charlast_char, intmaxv, char *cmdv[]);
                               //函数指针,指向自动补全指令的函数
        #endif
};

        对于一个命令来说,需要解决两个问题其一是填充结构体实例,其二是给命令结构体附加特点的段属性。

        给命令结构体附加特点的段属性,链接时会带有该段属性内容链接在一起排列(什么东西放什么地方)。用户自定义段命令与命令是相互紧贴的,链接器工作时会将段属性相互放在一起。命令放在u_boot.bin中,同时命令是无序的,但一定是放在一起的。段有起始与结束地址,所以知道在哪开始,在哪结束。

        在uboot.lds中,uboot不支持命令在启动后进行拓展,所以使用了一种依靠链接器与段方法去实现,像是一个无序的数组。

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)\
cmd_tbl_t __u_boot_cmd_##name struct_Section = \
{#name, maxargs, rep, cmd, usage, help}

        其中,cmd_tbl_t是一个结构体,struct_Section是一个宏。以U_BOOT_CMD(version,1,1,do_version,"version-print monitor version\n",NULL);为例。

        使用##做连字符,U_BOOT_CMD宏,关键在于结构体变量名与段属性。段属性就是标签,附加了用户自定义的段属性,以保证链接时候数据结构能链接到一起,每个函数都对应了一个U_BOOT_CMD组成的指令。

        本章先写到这,下一章我们将对find_cmd函数做解析。

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

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

相关文章

字符统计及重排

题目描述 给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前&a…

2024年【氧化工艺】考试及氧化工艺最新解析

题库来源:安全生产模拟考试一点通公众号小程序 氧化工艺考试考前必练!安全生产模拟考试一点通每个月更新氧化工艺最新解析题目及答案!多做几遍,其实通过氧化工艺操作证考试很简单。 1、【单选题】 废水经生物脱氮工艺、吹脱工艺等…

如何自学通过软考中级系统集成项目管理工程师?

虽然中级项目管理工程师(以下简称中项)考试相对较容易,但如果你是零基础,不建议完全依靠自学。 中项属于软考的"信息系统"专业,是中级资格。熟悉软考的人都知道,软考包括初级、中级、高级3个级别…

python-uinput虚拟输入

文章目录 python-uinput虚拟输入背景库简介:什么是python-uinput?安装指南:如何获取这个强大的工具?快速上手:五个核心函数的介绍与使用1. 创建虚拟设备2. 模拟键盘输入3. 模拟鼠标移动4. 模拟鼠标点击5. 模拟触摸屏操…

【粒子群算法PSO】基本原理及多种改进方法

【粒子群算法Matlab仿真定制】: QQ:491052175 1. 粒子群算法的发展趋势 粒子群算法,又称粒子群优化算法(Particle swarm opyimization, PSO),是近年来新发展起来的进化算法。该算法和模拟退火算法相似&a…

Vue(十二) Vuex、四个map方法的使用、Vuex模块化+namespace命名空间

文章目录 一、Vuex前言:求和案例1. 搭建Vuex环境2. 基本使用3. 常见疑惑4. getters5. 四个map方法的使用(1) mapState(2) mapGetters(3) mapActions(4) mapMutations 6. 模块化命名空间namespace6.1 模块化6.2 模块化后读取数据 一、Vuex Vuex是一个Vue插件&#x…

FPGA与高速ADC接口简介

引言:本文介绍FPGA与高速ADC接口方式和标准以及JESD204与FPGA高速串行接口。 1. 高速ADC与处理器互联需要权衡的因素 如图1所示,ADC模数转换器可以与微控制器、DSP、FPGA以及ASIC均可以实现互联,在进行选择时,需要考虑以下因素&…

强化学习实操入门随笔

碎碎念:经过思考,打通底层逻辑,我认为未来ai的功能是在沟通领域代替人,未来人-人模式(媒介是死的语言,比如看古人留下的文字、聊天的暂时不在)会变成人-ai替身-人模式(符合本人想法的…

上市公司财务数据分析系统

前言 1.拟解决的关键问题或技术: 本研究旨在解决企业在财务管理方面的主要问题,即如何通过对财务数据进行深度挖掘,实现对未来财务趋势的预测和风险的识别。具体地,该研究将重点解决以下问题: 1.构建有效的财务指标体系、设计合理的特征工程和指标构建方法,以充分反映…

Java基于小程序公考学习平台的设计与实现

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

QT实现简易文件夹

使用UI界面实现简易文件夹 1、实现功能 1、双击文件夹&#xff0c;进入文件夹的下一层 2、点击回退按钮、返回上一级 3、如果是文本文件、则调用记事本的程序、显示文本内容 2、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDir>…

《深度学习》OpenCV 图像边缘检测 算法解析及代码演示

目录 一、图像边缘检测 1、什么是边缘检测 2、常用的边缘检测算法 1&#xff09;Sobel算子 2&#xff09;Scharr 算子 3&#xff09;Canny边缘检测算法 4&#xff09;Laplacian算子 3、边缘检测流程 1&#xff09;预处理 2&#xff09;计算梯度 3&#xff09;非极大值抑制 …

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

Quartz.Net_持久化

简述 通常而言&#xff0c;Quartz.Net的数据默认是存储在运存中的&#xff0c;换言之&#xff1a;断电即失。所以在默认情况下&#xff0c;当系统重启后&#xff0c;原先的所有任务、触发器、调度器都会失效 为避免上述情况的发生&#xff0c;可以对Quartz.Net进行持久化设置…

支持函数库功能,支持对接豆包、腾讯混元、Amazon Bedrock等模型供应商,MaxKB v1.5.0版本发布

2024年9月2日&#xff0c;MaxKB开源知识库问答系统正式发布v1.5.0版本。 在v1.5.0社区版中&#xff0c;应用编排方面&#xff0c;MaxKB新增函数库功能&#xff0c;支持用户在应用编排时调用函数&#xff1b;模型管理方面&#xff0c;MaxKB新增对豆包、腾讯混元和Amazon Bedroc…

Datawhale AI夏令营 第五期 CV方向 Task2笔记

Task2&#xff1a;建模方案解读与进阶 YOLO介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的目标检测算法&#xff0c;于2015年首次提出 。YOLO的核心思想是将目标检测任务转化为一个回归问题&#xff0c;通过单个卷积神经网络&#xff08;CNN&#xff09;直…

Linux git的基本使用安装提交 和 gdb的使用

目录 安装git 首次使用git的配置 拉取仓库 步骤1&#xff1a;新建仓库 步骤2:复制仓库地址 步骤3&#xff1a;远端仓库拉取到本地 上传代码 常用指令 安装git sudo apt-get install git # Ubuntu/Debian sudo dnf install git # Fedora sudo yum insta…

惠中科技光伏清洗剂:点亮绿色能源未来

在当今全球追求可持续发展的时代&#xff0c;光伏产业作为清洁能源的重要代表&#xff0c;正发挥着日益关键的作用。而在光伏产业的高效运行中&#xff0c;惠中科技的光伏清洗剂犹如一颗璀璨的明珠&#xff0c;为光伏板的清洁与维护贡献着卓越力量。 一、光伏产业的挑战与需求…

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP&#xff1f; CAP&#xff08;Cloud Application Programming&#xff09;是SAP推出的一种现代化开发框架&#xff0c;旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术&#xff0c;如Node.js、Java、OData和SQL&#xff0c;提供了…

删除重复的行

Excel的有7列数字&#xff0c;有些数字整行重复。 ABCDEFG11234567276543213123456741234567511111116111111177777777 要求删掉重复的行。 IJKLMNO1765432127777777 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?.group(~).select(~.len()1).conj()",…