当前位置:  技术问答>linux和unix

还是不懂,驱动到底如何能同步的发送信号给用户程序,请教高人,谢谢了

    来源: 互联网  发布时间:2016-03-20

    本文导语:  我驱动完成一个操作后要马上发送一个数据或者说是信号给用户程序,通知用户程序完成另一部分操作,这两部分都是我自己写的,现在就是不知道驱动如何通知用户程序,或者直接驱动如果能调用用户程序也可以。...

我驱动完成一个操作后要马上发送一个数据或者说是信号给用户程序,通知用户程序完成另一部分操作,这两部分都是我自己写的,现在就是不知道驱动如何通知用户程序,或者直接驱动如果能调用用户程序也可以。 上次发的帖子里有人说用阻塞的方法?  具体要怎么用?  因为我看了下信号是不行了,信号要进程的PID,但是又找不到其他方法,请有经验的指导下,谢谢了!

|
用file_operations的poll接口去实现,内部会用到一个wait queue。当然也可以不在poll里接口里实现,可以增加一个ioctl来实现,但内部一样可以用wait queue。应用程序通过select接口,或者自定义的ioctl接口来等待(休眠)直到可以读取设备的数据。一般在中断里wake up这个队列,从而唤醒应用程序继续下面的动作。

|
建议看LDD linxu设备驱动程序第五章--高级字符设备驱动程序-阻塞读写

信号不能用于驱动和应用程序同步
但你可以让用户程序在内核态阻塞
这时后驱动就可以和用户程序实现同步了

信号量也可以实现同步,但在内核中其互斥更多
建议用等待队列,ls说得很有道理

下面给个实际例子:
static ssize_t at91_mcp2510_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
CanData candata_ret;

retry: 
if (mcp2510dev.nCanReadpos !=  mcp2510dev.nCanRevpos) {
。。。。
return count;
} else {
if (filp->f_flags & O_NONBLOCK)

interruptible_sleep_on(&(mcp2510dev.wq));
//应用程序read系统调用后在此休眠等待唤醒
if (signal_pending(current))
return -ERESTARTSYS;
goto retry;
}
return sizeof(candata_ret);
}


static void at91_isr_mcp2510(int irq, void * dev_id, struct pt_regs * reg)
{

if ((mcp2510_isr & AT91C_PIO_PC14) ||MCP2510_IRQ_flag) /* this interrupt is shared!  Is it ours? */
{
。。。。。。。。。。。
if((AT91_SYS->PIOC_PDSR&AT91C_PIO_PC14?0:1))
{
。。。。。。。。。

if(byte & (RX0INT|RX1INT)){
/////////////////
wake_up_interruptible(&(mcp2510dev.wq);
在中断中此实现同步,唤醒read进程
/////////////////
DPRINTK("Wake up at91_mcp2510_read!n");
}
//else
//MCP2510_WriteBits(CANINTF, 0, 0xff); // Clear other interrupts
}
}

}



    
 
 

您可能感兴趣的文章:

  • 敬请高人:还是linux的安装问题,谁让它太麻烦呢!!
  • 请问各位高人为什么在这里不设置绘画模式为XOR,却还是能够擦除画出的矩形呢?
  • 请教各位,是JAVA有前途还是C#有前途?多谢!
  • 请教:请问java中存放数据库中的记录,用什么数据结构?(hashtable?vector?还是别的?)
  • 请教!出现这个提示是什么原因..是模块版本问题,还是其他问题..http://220.114.102.28/xitong/ProductShow.asp?ArticleID=82
  • 请教:如何看各个分区文件系统属性是ext2还是ext3
  • 问题还是没有解决,请教
  • 请教/var/adm/wtmpx文件的最大大小是多少?是一个数值还是一个与文件系统的比值?是如何设置大小限制的?谢谢!!
  • 还是这个问题,还有一点需要请教一下各位
  • 请教一下Linux的动态库加载方式(是启动加载还是运行加载?)
  • 请教:linux里取出mysql的数据为乱码,作了编码处理还是不行(java)
  • 还是请教最简单的SHELL编程
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 我以前是搞DELPHI的,现在想学JAVA,请教各位大侠你们用的都是什么开发环境是JBuild,还是VJ++,还是其他的(参与者都有分)
  • 请教czb(草中宝)以及其他高手,还是jdbc的问题,急急急!!
  • 请教,linux内核协议栈中,从内核往驱动发送的报文(注意是下行,不是上行),如何从sk_buff判断是组播数据报文还是组播协议报文????
  • 请教:为何Ubuntu中已经是root了还是显示You have to be root to run this script?
  • 请教:还是防火墙设置不能改变
  • diskman所用的环境是98下的dos实模式下所做的启动盘,还是纯dos6.22的起动盘启动引导,请教大家了
  • 已经看过 UNP第一卷,花了一天时间看了看精华区,还是有一些问题想请教各位大侠
  • 为什么找不到类呀??是不是还是路径问题?请教高手
  • 初学请教:samba配置好后,为何windows还是无法看到linux的共享资源呢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 信号可靠还是不可靠,取决与信号本身还是signal()/sigaction()的区别?
  • SIGRTMIN-SIGRTMAX的信号,是OS产生的,还是用户程序产生的?
  • GTK+问题:delete_event到底是信号还是事件?
  • 进程数据同步:消息队列还是共享内存+信号
  • 向sourceid提问,还是关于“在定时器到时后,应该发送什么信号让scanf()函数返回?”的
  • 还是有一个信号的问题等待求助
  • 程序员为了健康必看!早晨空腹喝水,是对还是错?
  • jsp+bean还是jsp+ejb还是jsp+servlet还是asp+activex好?
  • 还是那个关于update的问题呀,还是解决不了呀?
  • http走的是tcp还是udp?ssh是tcp还是udp?
  • 请问ResultSet返回的是全部数据,还是指针,还是其他什么?
  • 怎样在服务器端判断客户使用的浏览器是使用的简体中文的还是英文的还是日文的或者其他的?
  • 大家以后的发展方向是什么?能交流一下么?是就想学好专业知识,打一辈子工?还是自己开公司?还是要考研究生,使自己提高一个档次?还是想办法出国深造?发言比有分!!!
  • 程序里如何判断光驱里的是DVD盘,还是CD盘,还是一般的CD数据盘
  • linux新手想请问大家你们在linux下通常用什么开发语言和工具(C多点还是C++多点还是pascal ?还有工具方面?)
  • 你的桌面用的是LINUX还是UNIX还是WINDOWS?
  • 请问EJB高手,EJB主要用在b/s方式还是c/s,还是两这都可?有用过jBoss的吗?有配置文档吗?一定给分!!
  • linux下的c/c++语言开发,最好的ide是gcc还是kylix还是其他
  • jsp程序运行一次后,再修改原jsp程序,为什么运行还是的还是原来的程序??
  • 学习JAVA用JSDK开发还是VJ++?有什么区别吗?还是一样?
  • 求教:LIUNX 学开发还是学主机维护。。??
  • 新手问题,在linux下c/c++开发是在图形界面下还是字符界面下进行?
  • 速急!!!还是有关于汉入问题!!!大哥们速帮忙,小弟在线等待!!!
  • 请问各位现在用JAVA为开发工具的多,还是用C++的多?
  • REDHAT8.0还是REDHAT9.0?
  • linux下的编程主旨思想是在面向过程还是面向对象的?谢谢!!
  • 诸位写驱动是先找一个类似的程序更改还是从头些?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3