之前在调试传感器模块的时候发现,在结构体声明的时候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不能静态使用?【转】相关推荐

  1. 发送快递:配置静态路由

    背景 基础组网,比如现在要实现相互通信,通过两台计算机来检测是否互通,但是它们中间通过一些路由器相互连接,这个时候,你要考虑,怎么配置这些路由器,包括给pc配地址,给路由器配地址,怎么定义这些网段! ...

  2. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  3. MindSpore静态图语法支持

    MindSpore静态图语法支持 概述 在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图. 关于Graph模式和计算图,可参考文档: ...

  4. Django高级管理静态文件和中间件5.1

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [os ...

  5. android 8.0 ,9.0 静态广播不显示问题处理

    1 推荐不是用静态广播,改为动态广播 2 如果就是想使用静态广播 修改方法个人的处理方法就是传递的时候添加包名intent.setPackage(getPackageName()); 具体代码如下 I ...

  6. Android 动态广播与静态广播

    学而时习,稳固而之心 目前推荐使用动态广播,现在已经很就没有使用过静态广播了. 动态广播与静态广播的联系 1 动态广播的速度要快于静态广播 2 静态广播的生存期可以比动态广播的长很多 在Manifes ...

  7. Java 静态变量,静态方法,静态常量(java static 关键字)

    Java 静态变量,静态方法,静态常量  就是变量 ,方法,常量前面添加了static 关键字 为什么要使用静态的呢 有时候在处理问题时会需要两个类在同一个内存区域共享一个数据, 不如现在 Main ...

  8. java面向对象-------静态初始化块

    1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...

  9. nodejs静态web服务

    项目准备 Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的 ...

最新文章

  1. ASP.Net中省市级联有关
  2. 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接
  3. (0043) iOS 开发之Xcode相关路径
  4. MFC单文档程序加载web网站和html文件
  5. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
  6. 强化学习(四)---基于模型动态规划问题
  7. python字符串截取_Python容器类型公共方法汇总
  8. linux shell脚本编程技巧介绍(一)
  9. websocket实现多屏互动_纸笔互动课堂应用场景到底有些什么呢?
  10. 27.思科防火墙(ASA)
  11. Java中使用ArrayList的10个示例–教程
  12. springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验
  13. could not open extension control file “/usr/share/postgresql/9.1/extension/dblink.control“
  14. JZOJ5775 农夫约的假期
  15. matconvnet
  16. mysql索引失效的原因
  17. 咖啡的合适温度(前缀和以及加减标记)
  18. python解释器中help的用法
  19. Linux OBS虚拟摄像头 解决方案
  20. 反入侵体系建设入门-攻击场景梳理

热门文章

  1. 深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling
  2. 练习作品13:电子试卷自动生成软件
  3. oracle服务器和客户端字符集的查看和修改
  4. XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)
  5. Linux网络编程(Socket)
  6. linux添加window启动
  7. navicat怎么导出mysql_navicat怎么把数据库导出
  8. SpringFramework5.0 @Indexed注解 简单解析
  9. docker下载tomact
  10. 后端技术:Web安全常见漏洞和修复建议,值得收藏!