为何gpio_to_irq不能静态使用?【转】
之前在調(diào)試傳感器模塊的時(shí)候發(fā)現(xiàn),在結(jié)構(gòu)體聲明的時(shí)候irq成員使用gpio_to_irq會(huì)報(bào)錯(cuò),而動(dòng)態(tài)使用的話就沒有問題。就對(duì)gpio_to_irq為什么不能靜態(tài)使用產(chǎn)生了疑問。恰巧最近又有朋友遇到了同樣的問題,也就提醒了我,去找出原因。
轉(zhuǎn)自:http://blog.csdn.net/airk000/article/details/23339257
開始測(cè)試
我寫了一個(gè)簡(jiǎn)單的linux執(zhí)行程序進(jìn)行測(cè)試,因?yàn)樵趦?nèi)核源碼中發(fā)現(xiàn)不同平臺(tái)對(duì)gpio_to_irq的定義不同,有的是宏定義,而更多的則直接是函數(shù)。所以在這個(gè)測(cè)試程序中我也以這一點(diǎn)作為切入點(diǎn),進(jìn)行測(cè)試。
?
函數(shù)
#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;}編譯,果然出錯(cuò)了:
main.c:14:5: error: initializer element is not constant.num = plus_one(5),^ main.c:14:5: error: (near initialization for ‘test1.num’)可見,函數(shù)是不能作為結(jié)構(gòu)體聲明靜態(tài)使用的。那么改為動(dòng)態(tài)試一試看:
struct test test1 = { .name = "test",};int main(void){test1.num = plus_one(5);printf("%d %s\n", test1.num, test1.name);return 0;}編譯,通過(guò),能夠輸出想要的結(jié)果。
結(jié)論:函數(shù)不能在結(jié)構(gòu)體聲明等代碼中靜態(tài)使用,即使函數(shù)內(nèi)容再簡(jiǎn)單。只能以動(dòng)態(tài)方式使用函數(shù)。在Linux內(nèi)核的omap2平臺(tái)代碼中也印證了這一點(diǎn),許多設(shè)備資源都是在初始化函數(shù)中(即資源生效前)進(jìn)行g(shù)pio_to_irq的動(dòng)態(tài)賦值。
?
宏定義
使用宏定義代替上述代碼中的plus_one函數(shù)
#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;}編譯,通過(guò),輸出我們希望的結(jié)果。這證明宏定義可以靜態(tài)使用,那么動(dòng)態(tài)呢?
struct test test1 = { .name = "test",};int main(void){test1.num = plus_one(5);printf("%d %s\n", test1.num, test1.name);return 0;}編譯,通過(guò),輸出想要的結(jié)果。OK,這說(shuō)明宏定義同樣可以進(jìn)行動(dòng)態(tài)引用。
結(jié)論:宏定義在代碼中無(wú)論是靜態(tài)引用還是動(dòng)態(tài)引用均可以。
?
總結(jié)
通過(guò)測(cè)試代碼可以看出函數(shù)的使用有局限性:只能動(dòng)態(tài)引用,而不能靜態(tài)使用。宏定義就顯得友好多了,靜態(tài)、動(dòng)態(tài)使用均可。回到開始的問題gpio_to_irq為什么不能靜態(tài)使用?就是因?yàn)楹芏嗥脚_(tái)代碼都將gpio_to_irq實(shí)現(xiàn)成為了函數(shù),而非宏定義,這樣就只能進(jìn)行動(dòng)態(tài)引用。但是,這在驅(qū)動(dòng)編寫中也不是什么問題,在上面已經(jīng)說(shuō)過(guò),只要在設(shè)備資源生效前(設(shè)備注冊(cè)前)將其irq動(dòng)態(tài)賦值好就可以了,現(xiàn)有的很多成熟平臺(tái)也是這樣做的,并沒有問題。這里我探究這個(gè)問題只是因?yàn)樽约旱暮闷嫘亩选?/p>
轉(zhuǎn)載于:https://www.cnblogs.com/sky-heaven/p/4992241.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的为何gpio_to_irq不能静态使用?【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 破解极域电子教室密码
- 下一篇: chrome谷歌插件