為何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.pswp.cn/news/286538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286538.shtml
英文地址,請注明出處:http://en.pswp.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;分別為簡單形式、關系條件形…