开云kaiyun(中国)体育官网 镶嵌式Linux--异步陈述实验详解

让驱动主动“陈述”讹诈设施的核神思制,解脱传统阻难或轮询的低效方法,本色是用软件信号模拟硬件中断,结束驱动与讹诈的高效协同。以下从旨趣到实操,梳理中枢逻辑。

一、异步陈述:为什么需要它?
前体裁习的阻难IO和非阻难IO(协调poll轮询),中枢都是讹诈设施主动查询驱动景象——要么恭候寝息,要么握住轮询,CPU资源被多数占用。而异步陈述机制结束了透顶回转:
当驱动准备好数据时,主动向讹诈设施发送“信号”,讹诈设施禁受到信号后再履行读写操作,无需提前查询,既省俭CPU,又擢升了反应成果。这种机制就像硬件中断,只不外发生在软件层面,信号便是中断的“软件模拟版块”。
阻难、非阻难、异步陈述莫得优劣之分,仅适用于不同场景,需灭亡履行需求选拔,而异步陈述是事件驱动型场景的最优解。
二、信号:异步陈述的中枢载体
1. 信号的本色
Linux用信号看成异步陈述的序言,不同信号对应不共事件,可融会为“软件中断号”。统统信号在内核头文献中预界说,中枢重点是:

- 除SIGKILL(9号,强制停止)和SIGSTOP(19号,暂停进度)外,其余信号都可被忽略或拿获;
- 驱动设施主要通过发送SIGIO信号,示知讹诈设施拓荒可拜谒。
2. 讹诈设施的信号处理
讹诈设施需先注册信号处理函数,才能反应驱动发来的信号,中枢器具是`signal`函数:
```c
sighandler_t signal(int signum, sighandler_t handler);
```
- 参数:`signum`指定见解信号,`handler`是信号触发时履行的处理函数;

- 复返值:收效复返前一次处理函数,失败复返`SIG_ERR`。
信号处理函数的原型是`void (*sighandler_t)(int)`,函数内可履行数据读取、景象更新等操作。举例修改SIGINT的默许处理:当按下Ctrl+C时,先打印请示再退出,具体操作是新建测试设施,通过`signal(SIGINT, 自界说函数)`注册处理逻辑,编译运行后,按下Ctrl+C即可触发自界说逻辑,考据信号拿获的有用性。
三、驱动端:异步陈述的结束才略
驱动要结束主动发信号的才调,需完成三件事:界说结构体、结束中枢函数、在瑕玷事件中触发信号。
1. 界说异步陈述结构体
在驱动的拓荒结构体中,必须加入`fasync_struct`类型的指针变量,它是驱动与讹诈竖蜕变步连气儿的中枢载体,以第13章的按键驱动结构体为例,径直添加该指针成员,为后续管束异步队伍打下基础。
2. 结束file_operations的中枢函数
驱动需结束两个瑕玷操作:
- `fasync`函数:当讹诈设施通过`fcntl(fd, F_SETFL, flags | FASYNC)`开启异步陈述时,该函数被自动调用,里面中枢是通过`fasync_helper`驱动化异步队伍,竖立驱动与讹诈的关联,最终复返操作升天。
- `release`函数:当讹诈设施关闭拓荒文献时,开云kaiyun(中国)该函数自动履行,调用`fasync`函数并传入停止参数,计帐异步队伍资源,幸免内存线路。
同期,要在`file_operations`操作妥洽绑定这两个函数,确保驱动能反应讹诈设施的异步开启和关闭苦求。
3. 瑕玷事件触发信号
驱动在中枢事件触发时发送信号,以按键驱动为例,当定时器消抖证据有用按键后,需先判断异步队伍是否存在,若存在则调用`kill_fasync`,向讹诈发送SIGIO信号,示知拓荒可读。还需从容,结束异步陈述后,原有的轮询叫醒逻辑可屏蔽,因为信号已承担陈述责任。
四、讹诈端:拿获信号的结束才略
讹诈要禁受驱动的信号,需精确完成三步配置,不行偏废:
1. 注册信号处理函数:用`signal(SIGIO, 自界说函数)`拿获SIGIO信号,自界说函数中通过`read`读取驱动数据,完成后续处理。
2. 竖立进度包摄:用`fcntl(fd, F_SETOWN, getpid)`告诉内核,面前进度是禁受SIGIO信号的包摄进度,确保信号精确送达。
3. 开启异步陈述记号:先通过`fcntl(fd, F_GETFL)`取适合前文献景象记号,再通过`fcntl(fd, F_SETFL, flags | FASYNC)`添加FASYNC记号,发扬开启异步陈述方法。
完成配置后,主轮回无需轮询,径直寝息恭候信号,信号触发时自动履行处理函数,读取按键值并打印,极大镌汰CPU占用。
五、无缺测试历程
1. 编译枢纽:
- 驱动编译:编写Makefile,将见解文献指定为驱动源文献编译升天,履行编译指示生成`.ko`模块文献;
- 讹诈编译:用交叉编译器编译讹诈设施,生成适配开发板的可履行文献。
2. 运行枢纽:
- 将驱动模块和讹诈文献复制到开发板指定目次,先履行`depmod`驱动化模块依赖,再用`modprobe`加载驱动;
- 运行讹诈设施,传入拓荒旅途,按下开发板按键,结尾会输出按键值,考据异步陈述功能平方;
- 卸载驱动时,履行对应卸载指示,计帐模块资源。
六、中枢追溯
异步陈述的本色是用信号模拟中断,驱动和讹诈的责任皆备回转:驱动主动触发,讹诈被迫反应,透顶解脱轮询的低效,结束低CPU占用、高及时反应的通讯方法。
中枢逻辑可空洞为:驱动界说异步结构、结束fasync和release函数、按键事件发信号;讹诈注册信号处理、竖立包摄、开启FASYNC;二者通过SIGIO信号联动,高效完成数据传输。
该机制是Linux驱动中事件驱动场景的基础开云kaiyun(中国)体育官网,与阻难、非阻难造成互补,为复杂驱动场景提供高效的管束决议。