uboot将命令结构体单独存放在某个代码段的方法

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

1、uboot的链接脚本里有如下代码片段。

__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;

2、uboot中将命令结构体单独存放在某个代码段,是通过以下两个宏来实现的。

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

(1)凡是通过U_BOOT_CMD定义的cmd_tbl_t变量(类似说int类型变量)会全部被放在.u_boot_cmd段当中;

(2)##name、#name

  • ##name表示将name直接原样替代##name,#name表示以 “name" 的形式替代#name。
  • 例如定义一个命令boot,需要写成U_BOOT_CMD(boot, 0, 0, fun, "boot xxx");
  • 展开后会变成:cmd_tbl_t  __u_boot_cmd_boot __attribute___((unused, section(".u_boot_cmd"))) = {"boot", 0, 0, fun, "boot xxx"}
  • 可见Struct_Section展开了,还将##name换成了boot, 将#name换成了"boot"。

(3)总结

  • 可以在程序运行时定义一个变量,即通过##xxx来定义一个变量,然后通过上面的形式来使用它。
  • 通过宏定义来定义变量,并且把这些同一种结构体的变量放在一个段中,充分的利用连接器的作用,确实很实用。这样开发各个模块的研发人员不必去维护一个全局的结构体数组,值得推广。

(4)实例

#if defined(CONFIG_CMD_ECHO)int  do_echo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{int i, putnl = 1;for (i = 1; i < argc; i++) {char *p = argv[i], c;if (i > 1)putc(' ');while ((c = *p++) != '\0') {if (c == '\\' && *p == 'c') {putnl = 0;p++;} else {putc(c);}}}if (putnl)putc('\n');return 0;
}U_BOOT_CMD(echo,    CFG_MAXARGS,    1,    do_echo,"echo    - echo args to console\n","[args..]\n""    - echo args to console; \\c suppresses newline\n"
);//通过宏来定义变量#endif

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

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

相关文章

Felix的Nodejs代码风格

Felix的Nodejs代码风格 原文地址&#xff1a;http://nodeguide.com/style.html 这是翻译的关于nodejs编码风格的一片文章&#xff0c;nodejs并没有官方统一的编码风格&#xff0c;但是好的编码风格可以提高代码可读性&#xff0c;既然有人总结了&#xff0c;就可以参照一下。没…

c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序

1、继承的概念 2、继承中&#xff0c;构造函数和析构函数的先后顺序

mysql操作常用技巧

删除一张表的数据&#xff0c;条件在另一张表 delete a from A a,B b where a.telb.tel and a.codeb.code and a.day201808;转载于:https://www.cnblogs.com/JAYIT/p/9720117.html

结对开发:电梯调度(2)

组员&#xff1a;赵天 李金吉 分工&#xff1a;赵天&#xff1a;概要设计与编码。 李金吉&#xff1a;详细设计与调试。 界面&#xff1a; 详细代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Sys…

c++远征之继承篇——继承方式

以下内容源于慕课网&#xff0c;系学习整理而成&#xff0c;如有侵权&#xff0c;请告知删除。 1、公有继承 2、保护继承 3、私有继承

VMware vCenter Server6.5安装及群集配置介绍

借助 VMware vCenterServer&#xff0c;可从单个控制台统一管理数据中心的所有主机和虚拟机&#xff0c;该控制台聚合了集群、主机和虚拟机的性能监控功能。 VMware vCenterServer 使管理员能够从一个位置深入了解虚拟基础架构的集群、主机、虚拟机、存储、客户操作系统和其他关…

[JS性能优化专篇]

为什么80%的码农都做不了架构师&#xff1f;>>> 参考文章&#xff1a;了解 JavaScript 应用程序中的内存泄漏 旧版本的IE和Firefox都存在内存泄漏的问题&#xff0c;而且会一直持续到浏览器关闭。现在可以使用 Google Chrome 中的 Heap Profiler 来诊断内存问题。 …

jQuery --- grep

返回值:ArrayjQuery.grep(array, callback, [invert]) 概述 使用过滤函数过滤数组元素。 此函数至少传递两个参数&#xff1a;待过滤数组和过滤函数。过滤函数必须返回 true 以保留元素或 false 以删除元素。 参数 array,callback,[invert]Array,Function,BooleanV1.0 array:待…

