首页 理论教育 设备轮询和中断处理技巧

设备轮询和中断处理技巧

时间:2023-10-31 理论教育 版权反馈
【摘要】:对于不支持中断的设备,读写时需要轮询设备状态,以及决定是否需要继续进行数据传输,例如,打印机。如果设备支持中断,则可按照中断方式进行。设备驱动程序加载时,首先会在内核中注册对应的设备号和结构体file_operations。设备驱动程序开发的主要内容之一就是实现结构体file_operations中各个接口对应的函数。参数inode:设备文件的索引节点的指针。

设备轮询和中断处理技巧

对于不支持中断的设备,读写时需要轮询设备状态,以及决定是否需要继续进行数据传输,例如,打印机。如果设备支持中断,则可按照中断方式进行。

Linux内核在结构体file_operations中统一定义了设备文件的各个访问接口。该结构体如下所示。

设备驱动程序加载时,首先会在内核中注册对应的设备号和结构体file_operations。应用程序通过系统调用访问设备时,内核会根据设备号查找到相应的结构体file_operations,然后再根据结构体file_operations中的接口调用具体放入设备的访问函数。

设备驱动程序开发的主要内容之一就是实现结构体file_operations中各个接口对应的函数。以下是file_operations中一些最基本的接口。

(1)int(*open)(structinode*,structfile*)

对应的系统调用:open()。

作用:检查设备是否就绪,验证设备号的合法性。

返回值:返回0表示成功,返回负数表示出现错误

参数inode:设备文件的索引节点的指针

参数file:设备文件的指针。

(2)int(*release)(structinode*,structfile*)

对应的系统调用:close()。

作用:停止设备工作,释放资源等。

返回值:返回0表示成功,返回负数表示出现错误。

(3)ssize_t(*read)(structfile*,char_user*,size_t,loff_t*)(www.xing528.com)

对应的系统调用:read()。

作用:读取设备中的数据。

返回值:返回非负数表示读取设备的字节数(signedsize)。

(4)ssize_t(*write)(structfile*,constchar_user*,size_t,loff_t*)

对应的系统调用:write()。

作用:把数据写入设备。

返回值:返回非负数表示写入设备的字节数。

(5)loff_t(*llseek)(structfile*,loff_t,int)

作用:修改设备文件的当前读写位置。

返回值:返回非负数表示修改后的读写位置。

(6)int(*ioct1)(structinode*,structfile*,unsignedint,unsignedlong)

作用:传输设备的控制信息或获取设备的状态信息。

返回值:返回非负数表示修改后的读写位置。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