电话: 邮箱:
博 学 而 笃 志   切 问 而 近 思 SEEK BROAD KNOWLEDGE · ASK EARNESTLY

关于九游

关于九游

九游体育(NineGameSports)官方网站 镶嵌式Linux--Linux干扰与非干扰I/O实验详解

发布日期:2026-05-13 04:15 来源:未知 作者:admin 浏览次数:

九游体育(NineGameSports)官方网站 镶嵌式Linux--Linux干扰与非干扰I/O实验详解

本实验聚焦Linux驱动开采中至关迫切的干扰与非干扰I/O形式,中枢主见是处罚早期轮询读取树立(如按键)导致的CPU资源过度占用问题——此前轮询读取状貌下,愚弄CPU占用率高达99.6%,而通过干扰和非干扰机制,可将CPU占用降至接近0%,大幅种植系统效力。

AG真人中国官网入口

一、中枢基础想法

1. 干扰与非干扰I/O骨子

- 干扰I/O:愚弄走访竖就地,若树立资源弗成用,程度会插足寝息景况让出CPU,直至树立可用时被叫醒,才履行数据读取。这是树立文献的默许走访形式,代码简陋,能幸免CPU空转奢侈。

- 非干扰I/O:树立弗成用时,愚弄不会寝息,而是复返舛错码,由愚弄自主遴荐握续轮询或吊销。非干扰走访需显式在open时添加`O_NONBLOCK`象征,妥当需要主动查询、多树立监控的场景。

2. 关节复旧机制:恭候队伍

恭候队伍是杀青干扰I/O的中枢,端庄照应寝息与叫醒经由,中枢身分包括:

- 恭候队伍头:用`wait_queue_head_t`默示,需通过`init_waitqueue_head`开动化或用`DECLARE_WAIT_QUEUE_HEAD`奏凯界说开动化,是照应恭候程度的进口。

- 恭候队伍项:用`wait_queue_t`默示,对应具体恭候的程度,可通过`DECLARE_WAITQUEUE(name, tsk)`快速创建,tsk往往设为`current`(刻下景度)。

- 中枢操作:

- 程度寝息:通过`add_wait_queue`将程度对应的队伍项加入恭候队伍头,再将程度设为可中断寝息态(`TASK_INTERRUPTIBLE`),调用`schedule`切换程度,杀青寝息。

- 叫醒程度:常用`wake_up_interruptible`,仅叫醒可中断寝息的程度,幸免叫醒弗成中断程度导致资源奢侈,该操作往往在中断处理函数中履行。

- 恭候事件:可用`wait_event_interruptible`等函数,让程度恭候特定条款高傲(如按键灵验),条款不高傲则干扰,高傲时自动叫醒。

3. 轮询机制与驱动互助

非干扰走访依赖`select`、`poll`、`epoll`杀青轮询,三者均通过调用驱动的`poll`函数完成树立景况检测:

- select:受文献描述符数目限度(默许1024),需遍历通盘描述符查验景况,妥当描述符较少的场景。

- poll:无描述符数目限度,通过`pollfd`结构体明确监视的事件,效力优于select,是中小畛域场景的常用遴荐。

- epoll:妥当大畛域并发,经受事件驱动机制,效力极高,常用于收罗编程,本实验以select和poll为主。

当愚弄调用select或poll时,驱动需提供对应的`poll`函数,中枢操作是调用`poll_wait`将恭候队伍添加到轮询表中,并向愚弄复返树立景况(如是否可读)。

二、干扰I/O实验

1. 实验中枢诉求

第12章的中断实验中,愚弄通过while轮回+read不休读取按键,导致CPU占用率高达99.6%。干扰I/O的中枢处罚想路是:无按键事件时让愚弄寝息,有事件时叫醒,绝对开释CPU资源。

2. 驱动关节校正

- 数据结构补充:在树立结构体中新增`wait_queue_head_t r_wait`,用于照应恭候的程度队伍。