Simulated Annealing(模拟退火算法)

/* Simulated Annealing(模拟退火算法) 求解旅行商问题(TSP) 网上给的数据是31个省会的坐标&#xff0c;蚁群算法得到的结果是&#xff1a;15378 我算的结果中&#xff0c;最好的一次是&#xff1a;15495 */ #include<iostream> #include<cstdio> #include<cstd…

c++远征之继承篇——隐藏,isa,虚析构函数

一、隐藏 父子关系。成员&#xff08;数据成员或者成员函数&#xff09;同名&#xff1b;此时子类中会隐藏父类中的同名成员。无法函数重载&#xff0c;只会隐藏&#xff01;如果想访问父类中的同名成员&#xff0c;需要 :: 操作。 访问父类同名函数的方法 二、is-a &#xff…

表单元素对齐问题解决方案

之前一直困扰自己的一个问题就是表单内radio、select等的对齐问题&#xff0c;一直以来&#xff0c;都是给提示添加label&#xff0c;然后跟radio等一起浮动&#xff0c;然后再设置margin解决的&#xff0c;但是这样又得另外解决IE6下的双边距问题&#xff0c;搞得自己相当恼。…

centos7配置Docker镜像加速器

创建并编辑文件 [rootlocalhost ~]# cd /etc/docker/ [rootlocalhost docker]# [rootlocalhost docker]# ls key.json [rootlocalhost docker]# # vi daemon.json [rootlocalhost docker]# pwd /etc/docker [rootlocalhost docker]# [rootlocalhost docker]# cat daemon.json {…

岳阳楼记

庆历四年春&#xff0c;滕子京谪守巴陵郡。越明年&#xff0c;政通人和&#xff0c;百废具兴&#xff0c;乃重修岳阳楼&#xff0c;增其旧制&#xff0c;刻唐贤今人诗赋于其上&#xff0c;属&#xff08;音&#xff1a;嘱&#xff09;予作文以记之。 予观夫巴陵胜状&#xff0c…

(转)动态Entity Framework查询:Dynamic Query 介绍

原文地址&#xff1a;http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic Query是一个支持动态Entity Framework查询的库。它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找、排序、分页的这类场景的开发工作…

docker配置容器运行jar包

拉取jdk镜像文件 # docker pull huanwei/alpine-oraclejdk8 创建文件夹编写Dockerfile文件 # mkdir docker # vi Dockerfile FROM docker.io/huanwei/alpine-oraclejdk8 MAINTAINER djl "djlcnbisoft.com" ENV REGISTRY_SERVER_USERNAME test ENV REGISTRY_SERVER_PA…

c++远征之继承篇——多重继承,多继承,虚继承,多继承时的重复定义解决方法

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、多重继承 &#xff08;1&#xff09;概念理解 2、多继承 &#xff08;1&#xff09;概念理解 3、虚继承 &#xff08;1&#xff09;问题的引出&#xff1a;多重继承和多继承的结合&#xff0c…

从Pycharm说起

说实话.作为一个Coder.每天在各种IDE中切换编写Code.如果一个IDE Look and Feel总是无形中影响你每天Code Farm的心情.那该是多么不爽的事情.特别是针对本人对IDE总是有一种天生“洁癖感”.每当一们语言或技术在无意中吸引我.或是已经在粗糙的本文编辑器初体验.都会在两到三天体…

JAVA开发工具下载

一、eclipse下载 下载地址&#xff1a;http://www.eclipse.org/downloads/packages/ 点击下载 弹出下载框 压缩包解压后就可以使用 转载于:https://www.cnblogs.com/djlsunshine/p/11373287.html

c++远征之多态篇——虚函数及其实现原理

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、多态的定义 简单理解&#xff0c;就是对于同一条命令&#xff0c;不同对象会做出不同的操作。相同对象收到不同消息&#xff0c;或者不同对象收到相同消息时&#xff0c;产生不同的动作。 2、多态…

开发过程中版本控制

宏观角度看软件版本控制版本控制的核心是这样一个简单的概念&#xff0c;即对一个或者多个文件的追踪过程&#xff0c;随着这些文件演变成一个或多个产品的过程。特别是版本控制追踪什么变化&#xff0c;是什么改变了它&#xff0c;为什么会这样。版本控制系统提供了一个有益的…