Linux驅動技術(四) _異步通知技術

異步通知的全稱是"信號驅動的異步IO",通過"信號"的方式,放期望獲取的資源可用時,驅動會主動通知指定的應用程序,和應用層的"信號"相對應,這里使用的是信號"SIGIO"。操作步驟是

  1. 應用層程序將自己注冊為接收來自設備文件的SIGIO信號的進程
  2. 驅動實現相應的接口,以期具有向所有注冊接收這個設備驅動SIGIO信號的應用程序發SIGIO信號的能力。
  3. 驅動在適當的位置調用發送函數,應用程序即可接收到SIGIO信號。

整個機制的框架:

1022162-20170211162813604-335733894.png

應用層接收SIGIO

和其他信號一樣,應用層需要注冊一個信號處理函數,
注冊的方式還是使用signal()sigaction()

此外,應用層還需要把自己加入到驅動的通知鏈表中,加入的代碼如下

fcntl(dev_fd,F_SETOWN,getpid());
int oflags = fcntl(dev_fd,F_GETFL);
fcntl(dev_fd,F_SETFL,oflags|FASYNC);
...
while(1);

完成了上面的工作,應用層的程序就可以靜待SIGIO的到來了。

驅動發送SIGIO

應用層注冊好了,最終的發送還是看設備驅動的處理方式,為了使設備支持異步通知機制,參照應用層的接口,驅動程序中涉及3項工作。

  1. 支持F_SETOWN命令,能在這個命令中下設置filp->f_owner為對應進程的ID,這部分內核已經做了
  2. 支持F_SETFL,每當FASYNC標志改變時,驅動程序中的fasync()將得以執行,so,驅動中要實現fasync()
  3. 當設備資源可用時,通過kill_fasync()發送SIGIO

為了在內核中實現上面這三個功能,驅動需要使用1個結構+2個API,結構是struct fasync_struct,函數是fasync_helper()kill_fasync()

struct fasync_struct {                                    spinlock_t              fa_lock;int                     magic;int                     fa_fd;struct fasync_struct    *fa_next; /* singly linked list */struct file             *fa_file;struct rcu_head         fa_rcu;
};

fasync_helper()的作用是將一個fasync_struct的對象注冊進內核,應用層執行fcntl(dev_fd,F_SETFL,oflags|FASYNC)時會回調驅動的fops.fasync(),所以通常將fasync_helper()放到fasync()的實現中。

/***fasync_helper - 將一個fasync_struct對象注冊進內核*@fd:文件描述符,由fasync傳入*@filp:file指針,由fasync傳入*@sig:信號類型,通常使用的就是SIGIO*@dev_fasync:事前準備的fasync_struct對象指針的指針*/
int fasync_helper(int fd, struct file * filp, int sig, struct fasync_struct ** dev_fasync);   

下面這個API就是釋放SIGIO,根據需求的不同放到不同的位置。

/***kill_fasync - 釋放一個信號*@dev_fasync:事前使用fasync_helper注冊進內核的fasync_struct對象指針的指針*@filp:file指針,由fasync傳入*@sig:信號類型,通常使用的就是SIGIO*@flag:標志,通常,如果資源可讀用POLLIN,如果資源可寫用POLLOUT*/
void kill_fasync(struct fasync_struct **dev_fasync, int sig, int flag);

驅動模板

下面這個驅動模板針對在硬件中斷到來(資源可用)的時候向應用層發信號,實際的操作中表明資源可用的情境還有很多

static struct fasync_struct *fasync = NULL;static irqreturn_t handler(int irq, void *dev)
{kill_fasync(&fasync, SIGIO, POLLIN);return IRQ_HANDLED;
}
static int demo_fasync(int fd, struct file *filp, int mode)
{return fasync_helper(fd, filp, mode, &fasync);
}
struct file_operations fops = {....fasync = demo_fasync,...
}
static int __init demo_init(void)
{...request_irq(irq, handler, IRQF_TRIGGER_RISING, "demo", NULL);...
}

轉載于:https://www.cnblogs.com/xiaojiang1025/p/6376561.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396760.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

陜理工高級語言程序設計實驗 (C)答案,陜理工高級語言程序計實驗 (C)模板.doc

陜理工高級語言程序計實驗 (C)模板《高級語言程序設計(C)》實驗報告目錄實驗一:C開發環境與順序結構程序設計21.實驗目的:22.實驗環境:23.實驗步驟:24.實驗內容:25&#…

java集合(1)-概述

Java集合類是一種特別有用的工具類,可用于存儲數量不等的對象,并可以實現常用的數據結構,如棧,隊列等,此外Java集合還可以用于保存具有映射關系的關聯數組.java集合大致可分為Set,List,Queue和Map四種體系,其中Set代表無序,不可重復的集合;List代表有序,重復的集合;而Map則代表…

UVA1262Password(第K字典序)

題目鏈接 紫書P323 題意:兩個6*5的字母矩陣,兩個矩陣每列相同的字母,每列取一個,求按照字典序第k小的序列 分析: 對于第一個樣例來說,我們得到{ACDW}、{BOP}、{GMOX}、{AP}、{GSU} 則一共有43423288種密碼&…

自定義 View 循環滾動刻度控件

LoopScaleView 先看效果圖: enter description hereLoopScaleView 是一個自定義的刻度尺風格的選值控件,從上面的動圖大家可以看到 LoopScaleView 的運行效果.可以設置屏幕內顯示的刻度數,也可以設置每一個刻度代表的值得大小。 LoopScaleView.class Nested class OnValueChang…

go 類型斷言_(57)接口的類型斷言

