要求为:ARM外部GPIO接收下降沿硬件中断,在中断回调函数中发送信号SIGIO给用户层,用户层异步接收到信号后在自身回调函数中做出一部分简单处理。 具体要求很简单:外部4mS一个硬件中断(GPIO),如何实时传入Linux用户层,并快速处理,对这个中断事件的处理主要是在用户层的操作(有一些消息分发,进程管理之类的工作需要外部中断来触发)。 内核层可通过kill_fasync异步发送,kill_fasync发送方法网上资料很多,借用即可。 用户层通过signal(MYSIG, sig_handler)绑定信号和回调函数 共一下几个步骤: signal(MYSIG, sig_handler); fcntl(fd, F_SETOWN, getpid()); f_flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, f_flags | O_NONBLOCK | FASYNC); fcntl(fd, F_SETSIG, MYSIG);//如果要发送实时信号(MYSIG可自行定义),则需要通过fcntl设置 现测试后,发现信号传送正常。如果要周期性的接收信号,比如4mS一个GPIO中断,就需要对应时间里内核发送信号(相同信号)至用户层,用户层及时接收到相应信号。 测试遇到的问题是:周期性的信号交互并不是每次都能实时的响应,会出现中断事件未响应的现象。即GPIO的中断事件并不能在用户层实时响应(4mS的中断并不是很快),对于这种现象,不知道大家有没有好的解决办法,或者能够指出我所犯的错误。 最后在进程中pause等待信号,这样就不会出现中断事件传递过程中丢失的现象,但是在实际应用中又是不能pause的。 另外,为了满足要求,又尝试使用了一下input子系统,使用input_event来上报中断事件,这样起单个进程跑是不会丢失事件的,但是,如果增加几个线程或者进程来调度的话就会出现事件丢失的现象,在优先级方面,处理事件的线程的优先级是最高的。 还望同志们给点意见,谢谢! |
Linux中断响应,使用Linux信号传送机制,内核层发送信号至用户层
最新推荐文章于 2023-04-19 17:07:35 发布