uboot移植之uboot命令体系解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

1:回归到main_loop

    uboot启动第二阶段的最后,进入死循环main_loop()函数,命令行中没输出一次命令,就会执行一次main_loop函数,完成一次命令的获取、解析和执行。


2:uboot命令体系的实现原理

    uboot中里面维护了很多命令,每个命令对应一个结构体变量,当我们在命令行输入一个命令时。这时就涉及如何去维护这些命令的问题,一般的方法有两种,数组或者链表,但是数组的缺陷在开始的时候需要确定数组的大小,链表的话效率比较低,所以uboot使用了另一种方式。uboot中一个命令对应一个__u_boot_cmd_命令结构,并且绑定了一个do_命令函数。

    uboot里面给命令添加了一个段属性,所以在链接的时候相同段属性的代码会连续的发到一起(命令的顺序是不定的),所以指定了段属性的起始地址和结束地址,那么我们就可以通过指针的方式去访问这些数据,这样实现方式在存储方面和数组类似,但是有避免数组大小一开始就需要确定的局限性。所以在添加和删除命令的时候很简单就可以实现。


3:结构体cmd_tbl_s,命令结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct  cmd_tbl_s {
     char         *name;         /* Command Name            */
     int         maxargs;     /* maximum number of arguments    */
     int         repeatable;     /* autorepeat allowed?        */
                     /* Implementation function    */
     int         (*cmd)( struct  cmd_tbl_s *,  int int char  *[]);
     char         *usage;         /* Usage message    (short)    */
#ifdef    CFG_LONGHELP
     char         *help;         /* Help  message    (long)    */
#endif
#ifdef CONFIG_AUTO_COMPLETE
     /* do auto completion on the arguments */
     int         (*complete)( int  argc,  char  *argv[],  char  last_char,  int  maxv,  char  *cmdv[]);
#endif
};

参数解析:

name:命令的名字

maxargs:命令允许传入最多的参数个数

repeatable:命令是否允许连续执行(输入一次命令后,按下回车还会执行之前的命令)

cmd:命令对应的执行函数

usage:命令的短说明

help:命令的长说明


4:两个宏定义U_BOOT_CMD和Struct_Section

1
2
#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))
#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}

Struct_Section宏的作用是添加段属性 .u_boot_cmd,段属性的起始地址在链接脚本中有指定。

U_BOOT_CMD宏的作用是实例化一个cmd_tbl_t类型的结构体__u_boot_cmd_##name,并且在实例化的时候同时初始化结构

##name:##是转义字符,效果是将##name用name替代

#name:#转义字符,效果是将name转成字符串类型的‘name’

5:添加uboot命令

    方法1:在原有的.c文件中加

uboot命令很多都保存在uboot/common/command.c文件中,所有要添加uboot命令只需要在command.c按照其他的命令的格式添加即可

    方法2:自己创建.c文件并添加命令

首先在uboot/common/中创建一个.c文件,然后添加U_BOOT_CMD宏和对应的命令函数,需要注意的是要添加相应的头文件,然后在uboot/common/Makefile下添加xxx.o,目的的编译的时候能将添加的.c文件编译链接进去。



本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1926573


相关文章
|
2月前
|
网络协议 开发工具 C语言
Jetson错误(二):wget命令提示无法解析主机地址的问题解决
对于解决在NVIDIA Jetson平台上使用wget命令时出现的无法解析主机地址的问题,提供了两种解决方法:一种是临时修改DNS服务器为Google的公共DNS,另一种是永久修改DNS设置。
112 5
|
3月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
74 0
|
4月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
160 3
|
4月前
|
数据采集 运维 监控
运维笔记:流编辑器sed命令用法解析
运维笔记:流编辑器sed命令用法解析
59 5
|
4月前
|
Linux 数据安全/隐私保护 Perl
解锁Linux高手秘籍:文件操作+命令解析大揭秘,面试场上让你光芒万丈,技术实力惊艳四座!
【8月更文挑战第5天】Linux作为服务器与嵌入式系统的基石,其文件管理和命令行操作是技术人员必备技能。本文从文件操作和基础命令两大方面,深入浅出地解析Linux核心要义,助你在面试中脱颖而出。首先探索文件系统的树状结构及操作,包括使用`ls -la`浏览文件详情、`touch`创建文件、`rm -r`慎删目录、`cp`与`mv`复制移动文件、以及利用`find`搜索文件。接着掌握命令行技巧,如用`cat`、`more`和`less`查看文件内容;借助`grep`、`sed`与`awk`处理文本;运用`ps`、`top`和`kill`管理进程;并通过`chmod`和`chown`管理文件权限。
79 8
|
4月前
|
运维 Ubuntu Shell
Docker命令宝典:解锁容器化技术的无限可能,从镜像管理到容器操作,全面解析与实战指南!
【8月更文挑战第3天】Docker简化了应用的部署与运行,掌握其基本命令对开发者和运维人员至关重要。通过`docker images`可查看本地镜像;使用`docker pull`拉取如最新版Ubuntu镜像;`docker rmi`用于删除不再需要的镜像。运行容器可通过`docker run`命令,结合`-it`等选项提供交互式环境。`docker ps`显示运行中的容器,加上`-a`则列出所有容器。`docker stop`和`docker start`分别用于停止和重启容器,而`docker rm`则删除容器。
85 5
|
5月前
|
Linux Docker 容器
ip addr命令解析
ip addr命令解析
580 1
|
4月前
|
运维 Rust 监控
Linux高效运维必备:fd命令深度解析,文件描述符管理从此得心应手!
【8月更文挑战第23天】本文介绍了一款名为fd的命令行工具,该工具基于Rust语言开发,旨在以更直观的语法和更快的速度替代传统的`find`命令。通过本文,您可以了解到如何安装fd以及一些基本用法示例,比如使用正则表达式匹配文件名、排除特定目录等。此外,文章还展示了如何结合`ps`和`lsof`命令来查找特定文件并显示其文件描述符,从而帮助您更好地管理和监控Linux系统中的文件与进程。
138 0
|
5月前
|
Linux
《解析 Linux 命令:systemd-delta》
`systemd-delta`: 解析Linux服务配置差异。概览: 显示服务单元文件与默认配置的对比,助于配置问题排查与系统审计。特点: 清晰展示修改点,涵盖启动选项等。示例: `systemd-delta [--plain] <service>`. 注意: 理解默认配置,谨慎修改,定期检查。掌握此命令,深化系统服务配置洞察,优化Linux管理。#Linux #systemd-delta
|
5月前
|
存储 监控 Linux
stdbuf命令在Linux中的深度解析
`stdbuf`是Linux工具,用于控制命令的stdin、stdout和stderr的缓冲模式。它可以设置为无缓冲、行缓冲或块缓冲,以优化数据处理和实时性。例如,`stdbuf -o0 cmd`禁用cmd的输出缓冲,`-oL`则按行缓冲。在需要实时监控或高效处理大量数据时,选择合适的缓冲模式至关重要。注意,过度使用无缓冲可能影响性能,并非所有系统都支持`stdbuf`。

推荐镜像

更多
下一篇
无影云桌面