GO提供了一個方法,用來判斷接口的底層值是什么類型類型斷言 提供了訪問接口值底層具體值的方式。t : i.(T)該語句斷言接口值 i 保存了具體類型 T,并將其底層類型為 T 的值賦予變量 t。若 i 并未保存 T 類型的值,該語句就會觸發一個panic。為了…

使用web3j構建以太坊錢包

創建一個以太坊錢包有多種方式,一般情況下可以通過geth、EtherumWallet等客戶端。對于前端,可以使用插件MetaMask進行創建。這幾種方式技術實現雖然不同,但底層原理是一致的。本文主要介紹如何通過web3j架構創建一個以太坊的冷錢包&#xff0…

Html、CSS、JavaScript 實時效果在線編輯器 - 學習的好工具,算不算?!

關于 二維碼 與 NFC 之間的出身貧賤說太陽火神的漂亮人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商業用途-保持一致”創作公用協議轉載請保留此句:太陽火神的漂亮人生 - 本博客專注于 敏捷開發及移動和物聯設備研究:iOS、Android、Html5、…

android自定義更新,Android 完美解決自定義preference與ActivityGroup UI更新的問題

之前發過一篇有關于自定義preference 在ActivityGroup 的包容下出現UI不能更新的問題,當時還以為是Android 的一個BUG 現在想想真可笑 。其實是自己對機制的理解不夠深刻,看來以后要多看看源碼才行。本篇講述內容大致為如何自定義preference 開始到與Act…

vxlan 資料及其在 neutron中的應用

2019獨角獸企業重金招聘Python工程師標準>>> VXLAN 是一個新興的SDN 標準,它定義了一種新的 overlay 網絡,它主要的創造者是 VMware, Cisco 和 Arista。它被設計來消除虛擬化網絡世界中的 VLAN 數目的限制。VXLAN 本身是一個多播標準&#xf…

橫流式冷卻塔計算風量_研討丨卓展標準高效制冷機房技術之影響冷卻塔效率的幾個因素...

集中制冷用空調系統中,單臺冷卻塔的冷卻水量基本上都小于1,000m/h,且裝有淋水填料的橫流機械通風開式居多。本文將已橫流開式冷卻塔為對象,探討影響其效率的幾個因素。橫流開式冷卻塔示意圖如下所示:橫流開式冷卻塔示意圖 Fig 01說…

我是培訓出來的我怕誰

引子: 江小峰是我帶過的徒弟中跟我最久,也是最聰明的一個。 他一個高中生,沒上過大學,高中畢業后在老家賣了三年電腦,天天給人裝操作系統,有天他在網上看到某培訓機構招生簡介,一時沖動揣上三年血汗錢&…

android平臺gallery2應用分析,Android5.1圖庫Gallery2代碼分析數據加載流程

圖片數據加載流程。Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage相冊集 照片集 某張圖片1,AlbumSetPage.javaprivate void initializeData(Bundle data) {String mediaPath data…

python開課吧1980課程_開課吧的課程怎么樣?

就那那些編程開發課來說。現在網絡上充斥著大量的編程開發課程,什么python的,java的,c的,而且名字一個比一個夸張,21天精通c,7天熟練運用java,3天掌握python核心代碼,這些課程標題簡…

專業概念

1.JDBC: java數據庫連接(JDBC)用于在java程序中實現數據庫的操作功能,它提供了執行sql語句,訪問各種數據庫的方法,并為各種不同的數據庫提供統一的操作接口,java.sql包中 包含了jdbc操作數據庫的所有類 2.…

前端解決跨域問題的8種方案

2019獨角獸企業重金招聘Python工程師標準>>> 1.同源策略如下: URL說明是否允許通信http://www.a.com/a.js http://www.a.com/b.js同一域名下允許http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夾允許http://www.a.com:8000/…

k歌的錄音伴奏合成技術如何實現_K歌神器,用唱吧麥克風攀登天籟高峰

自從喜歡上了手機K歌,經常會上傳一些自己的作品,起初無論音質如何都是樂在其中,可時間久了發現回放效果確實不如那榜單上的高手,究其原因想到了麥克風,網上一搜果然有各種K歌輔助工具,多番對比之下&#xf…

淺談內存開辟問題和Block內存問題

我們知道,內存分為棧,堆,塊。 棧中的內存由系統自己釋放,堆是存對象初始化的地方,塊是CPU與內存連接的緩沖器,運行速度比內存快,比CPU慢。 例如,我們NSMutableArray *array [NSMuta…

vue render函數_Vue原理解析(一):Vue到底是什么?

Vue,現在前端的當紅炸子雞,隨著熱度指數上升,實在是有必要從源碼的角度,對它功能的實現原理一窺究竟。個人覺得看源碼主要是看兩樣東西,從宏觀上來說是它的設計思想和實現原理;微觀上來說就是編程技巧&…

scrapy爬蟲-setting.py

# Obey robots.txt rulesROBOTSTXT_OBEY False  不遵從網站的robots.txt法則 # See also autothrottle settings and docsDOWNLOAD_DELAY 3  每次下載延遲3秒,防止造成網站攻擊 # Override the default request headers:DEFAULT_REQUEST_HEADERS { Accept:…

android點擊左上角劃出,使用Android中的Path和RectF在左上角右上角左下角繪制圓角...

有一個Path#addRoundRect()重載,它接受一個包含八個值的float數組,其中我們可以為四個角中的每一個指定x和y半徑.這些值為[x,y]對,從左上角開始,順時針繞其余部分.對于我們想要舍入的那些角,我們將該對的兩個值都設置為半徑值,并將它們保留為零,而不是那些.作為一個說明性示例,…