为何gpio_to_irq不能静态使用?
来源:互联网 发布:安广网络潘集分公司 编辑:程序博客网 时间:2024/05/16 09:13
之前在调试传感器模块的时候发现,在结构体声明的时候irq成员使用gpio_to_irq会报错,而动态使用的话就没有问题。就对gpio_to_irq为什么不能静态使用产生了疑问。恰巧最近又有朋友遇到了同样的问题,也就提醒了我,去找出原因。
开始测试
我写了一个简单的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动态赋值好就可以了,现有的很多成熟平台也是这样做的,并没有问题。这里我探究这个问题只是因为自己的好奇心而已。
- 为何gpio_to_irq不能静态使用?
- 静态成员函数为何不能const
- 为何非静态内部类不能有静态成员
- Static 方法里面为何不能使用this
- java 非静态内部类为何不能包含静态域和静态方法
- 言简意赅:中断中为何不能使用信号量,中断上下文为何不能睡眠
- 言简意赅:中断中为何不能使用信号量,中断上下文为何不能睡眠
- java非静态内部类为何不能有静态的成员?
- java非静态内部类为何不能有静态的成员?
- 为何使用WEBBROWSER的对象CLICK事件不能生效
- 在Spring使用getHibernateTemplate().save()为何不能更新数据库
- PRODUCT_COPY_FILES的深入理解,为何不能在Android.mk使用
- 为何不能交互式登陆?
- Mysql 为何不能执行
- C#静态方法不能使用this关键字
- 静态内存不能跨函数使用
- 静态变量不能跨函数使用内存
- 静态方法中不能使用非静态变量
- 【UX】Android中dip和px的深度解析
- hack :是解决页面浏览器不兼容的技巧方法
- Centos下解压rar、zip文件的方法
- 企业信息化与BI系统建设规划
- svn 自动启动脚本
- 为何gpio_to_irq不能静态使用?
- JVM调优总结 -Xms -Xmx -Xmn -Xss
- 按Enter键调用登录按钮
- 关于“正在中止线程”异常的部分解决方案(一)
- 黑马程序员-Java银行调度
- 软件名词解析
- 一些基本概念:NBOOT、EBOOT、UBOOT、SLC Nand、MLC Nand、RVDS、RVMDK
- 尚硅谷Java视频教程,全套java视频
- 国内外 CRM 客户关系管理软件排行榜