为何gpio_to_irq不能静态使用?【转】

之前在调试传感器模块的时候发现,在结构体声明的时候irq成员使用gpio_to_irq会报错,而动态使用的话就没有问题。就对gpio_to_irq为什么不能静态使用产生了疑问。恰巧最近又有朋友遇到了同样的问题,也就提醒了我,去找出原因。

转自:http://blog.csdn.net/airk000/article/details/23339257

开始测试

我写了一个简单的linux执行程序进行测试,因为在内核源码中发现不同平台对gpio_to_irq的定义不同,有的是宏定义,而更多的则直接是函数。所以在这个测试程序中我也以这一点作为切入点,进行测试。

 

函数


#include <stdio.h>static int plus_one(int x){return (x + 1);}struct test {int num;char *name;};struct test test1 = { .num = plus_one(5),.name = "test",};int main(void){printf("%d %s\n", test1.num, test1.name);return 0;}

编译,果然出错了:

main.c:14:5: error: initializer element is not constant.num = plus_one(5),^
main.c:14:5: error: (near initialization for ‘test1.num’)

可见,函数是不能作为结构体声明静态使用的。那么改为动态试一试看:

 struct test test1 = { .name = "test",};int main(void){test1.num = plus_one(5);printf("%d %s\n", test1.num, test1.name);return 0;}

编译,通过,能够输出想要的结果。

结论:函数不能在结构体声明等代码中静态使用,即使函数内容再简单。只能以动态方式使用函数。在Linux内核的omap2平台代码中也印证了这一点,许多设备资源都是在初始化函数中(即资源生效前)进行gpio_to_irq的动态赋值。

 

宏定义

使用宏定义代替上述代码中的plus_one函数

#define plus_one(x) ((x) + 1)...struct test test1 = { .num = plus_one(5),.name = "test",};int main(void){printf("%d %s\n", test1.num, test1.name);return 0;}

编译,通过,输出我们希望的结果。这证明宏定义可以静态使用,那么动态呢?

 struct test test1 = { .name = "test",};int main(void){test1.num = plus_one(5);printf("%d %s\n", test1.num, test1.name);return 0;}

编译,通过,输出想要的结果。OK,这说明宏定义同样可以进行动态引用。

结论:宏定义在代码中无论是静态引用还是动态引用均可以。

 

总结

通过测试代码可以看出函数的使用有局限性:只能动态引用,而不能静态使用。宏定义就显得友好多了,静态、动态使用均可。回到开始的问题gpio_to_irq为什么不能静态使用?就是因为很多平台代码都将gpio_to_irq实现成为了函数,而非宏定义,这样就只能进行动态引用。但是,这在驱动编写中也不是什么问题,在上面已经说过,只要在设备资源生效前(设备注册前)将其irq动态赋值好就可以了,现有的很多成熟平台也是这样做的,并没有问题。这里我探究这个问题只是因为自己的好奇心而已。

转载于:https://www.cnblogs.com/sky-heaven/p/4992241.html

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

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

相关文章

当谈研发效能时,该谈些什么?

最近翻了下之前写的公众号文章&#xff0c;发现研发效能相关的就有三篇&#xff1a;怎样提高开发效率关于增效&#xff0c;需要做好这两点再谈研发效率提升从工具使用、业务的理解、团队的沟通协作到流程、组织、分享等内容&#xff0c;我能想到的大部分有关研发效能的点都有涉…

32.find命令

命令类似 文件管理 命令名称 find 命令描述 查找文件或者目录&#xff0c;根据不同参数的匹配来找到 想要的文件。 命令语法 find [文件路径] [参数或者条件] 参数 -o #或者 -size #大小 -name #条件 如文件名称 或者 相对名称 -name "." -type #类型 如 f:文件 d:目…

ENVI5.4完美实现MODIS NDVI数据格式转换和投影变换

如上图所示,分别为: View1:MODIS hdf数据多波段 View2:MODIS NDVI波段 View3:ArcGIS10.8投影变换后的MODIS NDVI View4:ENVI5.4投影变换后的MODIS NDVI 关于ArcGIS处理MODIS数据的操作,可以参照: 《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》 《重磅!ArcG…

Android之解决viewpage加载第3个fragment的时候,第一个fragment又重新构建问题

1 、问题 viewpage加载第3个fragment的时候,第一个fragment又重新构建问题,感觉自己好傻逼的,不知道啥原因,原来是少了一个设置,加载旁边多少个fragment不销毁 2 、解决办法 viewPager.offscreenPageLimit = 3 3、推荐滑动页面万能的指示器框架 https://github.com/hac…

【前端就业课 第一阶段】HTML5 零基础到实战(九)列表

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

android 电源管理 wakelock 唤醒锁机制

Android 电源管理 — 唤醒锁全新上市 大多数人可能都遭遇过手机的电池续航时间较短带来的尴尬。 这极其令人讨厌。 没电的手机和一块水泥砖没什么差别。 一般而言&#xff0c;如果用户的手机电池无法持续一整天&#xff0c;他们会感到非常不满。而且&#xff0c;当手机充电时用…

初始Bootstrap

使用示例①下载Bootstrap框架 网址&#xff1a;http://v3.bootcss.com/getting-started/#download②解压得到三个文件③将文件添加进项目后&#xff0c;在页面中引用必要的css和js④查看效果&#xff08;a标签美化得不要不要的了&#xff5e;&#xff09;更多学习Bootstrap的资…

