void down(struct semaphore * sem); 该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用; 上面这句话我不理解,导致睡眠时导致调用它的进程睡眠。不能在中断上下文使用这个又是什么意思呢? 就是在进程运行到程序的down函数的时候不能被中断所打断? 还有就是什么是中断上下文,就是中断来的时候保存的进程状态的信息吗,以方便中断完成后恢复之前运行的进程状态?
by shushi0123 - Linux环境编程 - 2014-01-06 10:07:28 阅读(15722) 回复(5)
本帖最后由 chrisli84 于 2010-06-28 23:49 编辑 自己写的驱动程序, 前面已经初始化了信号量 init_MUTEX(&scull_devices->sem); scull_setup_cdev(scull_devices, 0); 使用信号量的函数如下:[code]ssize_t scull_write(struct file *filp, char __user *data, size_t total, loff_t *f_pos) { struct scull_dev *dev = filp->private_data; ssize_t retval = 40; printk(KERN_ALERT "before sem\n");...
本帖最后由 wzw200 于 2014-05-29 10:07 编辑 1、内核对信号的基本处理方法 内核给一个进程发送软中断信号的方法,是在进程所在的进程表项的信号域设置对应于该信号的位。 这里要补充的是,如果信号发送给一个正在睡眠的进程,那么要看 该进程进入睡眠的优先级, 如果进程睡眠在可被中断的优先级上,则wake进程;否则仅设置进程表中信号域相应的位,而不wake进程。 这一点比较重要,因为进程检查是否收到信号的时机是: 一个进...
Two states are associated with sleeping, TASK_interruptible and TASK_UNinterruptible. They differ only in that tasks in the TASK_UNinterruptible state ignore signals, whereas tasks in the TASK_interruptible state wake up prematurely and respond to a signal if one is issued. Both types of sleeping tasks sit on a wait queue, waiting for an event to occur, and are not runnable. 休眠有两种相关...
#include #include #include #include #include #include #include MODULE_LICENSE("GPL"); static int flag=0; static DECLARE_WAIT_QUEUE_HEAD(wq); ssize_t sleepy_read(struct file*f,char *buf,size_t count,loff_t *pos){ printk("process %i (%s) going to sleep\n", current->pid,current->comm); wait_event_interruptible(wq,flag!=0); flag=0; printk("process %i (%s) was waken up\n"...
国庆之前,得各位的指导有了一点进步. 现在又碰到好多困难,还是TC的问题. 我中断处理函数里很简单.第一次中断过来启动tc2,第二次中断过来读tc2的值.然后在应用程序里一直read查询,这种模式是受单片机程序的影响.感觉只要调用了read以后,中断就产生不了了,好象中断跟read冲突似的。 是哪设置的问题,还是得用上面的那些函数啊?
国庆之前,得各位的指导有了一点进步. 现在又碰到好多困难,还是TC的问题. 我中断处理函数里很简单.第一次中断过来启动tc2,第二次中断过来读tc2的值.然后在应用程序里一直read查询,这种模式是受单片机程序的影响.感觉只要调用了read以后,中断就产生不了了,好象中断跟read冲突似的。 是哪设置的问题,还是得用上面的那些函数啊?
大家好,我最近在编写tl16c554串口扩展的驱动,其中在读串口时候调用wait_event_interruptible ()函数等待串口接收数据的到来,以便唤醒read函数,而在串口接收中断处理中调用wake_up_interruptible()以唤醒读进程。现在问题是当用户按下CTRL+C时要中断读函数,而wait_event_interruptible怎么判断是CTRL+C信号中断,还是wake_up_interruptible()唤醒的呢。附上目前的我的问题代码请大家帮帮看看 中断处理函数 [code] stati...
在中断里调用wake_up_interruptible,出现这个错误,BUG:sleeping function called from invalid context kernel/rtmutex.c。 请大家帮忙分析原因,谢谢。