日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

驅動之路#24:Linux設備四種讀寫模型

BSP調試從0到1 ? 來源:嵌入式分享 ? 作者:嵌入式分享 ? 2026-05-06 16:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

正文

Linux 設備四種讀寫模型——其實核心就 4 種方式:查詢、休眠 - 喚醒、poll、異步通知。它們不是中斷本身,而是 “應用 - 驅動” 的上層交互邏輯(中斷是底層硬件觸發(fā)機制),但高效交互幾乎都依賴中斷實現(xiàn)。

1 查詢方式

核心原理:應用層主動、周期性查詢設備狀態(tài),不管設備是否就緒,CPU 都在循環(huán)檢查 —— 像你每隔 1 分鐘去門口看快遞到沒到。

代碼示例(應用層):

#include#include#includeintmain(){ intfd =open("/dev/key", O_RDWR); if(fd 0) {perror("open");return-1; } intkey_state; while(1) {   read(fd, &key_state,sizeof(key_state));// 主動查詢   if(key_state ==1) {     printf("按鍵按下!n");     break;    }   usleep(100000);// 100ms查一次,仍占CPU  } close(fd); return0;}

優(yōu)缺點與場景

優(yōu)點:實現(xiàn)最簡單,無需驅動復雜邏輯,調試方便

缺點:CPU 占用率極高(哪怕設備幾小時沒響應),浪費資源

適用場景:僅調試或極簡單設備(如 LED 狀態(tài)查詢),生產環(huán)境慎用!

2 休眠 - 喚醒

核心原理:設備未就緒時,應用進程主動休眠(釋放 CPU 給其他任務);當設備就緒(如按鍵按下觸發(fā)中斷),驅動喚醒進程繼續(xù)執(zhí)行 —— 像你聽到門鈴(中斷)再去取快遞,否則在家休息。

代碼示例(驅動 + 應用):

