电话: 邮箱:
思 源 致 远   创 新 创 业 SEEKING TRUTH · PURSUING INNOVATION

让球盘

让球盘

滚球app(中国) 镶嵌式Linux--Linux盘曲与非盘曲I/O实验详解

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

滚球app(中国) 镶嵌式Linux--Linux盘曲与非盘曲I/O实验详解

本实验聚焦Linux驱动蛊卦中至关要紧的盘曲与非盘曲I/O花式,中枢谋略是措置早期轮询读取诞生(如按键)导致的CPU资源过度占用问题——此前轮询读取神志下,诈欺CPU占用率高达99.6%,而通过盘曲和非盘曲机制,可将CPU占用降至接近0%,大幅擢升系统效用。

一、中枢基础宗旨

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),需遍历扫数形容符检查景象,合乎形容符较少的场景。

开云kaiyun(中国)体育官网

- 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`移除队伍项,适配更复杂的场景。

- 中断叫醒逻辑:按键中断就业函数或定时器消抖函数中,检测到灵验按键事件后,滚球app中国官方网站调用`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函数需合理复返诞生景象,幸免景象判断特别导致诈欺轮询逻辑失效,超往往候需字据试验场景合理确立滚球app(中国),均衡反应速率和资源破钞。