linux中断驱动的编写疑问

发布于 2022-09-19 08:41:45 字数 871 浏览 12 评论 6

最近在写一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

双马尾 2022-09-20 13:12:19

(1)由于采用poll/select方式,感觉占用内核进程的时间比较多?
=====================================
不会占用内核进程的, 你可以看看内核中 poll/select 的实现,这是一个阻塞调用,
条件满足的时候,进程才会被唤醒,其他时间它并不占用cpu

   (2)利用send_sig_info应该不会有这个问题,但是效率可能会低些。
==========================================================================
发信号的方式 倒是不太常用, 不过,效率应该还是可以的。

   (3)除了上述2种方式外,还有哪些其他的方式?
==================================

SIGIO 方式,这个其实也是信号方式。
阻塞读写。
共享内存,
NETLINK,

不过,我觉得用 select 就行了,很常规和通用的方法。

梦中楼上月下 2022-09-20 13:11:58

我也在做arm-dsp的hpi驱动,但是感觉基础不好,调试不通。现在单单的几个字节的数据传输都没完成。不知兄台能不能提供些信息。有没有完整的步骤?

黎夕旧梦 2022-09-20 13:11:55

你说的是把消息传递给应用层吧? 用POLL 就可以了,效率高

·深蓝 2022-09-20 13:09:42

信号量或者完成量

×眷恋的温暖 2022-09-20 13:04:59

回复 2# dreamfly281

    谢谢兄弟的答复。
   
   我的表达有点问题,让兄弟误解了。我在写一个与DSP通讯的hpi驱动,DSP更新数据后通过一个硬件中断脚来通知主芯片。

   现在使用的就是tasklet,问题不在中断编程本身。
   主要问题是:
   (1)由于采用poll/select方式,感觉占用内核进程的时间比较多?
   (2)利用send_sig_info应该不会有这个问题,但是效率可能会低些。
   (3)除了上述2种方式外,还有哪些其他的方式?

空心↖ 2022-09-20 02:52:51

个人建议, 主循环你的功能可以是现在workqueue 或者tasklet里面,中断里面只需要唤醒或调度一下workqueue 就行,CPU会在后面适当的时间去执行workqueue 或者tasklet的, 具体的函数操作可以参照 linux kernel development 的第七章,讲的很清楚。 tasklet 效率稍高一些,不过对于一般的应用workqueue 也是足够的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文