chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

驅(qū)動(dòng)之路#24:Linux設(shè)備四種讀寫模型

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

掃碼添加小助手

加入工程師交流群

正文

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

1 查詢方式

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

代碼示例(應(yīng)用層):

#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));// 主動(dòng)查詢   if(key_state ==1) {     printf("按鍵按下!n");     break;    }   usleep(100000);// 100ms查一次,仍占CPU  } close(fd); return0;}

優(yōu)缺點(diǎn)與場(chǎng)景

優(yōu)點(diǎn):實(shí)現(xiàn)最簡(jiǎn)單,無(wú)需驅(qū)動(dòng)復(fù)雜邏輯,調(diào)試方便

缺點(diǎn):CPU 占用率極高(哪怕設(shè)備幾小時(shí)沒(méi)響應(yīng)),浪費(fèi)資源

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

2 休眠 - 喚醒

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

代碼示例(驅(qū)動(dòng) + 應(yīng)用):

驅(qū)動(dòng)層(關(guān)鍵邏輯)#include#includestaticwait_queue_head_tkey_waitq;// 等待隊(duì)列staticintkey_pressed =0;// 設(shè)備就緒標(biāo)記// 讀操作:未就緒則休眠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);}// 中斷服務(wù)函數(shù):設(shè)備就緒時(shí)喚醒irqreturn_tkey_isr(intirq,void*dev_id){  key_pressed =1; wake_up_interruptible(&key_waitq);// 喚醒進(jìn)程 returnIRQ_HANDLED;}
應(yīng)用層(極簡(jiǎn))intmain(){ intfd =open("/dev/key", O_RDWR); intkey_state; read(fd, &key_state,sizeof(key_state));// 阻塞等待 printf("按鍵按下!n"); close(fd); return0;}

優(yōu)缺點(diǎn)與場(chǎng)景

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

缺點(diǎn):不支持超時(shí),只能阻塞等待單個(gè)設(shè)備

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

3 poll 方式

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

像你告訴快遞員 “10 分鐘內(nèi)到就等,超時(shí)不等”,還能同時(shí)等快遞和外賣。

代碼示例(驅(qū)動(dòng) + 應(yīng)用):

驅(qū)動(dòng)層(poll 函數(shù)實(shí)現(xiàn))#includestaticunsignedintkey_poll(structfile *filp,structpoll_table_struct *wait){ unsignedintmask =0; poll_wait(filp, &key_waitq, wait);// 加入等待隊(duì)列 if(key_pressed) {    mask |= POLLIN | POLLRDNORM;// 標(biāo)記可讀就緒  } returnmask;}// 驅(qū)動(dòng)操作集綁定staticconststructfile_operationskey_fops = {  .owner = THIS_MODULE,  .read = key_read,  .poll = key_poll,// 關(guān)鍵:綁定poll函數(shù)};應(yīng)用層(監(jiān)控按鍵 + 超時(shí))#includeintmain(){ intfd =open("/dev/key", O_RDWR | O_NONBLOCK); structpollfdfds[1] = {{fd, POLLIN,0}};// 關(guān)注可讀事件 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("等待超時(shí)...n");    }  } close(fd); return0;}

優(yōu)缺點(diǎn)與場(chǎng)景

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

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

適用場(chǎng)景:多設(shè)備監(jiān)聽、需超時(shí)(串口 + 網(wǎng)卡)

4 異步通知

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

代碼示例(驅(qū)動(dòng) + 應(yīng)用)

驅(qū)動(dòng)層(異步通知實(shí)現(xiàn))#includestaticstructfasync_struct*key_async;// 異步通知初始化staticintkey_fasync(intfd,structfile *filp,intmode){ returnfasync_helper(fd, filp, mode, &key_async);}// 中斷服務(wù)函數(shù):發(fā)送信號(hào)irqreturn_tkey_isr(intirq,void*dev_id){ if(key_async) {   kill_fasync(&key_async, SIGIO, POLL_IN);// 發(fā)送SIGIO信號(hào)  } returnIRQ_HANDLED;}
應(yīng)用層(信號(hào)處理)#includevoidsigio_handler(intsignum){// 信號(hào)處理函數(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());// 設(shè)置信號(hào)接收進(jìn)程 intflags =fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags | FASYNC);// 啟用異步通知 signal(SIGIO, sigio_handler);// 注冊(cè)信號(hào)處理函數(shù) // 主線程可自由執(zhí)行其他邏輯 while(1) {   printf("主線程運(yùn)行中...n");   sleep(1);  } close(fd); return0;}

優(yōu)缺點(diǎn)與場(chǎng)景

優(yōu)點(diǎn):CPU 占用率最低,完全異步,應(yīng)用層無(wú)阻塞

缺點(diǎn):實(shí)現(xiàn)復(fù)雜(需處理信號(hào)安全),信號(hào)可能丟失

適用場(chǎng)景:高實(shí)時(shí)性設(shè)備(網(wǎng)卡、磁盤 IO)、應(yīng)用層需同時(shí)處理多任務(wù)的場(chǎng)景


本人專注 Linux 驅(qū)動(dòng) & Linux/Android BSP 開發(fā)調(diào)試,可接外包項(xiàng)目/技術(shù)支持/問(wèn)題定位。有需求或交個(gè)朋友可加微信:【Chen_WeChat2025】。

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

    關(guān)注

    88

    文章

    11825

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何理解Linux內(nèi)核中的PCIe驅(qū)動(dòng)

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

    驅(qū)動(dòng)之路#20:Pinctrl 在手,引腳復(fù)用很順手

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

    變頻器四種制動(dòng)方式

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

    Linux內(nèi)核驅(qū)動(dòng)開發(fā)的技術(shù)核心精要

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

    驅(qū)動(dòng)之路#04:LCD 驅(qū)動(dòng)程序分析(基于RK3576)

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

    低成本CAN擴(kuò)展方案怎么選?CSM331A四種模式一次說(shuō)清

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

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

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

    【免費(fèi)送書】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

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

    【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

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

    四種MOS管驅(qū)動(dòng)電路方案介紹

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

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

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

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

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

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

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

    zephyr設(shè)備驅(qū)動(dòng)程序模型

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

    RDMA簡(jiǎn)介3之四種子協(xié)議對(duì)比

    RDMA協(xié)議共有四種子協(xié)議,分別為InfiniBand、iWARP、RoCE v1和RoCE v2協(xié)議。這四種協(xié)議使用統(tǒng)一的RDMA API,但在具體的網(wǎng)絡(luò)層級(jí)實(shí)現(xiàn)上有所不同,如圖1所示,接下來(lái)將
    發(fā)表于 06-04 16:05