中国官方网站下载 镶嵌式Linux--异步呈报实验详解

让驱动主动“呈报”诈欺圭臬的核神思制,解脱传统结巴或轮询的低效阵势,骨子是用软件信号模拟硬件中断,达成驱动与诈欺的高效协同。以下从旨趣到实操,梳理中枢逻辑。

一、异步呈报:为什么需要它?
前文体习的结巴IO和非结巴IO(谐和poll轮询),中枢齐是诈欺圭臬主动查询驱动景象——要么恭候睡觉,要么束缚轮询,CPU资源被无边占用。而异步呈报机制达成了透顶回转:
当驱动准备好数据时,主动向诈欺圭臬发送“信号”,诈欺圭臬禁受到信号后再奉行读写操作,无需提前查询,既检朴CPU,又擢升了反映后果。这种机制就像硬件中断,只不外发生在软件层面,信号便是中断的“软件模拟版块”。
结巴、非结巴、异步呈报莫得优劣之分,仅适用于不同场景,需联结本质需求选拔,而异步呈报是事件驱动型场景的最优解。
二、信号:异步呈报的中枢载体
1. 信号的骨子
开云app官方最新下载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`函数:当诈欺圭臬关闭开拓文献时,凤凰彩票APP该函数自动奉行,调用`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驱动中事件驱动场景的基础,与结巴、非结巴酿成互补中国官方网站下载,为复杂驱动场景提供高效的科罚决策。


备案号: