linux中断驱动的编写疑问
最近在写一个linux下面与中断处理相关的程序。
由于是从单片机,arm转过来的,很多思维还是逃不出以前的想法。
比如单片机时的中断处理:
void irq interrupt(void)
{
data_flag = 1;
rxbuf[data_len++] = data;
}
在主循环中
while(1)
{
if(1 == data_flag)
{
data_flag = 0;
data_process();
}
}
如果是在linux下面的驱动呢?
linux中断方面的驱动我写过一些,基本上都是采用socket/poll的方式或者send_sig_info之类的传递信号给应用层的方式,除了这2种方式之外,其他的方式还有哪些?
这些方式中哪种的实时性比较好?占用内核时间短?效率比较高?
请高人赐教。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
(1)由于采用poll/select方式,感觉占用内核进程的时间比较多?
=====================================
不会占用内核进程的, 你可以看看内核中 poll/select 的实现,这是一个阻塞调用,
条件满足的时候,进程才会被唤醒,其他时间它并不占用cpu
(2)利用send_sig_info应该不会有这个问题,但是效率可能会低些。
==========================================================================
发信号的方式 倒是不太常用, 不过,效率应该还是可以的。
(3)除了上述2种方式外,还有哪些其他的方式?
==================================
SIGIO 方式,这个其实也是信号方式。
阻塞读写。
共享内存,
NETLINK,
不过,我觉得用 select 就行了,很常规和通用的方法。
我也在做arm-dsp的hpi驱动,但是感觉基础不好,调试不通。现在单单的几个字节的数据传输都没完成。不知兄台能不能提供些信息。有没有完整的步骤?
你说的是把消息传递给应用层吧? 用POLL 就可以了,效率高
信号量或者完成量
回复 2# dreamfly281
谢谢兄弟的答复。
我的表达有点问题,让兄弟误解了。我在写一个与DSP通讯的hpi驱动,DSP更新数据后通过一个硬件中断脚来通知主芯片。
现在使用的就是tasklet,问题不在中断编程本身。
主要问题是:
(1)由于采用poll/select方式,感觉占用内核进程的时间比较多?
(2)利用send_sig_info应该不会有这个问题,但是效率可能会低些。
(3)除了上述2种方式外,还有哪些其他的方式?
个人建议, 主循环你的功能可以是现在workqueue 或者tasklet里面,中断里面只需要唤醒或调度一下workqueue 就行,CPU会在后面适当的时间去执行workqueue 或者tasklet的, 具体的函数操作可以参照 linux kernel development 的第七章,讲的很清楚。 tasklet 效率稍高一些,不过对于一般的应用workqueue 也是足够的。