APP无埋点流程

最近无埋点技术很是流行&#xff0c;抽空研究了下诸葛IO&#xff0c;talkingData以及百分点这些业内知名公司的无埋点SDK&#xff0c;抽取其中重要的信息供大家参考&#xff1a;1、首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而…

Esri Maps For Office制作漂亮的地图

ArcGISOnline是一个基于云架构的资源中心,在这里你可以发布自己的地图资源、浏览其它ArcGIS爱好者发布的应用程序;总之,它为我们提供了一个在线交流的场所。 EsriMapsForOffice是ArcGISonline推出的一个Office环境的插件,可以让我们在Excel、Powerpoint中进行制图,就像在…

《什么是 eBPF》O'Reilly 报告中文版放送

祝大家端午安康&#xff0c;国泰民安&#xff0c;世界和平。今年端午节&#xff0c;鄙人人在北京&#xff0c;所在区有中风险地区&#xff0c;而老家又是所在省的唯一一个中风险地区&#xff0c;既出不了京&#xff0c;也回不了家。可谓有家不能回&#xff0c;真是每逢佳节倍思…

介绍一个代码管理系统-Git

Git是一个跨平台的代码管理系统&#xff0c;据说比SVN好很多&#xff0c;呵呵!! http://git.or.cz/ 一个基于Git管理的代码共享网站 http://github.com/ 在windows下的客户端程序&#xff08;msysgit&#xff09;&#xff1a;http://code.google.com/p/msysgit/ 还没有图形客户…

优秀博客链接(linux c/c++ java go php android ios 前端 j2ee windows linux 算法 ACM 深度/机器学习 AI opencv nlp)

pudn阿甘兄 前端 服务端 底层 移动端 大数据 云计算 AI 培训机构的课程差不多就这一套了 大数据 AI NLP 高等数学 LeetCode、《数据结构与算法之美》学习笔记、AI前端资料学习&#xff0c;vue.js react.js flutterleetCode刷完的神机器学习数据挖掘基础Linux c/c大神 目前cs…

一键将Python2代码自动转化为Python3

Python2的代码直接在Python3环境运行的话会报错误&#xff1a; 如果大量的代码&#xff0c;无论是批量替换&#xff0c;还是逐行修改都够累的&#xff0c;这活儿表示不能干&#xff01;&#xff01;&#xff01; 有没有办法一键转换呢&#xff1f; 百度了一下发现网上的方法如…

【前端就业课 第一阶段】HTML5 零基础到实战(十)JavaScript基础一篇入门

注意&#xff1a;手机&#xff08;APP&#xff09;打开&#xff0c;内容显示更佳&#xff0c;不会的私聊博主即可 想要拿代码或加入学习计划&#xff08;** 博主会监督你并且教你写文章 **&#xff09;的拉到最下面&#xff08;PC端Web打开&#xff09;加博主即可&#xff0c;目…

推理集 —— 实证

现实世界的诸多事就像物理定律&#xff0c;而不是数学定理&#xff0c;也即不保证绝对正确&#xff0c;而需要不断地验证&#xff0c;实证。 不能不经实证就轻言一件事是行还是不行&#xff0c;尤其在事情如果实证的成本较低&#xff0c;比如今天图书馆是不是开门&#xff0c;路…

一款开源的跨平台实时web应用框架——DotNetify

今天给大家介绍一个开源的轻量级跨平台实时HTMLC#.NET Web应用程序开发框架——DotNetify&#xff0c;允许你在C#.NET后端上创建具有React、React Native、Vue或Blazor 前端的实时、响应式、跨平台应用程序。它的主要特点是&#xff1a;简单且轻量响应式后端MVVM内置实时解决方…

【GeoDataBase】Geodatabase智能化操作:属性域

Geodatabase中所包含的不仅仅是要素类、要素集和表,还可能包含关系类、注释类、几何网络、拓扑等不同的结构和类别。 地理数据库按照面向对象的模型存储地理信息,也可以将其非空间信息保存在表中。对于要素和表可以设置一些规则进行限制,对属性的约束称为属性域。 属性域是描…

Android之All children of ConstraintLayout must have ids to use ConstraintSet

1 问题 Fatal Exception: java.lang.RuntimeException: All children of ConstraintLayout must have ids to use ConstraintSetat androidx.constraintlayout.widget.ConstraintSet.readFallback(ConstraintSet.java:459)at androidx.constraintlayout.motion.widget.MotionS…

Lua性能优化

规则1&#xff1a;不要优化。 规则2&#xff1a;仍然不要优化&#xff08;专家除外&#xff09; 当用Lua编程时&#xff0c;这两条规则显得尤为重要。Lua以性能著称&#xff0c;而且在脚本语言中也因此而值得赞美。 然而&#xff0c;我们都知道性能是编程的一个关键因素。具有复…

常用的LINQ to SQL 用法

一、Where操作 适用场景&#xff1a;实现过滤&#xff0c;查询等功能。 说明&#xff1a;与SQL命令中的Where作用相似&#xff0c;都是起到范围限定也就是过滤作用的&#xff0c;而判断条件就是它后面所接的子句。 Where操作包括3种形式&#xff0c;分别为简单形式、关系条件形…