为何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
为何gpio_to_irq不能静态使用?【转】相关推荐
- 发送快递:配置静态路由
背景 基础组网,比如现在要实现相互通信,通过两台计算机来检测是否互通,但是它们中间通过一些路由器相互连接,这个时候,你要考虑,怎么配置这些路由器,包括给pc配地址,给路由器配地址,怎么定义这些网段! ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- MindSpore静态图语法支持
MindSpore静态图语法支持 概述 在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图. 关于Graph模式和计算图,可参考文档: ...
- Django高级管理静态文件和中间件5.1
管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [os ...
- android 8.0 ,9.0 静态广播不显示问题处理
1 推荐不是用静态广播,改为动态广播 2 如果就是想使用静态广播 修改方法个人的处理方法就是传递的时候添加包名intent.setPackage(getPackageName()); 具体代码如下 I ...
- Android 动态广播与静态广播
学而时习,稳固而之心 目前推荐使用动态广播,现在已经很就没有使用过静态广播了. 动态广播与静态广播的联系 1 动态广播的速度要快于静态广播 2 静态广播的生存期可以比动态广播的长很多 在Manifes ...
- Java 静态变量,静态方法,静态常量(java static 关键字)
Java 静态变量,静态方法,静态常量 就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...
- java面向对象-------静态初始化块
1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...
- nodejs静态web服务
项目准备 Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的 ...
最新文章
- ASP.Net中省市级联有关
- 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接
- (0043) iOS 开发之Xcode相关路径
- MFC单文档程序加载web网站和html文件
- 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
- 强化学习(四)---基于模型动态规划问题
- python字符串截取_Python容器类型公共方法汇总
- linux shell脚本编程技巧介绍(一)
- websocket实现多屏互动_纸笔互动课堂应用场景到底有些什么呢?
- 27.思科防火墙(ASA)
- Java中使用ArrayList的10个示例–教程
- springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验
- could not open extension control file “/usr/share/postgresql/9.1/extension/dblink.control“
- JZOJ5775 农夫约的假期
- matconvnet
- mysql索引失效的原因
- 咖啡的合适温度(前缀和以及加减标记)
- python解释器中help的用法
- Linux OBS虚拟摄像头 解决方案
- 反入侵体系建设入门-攻击场景梳理
热门文章
- 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling
- 练习作品13:电子试卷自动生成软件
- oracle服务器和客户端字符集的查看和修改
- XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)
- Linux网络编程(Socket)
- linux添加window启动
- navicat怎么导出mysql_navicat怎么把数据库导出
- SpringFramework5.0 @Indexed注解 简单解析
- docker下载tomact
- 后端技术:Web安全常见漏洞和修复建议,值得收藏!