- 恭候队伍开动化:在驱动开动化函数中,调用`init_waitqueue_head`开动化恭候队伍头,为后续寝息叫醒作念准备。

- read函数校正:经受`wait_event_interruptible`让程度恭候按键灵验事件,若按键无效则插足可中断寝息,幸免轮回轮询;若按键灵验,连接履行读取操作。同期支握另一种手动照应队伍的状貌:通过`DECLARE_WAITQUEUE`创建队伍项,`add_wait_queue`加入队伍,`schedule`切换程度,叫醒后用`remove_wait_queue`移除队伍项,适配更复杂的场景。

- 中断叫醒逻辑:按键中断办事函数或定时器消抖函数中,检测到灵验按键事件后,九游体育(NineGameSports)官方网站调用`wake_up_interruptible`叫醒恭候队伍中的程度,让寝息的愚弄连接履行读取操作。

3. 愚弄与测试

- 测试治安:奏凯复用第12章的愚弄,无需修改,因为默许open等于干扰形式,愚弄会自动在无按键时寝息。

- 运行成果:加载驱动后运行测试治安,按下按键时普通打印键值,搜检CPU占用率,从99.6%降至0.0%,仅在按键触发短暂占用少许CPU,大幅种植系统效力。

三、非干扰I/O实验

1. 驱动中枢适配

- 读取逻辑补充:在read函数中加多非干扰判断,若open时添加了`O_NONBLOCK`象征,检测到无按键事件时,奏凯复返`-EAGAIN`舛错码,不干扰程度,让愚弄自主决定后续操作。

- poll函数杀青:新增驱动的`poll`回调函数,中枢职责是调用`poll_wait`将恭候队伍加入轮询表,同期检测按键是否灵验,灵验时向愚弄复返`POLLIN`,讲演特等据可读,不然复返0,让愚弄清晰树立弗成用。

- 操作集注册:在树立文献操作结构体中,添加`poll`成员变量,指向杀青的`poll`函数,确保愚弄调用select或poll时能触发驱动的对应逻辑。

2. 测试愚弄杀青

测试愚弄提供两种非干扰读取状貌,适配不同轮询需求:

- poll状貌:界说`pollfd`结构体,指定监视可读事件,通过`poll`函数轮询,超时设立为500ms。若复返值大于0,发挥树立可读,调用read读取键值;若超时,履行自界说超时处理,杀青带超时的轮询,幸免万古刻空等。

- select状貌:界说`fd_set`集聚存放待监视的描述符,设立500ms超时,调用`select`函数轮询。把柄复返值判断:超时则自界说处理,出错则自界说处理,特等据可读时用`read`读取键值,逻辑显著,兼容老版块Linux系统。

3. 运行成果

加载驱动并运行测试愚弄,按下按键时普通打印键值,搜检CPU占用率,相通降至0.0%。由于经受了带超时的轮询,幸免了死轮回空转,仅在轮询和按键触发时耗尽少许CPU,兼顾及时性与资源效力。

四、实验追思与实践提倡

1. 中枢对比

- 干扰I/O:代码松弛,CPU占用极低,开采难度低,妥当单任务、无需主动查询的简陋场景,是大多半传感器、按键树立的优先遴荐。

- 非干扰I/O:需互助select或poll使用,愚弄代码复杂度略高,但支握多树立斡旋监控,妥当需要同期照应多个树立、事件驱动的场景,比如同期监控按键、收罗和串口的治安。

2. 避坑重心

- 王人备谢却在愚弄层用while轮回+read奏凯轮询,这是CPU高占用的根源,通盘轮询必须通过干扰或select/poll杀青。

- 干扰I/O需严格配对寝息与叫醒操作,幸免只寝息不叫醒导致程度永久干扰,叫醒操作必须放在中断等确保树立可用的时机履行。

- 非干扰I/O的poll函数需合理复返树立景况,幸免景况判断舛错导致愚弄轮询逻辑失效,超常常间需把柄施行场景合理设立九游体育(NineGameSports)官方网站,均衡反映速率和资源耗尽。