大家好,我最近在编写tl16c554串口扩展的驱动,其中在读串口时候调用wait_event_interruptible ()函数等待串口接收数据的到来,以便唤醒read函数,而在串口接收中断处理中调用wake_up_interruptible()以唤醒读进程。现在问题是当用户按下CTRL+C时要中断读函数,而wait_event_interruptible怎么判断是CTRL+C信号中断,还是wake_up_interruptible()唤醒的呢。附上目前的我的问题代码请大家帮帮看看 中断处理函数 [code] stati...
by lj33072315 - 嵌入式开发 - 2009-09-08 20:28:36 阅读(6008) 回复(1)
我写了个简单的中断程序: #define IRQ_ADC_FIQ AT91_PIN_PB29 #define ADS_CHANNEL_COUNT 4 #define NAME "gpiotest" #define TS_PB29 1<<29 static struct cdev ads7852_cdev; static int major=0; static DECLARE_wait_QUEUE_HEAD(wq); static struct semaphore sem; static int flag = 0; void pio_init(void) { ((AT91PS_SYS)AT91C_VA_BASE_SYS)->PIOB_IER=TS_PB29; ((AT91PS_SYS)AT91C_VA_BASE_SYS...
wait_event_interruptible()。该函数修改task的状态为TASK_interruptible,意味着改进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中。 在wait_event_interruptible()中首先判断condition是不是已经满足,如果是则直接返回0,否则调用__wait_event_interruptible(),并用__ret来存放返回值 --------------------------------------------------------------- #define wait_event_interruptible(wq, condition) \ ...
最近在看wait_event_interruptible()函数的源码,下面是其中的关键部分:[code]for (;;) { \ prepare_to_wait(&wq, &__wait, TASK_interruptible); \ if (condition) \ break; \ if (!signal_pending(current)) { \ schedule(); \ continue; \ } \ ret = -ERESTARTSYS; \ break; \ } \ finish_wait(&wq, &__wait);[/code]当condition条件满足的时候,就...
在看wait_event_interruptible(wq, condition) 时,有一点比较迷惑如下:[code]#define wait_event_interruptible(wq, condition) \ ({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible(wq, condition, __ret); \ __ret; \ })[/code]这里有个__ret,说是它是返回值,可是没见它在哪被return啊?宏函数定义的接口也没这个__ret,那么__ret在哪被返回呢? 根据宏定义是替换的情况,假设...
#define wait_event(wq, condition) \ do { \ if (condition) \ break; \ __wait_event(wq, condition); \ } while (0) 为什么写成do { .....
#define __wait_event(wq, condition) \ do { \ DEFINE_wait(__wait); \ \ for ( ; ; ) { \ prepare_to_wait(&wq, &__wait, TASK_UNinterruptible); \ if (condition) \ break; \ schedule(); \ } \ finish_wait(&wq, &__wait); \ } while (0) 为什么wait_event里面要用for( ; ; )无限循环?进程被设为TASK_UNinterruptible后不就不再被调度,上CPU了么...
[code]#define __wait_event(wq, condition) \ do { \ DEFINE_wait(__wait); \ \ for (;;) { \ ...
LDD3上讲wait_event_interrupt除了能被wake_up唤醒,还可以被信号唤醒,但没有具体讲。想问下怎么用信号唤醒,比如说驱动程序中read里面调用wait_event_interrupt,write调用wake_up。在用户空间里测试驱动时,运行user_read会被阻塞,运行user_write就可以唤醒user_read。这时如果不用user_write而用信号唤醒user_read,是通过什么方法?用kill命令向被阻塞的user_read进程发送某个信号吗? 求指教 谢谢
#define __wait_event(wq, condition) \ do { \ DEFINE_wait(__wait); \ \ for (;;) { \ ...
本帖最后由 honest581 于 2010-04-13 14:47 编辑 #define __wait_event(wq, condition) \ do { \ DEFINE_wait(__wait); \ \ for (;;) { ...