驅動層(關鍵邏輯)#include#includestaticwait_queue_head_tkey_waitq;// 等待隊列staticintkey_pressed =0;// 設備就緒標記// 讀操作:未就緒則休眠staticssize_tkey_read(structfile *filp,char__user *buf,size_tcount,loff_t*ppos){ wait_event_interruptible(key_waitq, key_pressed);// 休眠 copy_to_user(buf, &key_pressed,sizeof(key_pressed));  key_pressed =0; returnsizeof(key_pressed);}// 中斷服務函數(shù):設備就緒時喚醒irqreturn_tkey_isr(intirq,void*dev_id){  key_pressed =1; wake_up_interruptible(&key_waitq);// 喚醒進程 returnIRQ_HANDLED;}
應用層(極簡)intmain(){ intfd =open("/dev/key", O_RDWR); intkey_state; read(fd, &key_state,sizeof(key_state));// 阻塞等待 printf("按鍵按下!n"); close(fd); return0;}

優(yōu)缺點與場景

優(yōu)點:CPU 占用率極低(休眠時 0 占用),實現(xiàn)簡單

缺點:不支持超時,只能阻塞等待單個設備

適用場景:大多數(shù)字符設備(按鍵、串口、傳感器),嵌入式開發(fā)首選!

3 poll 方式

核心原理:結合 “查詢” 和 “休眠 - 喚醒” 的優(yōu)點:應用層通過poll()/select()設置超時時間,內核監(jiān)控多個設備 —— 超時前設備就緒則立即返回,超時后也會喚醒,避免無限阻塞。

像你告訴快遞員 “10 分鐘內到就等,超時不等”,還能同時等快遞和外賣。

代碼示例(驅動 + 應用):

驅動層(poll 函數(shù)實現(xiàn))#includestaticunsignedintkey_poll(structfile *filp,structpoll_table_struct *wait){ unsignedintmask =0; poll_wait(filp, &key_waitq, wait);// 加入等待隊列 if(key_pressed) {    mask |= POLLIN | POLLRDNORM;// 標記可讀就緒  } returnmask;}// 驅動操作集綁定staticconststructfile_operationskey_fops = {  .owner = THIS_MODULE,  .read = key_read,  .poll = key_poll,// 關鍵:綁定poll函數(shù)};應用層(監(jiān)控按鍵 + 超時)#includeintmain(){ intfd =open("/dev/key", O_RDWR | O_NONBLOCK); structpollfdfds[1] = {{fd, POLLIN,0}};// 關注可讀事件 while(1) {   intret =poll(fds,1,1000);// 等待1秒   if(ret >0&& (fds[0].revents & POLLIN)) {     intkey_state;     read(fd, &key_state,sizeof(key_state));     printf("按鍵按下!n");     break;    }elseif(ret ==0) {     printf("等待超時...n");    }  } close(fd); return0;}

優(yōu)缺點與場景

優(yōu)點:CPU 占用率低,支持超時、支持多設備同時監(jiān)控,兼容得阻塞 IO

缺點:實現(xiàn)復雜,高并發(fā)下開銷大

適用場景:多設備監(jiān)聽、需超時(串口 + 網卡)

4 異步通知

核心原理:完全反轉交互方向:應用層無需查詢 / 等待,設備就緒時(觸發(fā)中斷),驅動主動發(fā)送信號(如 SIGIO)通知應用層,應用層執(zhí)行信號處理函數(shù) —— 像快遞員直接把快遞送上門,不用你等。

代碼示例(驅動 + 應用)

驅動層(異步通知實現(xiàn))#includestaticstructfasync_struct*key_async;// 異步通知初始化staticintkey_fasync(intfd,structfile *filp,intmode){ returnfasync_helper(fd, filp, mode, &key_async);}// 中斷服務函數(shù):發(fā)送信號irqreturn_tkey_isr(intirq,void*dev_id){ if(key_async) {   kill_fasync(&key_async, SIGIO, POLL_IN);// 發(fā)送SIGIO信號  } returnIRQ_HANDLED;}
應用層(信號處理)#includevoidsigio_handler(intsignum){// 信號處理函數(shù) intfd =open("/dev/key", O_RDWR); intkey_state; read(fd, &key_state,sizeof(key_state)); printf("異步通知:按鍵按下!n"); close(fd);}intmain(){ intfd =open("/dev/key", O_RDWR); fcntl(fd, F_SETOWN,getpid());// 設置信號接收進程 intflags =fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags | FASYNC);// 啟用異步通知 signal(SIGIO, sigio_handler);// 注冊信號處理函數(shù) // 主線程可自由執(zhí)行其他邏輯 while(1) {   printf("主線程運行中...n");   sleep(1);  } close(fd); return0;}

優(yōu)缺點與場景

優(yōu)點:CPU 占用率最低,完全異步,應用層無阻塞

缺點:實現(xiàn)復雜(需處理信號安全),信號可能丟失

適用場景:高實時性設備(網卡、磁盤 IO)、應用層需同時處理多任務的場景


本人專注 Linux 驅動 & Linux/Android BSP 開發(fā)調試,可接外包項目/技術支持/問題定位。有需求或交個朋友可加微信:【Chen_WeChat2025】。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11825

    瀏覽量

    219617
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何理解Linux內核中的PCIe驅動

    我們習慣了用 Verilog 去死磕 PCIe 的底層協(xié)議狀態(tài)機。但一旦越過硬件邊界來到操作系統(tǒng)層面,Linux 內核是如何接管并驅動這些 PCI/PCIe 設備的呢?由于不同的 CPU 架構實現(xiàn)了
    的頭像 發(fā)表于 04-11 17:22 ?1294次閱讀

    驅動之路#20:Pinctrl 在手,引腳復用很順手

    ?歡迎關注,每周更新!? 本合集分享的是,我當初學習Linux驅動的來時路——《《驅動之路》開篇:自序pinctrl節(jié)點下(rk3576-pinctrl.dtsi),定義具體的引腳配置
    的頭像 發(fā)表于 04-07 21:18 ?529次閱讀
    <b class='flag-5'>驅動</b><b class='flag-5'>之路</b>#20:Pinctrl 在手,引腳復用很順手

    變頻器四種制動方式

    解決的核心問題。目前主流的變頻器制動方式主要包括能耗制動、回饋制動、直流制動和電容制動四種,每種方式各具特點,適用于不同的工況場景。
    的頭像 發(fā)表于 03-25 16:31 ?286次閱讀

    Linux內核驅動開發(fā)的技術核心精要

    (如wmb)保證CPU寫操作對DMA可見,避免數(shù)據錯亂。 、設備驅動模型設備Linux
    發(fā)表于 03-10 13:56

    驅動之路#04:LCD 驅動程序分析(基于RK3576)

    ? 題圖:河北太行山脈,山頭密密麻麻都被太陽能板覆蓋了。 歡迎關注,每周更新!? 本合集分享的是,我當初學習Linux驅動的來時路——《《驅動之路》開篇:自序 ? ? ?// 通用面板
    的頭像 發(fā)表于 02-17 08:20 ?1w次閱讀
    <b class='flag-5'>驅動</b><b class='flag-5'>之路</b>#04:LCD <b class='flag-5'>驅動</b>程序分析(基于RK3576)

    低成本CAN擴展方案怎么選?CSM331A四種模式一次說清

    MCU需要CAN功能但預算有限?CSM331A協(xié)議轉換芯片用SPI/UART就能擴展,四種模式從快到穩(wěn)任你選。ZLG致遠電子推出的CSM331A協(xié)議轉換芯片,配合一個CAN收發(fā)器,就能通過SPI
    的頭像 發(fā)表于 02-09 11:50 ?459次閱讀
    低成本CAN擴展方案怎么選?CSM331A<b class='flag-5'>四種</b>模式一次說清

    是德示波器DSOX1202A與電腦的四種連接方式及操作步驟詳解

    是德科技(Keysight)DSOX1202A示波器作為高精度電子測量設備,廣泛應用于電子工程、通信測試與自動化調試場景。為實現(xiàn)數(shù)據實時采集、波形分析與遠程控制,用戶需通過USB、LAN、GPIB或串口將示波器與電腦互聯(lián)。本文將結合官方指南與實操經驗,系統(tǒng)介紹四種連接方式
    的頭像 發(fā)表于 01-13 17:48 ?1908次閱讀
    是德示波器DSOX1202A與電腦的<b class='flag-5'>四種</b>連接方式及操作步驟詳解

    【免費送書】成為硬核Linux開發(fā)者:《Linux 設備驅動開發(fā)(第 2 版)》

    Linux系統(tǒng)的設備驅動開發(fā),一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發(fā)調試難度大所致。2021年,一本講解驅動開發(fā)的專著問世即獲市場青睞,暢銷近萬冊——這便
    的頭像 發(fā)表于 11-18 08:06 ?1878次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b>開發(fā)者:《<b class='flag-5'>Linux</b> <b class='flag-5'>設備</b><b class='flag-5'>驅動</b>開發(fā)(第 2 版)》

    【書籍評測活動NO.67】成為硬核Linux開發(fā)者:《Linux 設備驅動開發(fā)(第 2 版)》

    Linux設備模型(LDM) ,助力讀者理解kobject/kset的設備管理邏輯及sysfs暴露設備屬性的方式,為開發(fā)高效穩(wěn)定的
    發(fā)表于 11-17 17:52

    四種MOS管驅動電路方案介紹

    這個電控界的MOS管,但想讓它聽話,還得靠驅動電路!整理了 4 常用方案。
    的頭像 發(fā)表于 10-17 09:33 ?4752次閱讀
    <b class='flag-5'>四種</b>MOS管<b class='flag-5'>驅動</b>電路方案介紹

    一圖看懂綠電直連的四種玩法

    通過 “總覽框架 + 分模式圖解” 的形式,用可視化邏輯拆解綠電直連的四種核心模式,涵蓋每種模式的核心特征、適用場景、參與主體三大關鍵信息,幫你快速區(qū)分不同 “玩法” 的差異與適配性。
    的頭像 發(fā)表于 10-15 10:18 ?1642次閱讀
    一圖看懂綠電直連的<b class='flag-5'>四種</b>玩法

    從入門到精通:基于開源代碼的BLE四種模式開發(fā)詳解

    Bluetooth Smart,是藍牙4.0及更高版本引入的低功耗無線通信技術,專為低帶寬、間歇性數(shù)據傳輸?shù)奈锫?lián)網(IoT)和穿戴設備設計。 ? 一、Air8000藍牙大模式 Air8000藍牙支持四種模式,分別是中心
    的頭像 發(fā)表于 10-09 18:00 ?726次閱讀
    從入門到精通:基于開源代碼的BLE<b class='flag-5'>四種</b>模式開發(fā)詳解

    全網最全CSA3412,BCT4340,VL162,MCU/ USB3.1 正反插10G bps四種解決方案

    CSA3412,BCT4340,VL162,MCU/ USB3.1 全網最全正反插10G bps四種解決方案
    的頭像 發(fā)表于 09-25 03:06 ?986次閱讀
    全網最全CSA3412,BCT4340,VL162,MCU/ USB3.1 正反插10G bps<b class='flag-5'>四種</b>解決方案

    zephyr設備驅動程序模型

    ? ? 1:Zephyr 內核支持多種設備驅動程序。驅動程序是否可用取決于board 和驅動程序。 Zephyr 設備
    的頭像 發(fā)表于 07-29 10:34 ?867次閱讀
    zephyr<b class='flag-5'>設備</b><b class='flag-5'>驅動</b>程序<b class='flag-5'>模型</b>

    RDMA簡介3之四種子協(xié)議對比

    RDMA協(xié)議共有四種子協(xié)議,分別為InfiniBand、iWARP、RoCE v1和RoCE v2協(xié)議。這四種協(xié)議使用統(tǒng)一的RDMA API,但在具體的網絡層級實現(xiàn)上有所不同,如圖1所示,接下來將
    發(fā)表于 06-04 16:05
    延川县| 普陀区| 石家庄市| 泸西县| 宝丰县| 阜康市| 昌邑市| 资中县| 鸡东县| 石门县| 寿光市| 将乐县| 瓦房店市| 漳州市| 奉新县| 鄄城县| 青浦区| 通州区| 罗定市| 广元市| 黄浦区| 博野县| 铁力市| 东海县| 鄯善县| 乐亭县| 开鲁县| 通河县| 崇信县| 景宁| 武功县| 湘乡市| 乌什县| 遂昌县| 遂宁市| 庆城县| 鄂温| 鄂托克旗| 东乡县| 句容市| 东乡|