标题 | 信号量在LINUX系统I2C驱动程序的应用 |
范文 | 刘新 【摘要】 在LINUX中,设备驱动程序与磁盘文件相同,都是经过打开、读写数据、关闭等一系列过程,当硬件有数据时直接读取,无数据时等待,驱动程序不断查询。在LINUX中有信号量机制,本文讨论信号量在驱动程序中的应用。 【关键词】 嵌入式LINUX 信号量 驱动程序 I2C 一、引言 笔者在开发嵌入式LINUX系统I2C驱动,通过实验将信号机制运用到驱动程序中,实现了硬件中断请求的消息传递,从而提高软件运行效率。 二、异步通知技术 笔者查阅书籍,发现LINUX可以使用信号来处理事件,在设备驱动中也有异步通知SIGIO信号,当新数据到达时发送SIGIO信号通知上层程序读数据。异步通知只有一个SIGIO信号,当多个设备都发送该信号,用户进程无法区分,必须用poll或select函数来确定数据来源。笔者研究发现信号机制经过POSIX扩展后,用sigaction()可以传递文件句柄,用户进程就可区分信号来源了。 三、信号在I2C驱动的应用 3.1 I2C驱动信号接口 用户进程使用fcntl执行F_SETOWN,进程ID号就保存在file->f_owner中,执行F_SETFL在设备中置FASYNC标志,设备有新数据时发送一个SIGIO信号,该信号被存放在file->f_owner中。 3.2信号的安装 使用sigaction()安裝信号函数。该函数有三个参数,第一个为信号值,第二个是结构sigaction指针,第三个未用。 在结构sigaction中sa_sigaction是信号函数。该信号函数有三个参数,第一个为信号值,第二个是siginfo_t结构指针,第三个未用。在siginfo_t结构中,si_fd就是文件句柄。 结构sigaction的sa_flags中SA_SIGINFO标志位被设定表示附带的参数可以被传递到信号函数中。 四、测试 下面用两个I2C设备fd、fd1来测试信号在驱动程序的应用。 经测试,I2C驱动程序达到了实时中断的要求,互不干扰。 结语:笔者以I2C驱动程序为例,抛砖引玉,推广到其他驱动程序的编写上来,会使嵌入式LINUX代码更短,方法更简单,效率更高。 参 考 文 献 [1]LINU设备驱动程序.第二版.魏永明,骆刚,姜君译.北京:中国电力出版社.2002.11. [2]Linux内核设计与实现.第一版.陈莉君译.北京:机械工出版社.2006.5. [3]Linux程序设计.第一版.杨晓云,王建桥,杨涛等译.北京:机械工业出版社.2002.1. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。