I want to synchronize a user space thread to an external event that generates an interrupt. I thought of using the following approach: the ISR that treats the interrupt does a quick processing (such as data capture and buffering) and then sends data to the user space thread through a message queue or signals to the thread waiting on a semaphore and it gets the buffered data from shared memory or some similar mechanism. So far I haven't succeded in finding a way to do it. I've tryed to write a module which uses semaphores (<linux/sem.h>) but aparently there is no way to use SysV IPC primitives in kernel modules. I would appreciate having hints on how to do it or pointers to documentation and example code if available. Thank you very much in advance for your help. Elder.
Synchronizing user space threads with kernel space in linux
Started by ●April 29, 2004
Reply by ●April 29, 20042004-04-29
Mad@Spammers wrote:> I want to synchronize a user space thread to an external event that > generates an interrupt. I thought of using the following approach: the > ISR that treats the interrupt does a quick processing (such as data > capture and buffering) and then sends data to the user space thread > through a message queue or signals to the thread waiting on a > semaphore and it gets the buffered data from shared memory or some > similar mechanism. So far I haven't succeded in finding a way to do > it. I've tryed to write a module which uses semaphores (<linux/sem.h>) > but aparently there is no way to use SysV IPC primitives in kernel > modules. > > I would appreciate having hints on how to do it or pointers to > documentation and example code if available. > > Thank you very much in advance for your help. > > Elder.A user-space signal is the equivalent of an interrupt. When user-space drivers are involved, I like to use "send_sig_info()" to send a signal to the user-space task to indicate changes in the state of the driver. I like to model the user/kernel space interface to look like a hardware device in terms of interrupt/signal handling, with ioctl's to acknowledge/enable/disable signals/interrupts from the driver. However, I'm an embedded type that is used to that kind of thing ;-) Getting the data to/from kernel space is another issue, typically done by the read/write driver interface, or by using mmap(). -- Michael N. Moran (h) 770 516 7918 5009 Old Field Ct. (c) 678 521 5460 Kennesaw, GA, USA 30144 http://mnmoran.org "... abstractions save us time working, but they don't save us time learning." Joel Spolsky, The Law of Leaky Abstractions The Beatles were wrong: 1 & 1 & 1 is 1
Reply by ●April 29, 20042004-04-29
On 29 Apr 2004, Mad@Spammers wrote:> I want to synchronize a user space thread to an external event that > generates an interrupt.Maybe the ongoing work about D-Bus can give you inspiration: <http://freedesktop.org/Software/dbus> One of its motivations was/is exactly to be able to do more driver stuff in user space, and I got the impression that that was what you are looking for... Herman -- K.U.Leuven, Mechanical Eng., Mechatronics & Robotics Research Group <http://people.mech.kuleuven.ac.be/~bruyninc> Tel: +32 16 322480
Reply by ●April 29, 20042004-04-29
Michael N. Moran wrote:>> I want to synchronize a user space thread to an external event that >> generates an interrupt. I thought of using the following approach: the >> ISR that treats the interrupt does a quick processing (such as data >> capture and buffering) and then sends data to the user space thread >> through a message queue or signals to the thread waiting on a >> semaphore and it gets the buffered data from shared memory or some >> similar mechanism. So far I haven't succeded in finding a way to do >> it. I've tryed to write a module which uses semaphores (<linux/sem.h>) >> but aparently there is no way to use SysV IPC primitives in kernel >> modules. > > A user-space signal is the equivalent of an interrupt. > When user-space drivers are involved, I like to use > "send_sig_info()" to send a signal to the user-space > task to indicate changes in the state of the driver. ... > > Getting the data to/from kernel space is another > issue, typically done by the read/write driver > interface, or by using mmap().What kind of time resolution do you need? One other option is to use netlink sockets. They're pretty easy. One drawback is netlink socket addresses are somewhat precious, a little like signal numbers. - Dan
Reply by ●April 29, 20042004-04-29
Hello Elder,> I want to synchronize a user space thread to an external event that > generates an interrupt. I thought of using the following approach: the > ISR that treats the interrupt does a quick processing (such as data > capture and buffering) and then sends data to the user space thread- Let your driver register a character interface - from your user space thread, do a synchronous read. - in your interrupt routine, copy the data and wakeup the waiting thread. Very common situation. Works without any problem for me. best regards Wolfgang M�es
Reply by ●April 29, 20042004-04-29
Wolfgang M�es wrote:> Hello Elder, > >> I want to synchronize a user space thread to an external event that >> generates an interrupt. I thought of using the following approach: the >> ISR that treats the interrupt does a quick processing (such as data >> capture and buffering) and then sends data to the user space thread > > - Let your driver register a character interface > - from your user space thread, do a synchronous read. > - in your interrupt routine, copy the data and wakeup the > waiting thread. > > Very common situation. Works without any problem for me. > > best regards > > Wolfgang M�esLook twice at this approach! This is the UNIX way - everything is a file. Read about the (now) old OSS audio drivers for block devices - same data size on every read or write. Or serial ports for character devices. /RogerL -- Roger Larsson Skellefte� Sweden
Reply by ●April 30, 20042004-04-30
Roger Larsson <roger.larsson@skelleftea.mail.telia.com> wrote in message> Look twice at this approach! This is the UNIX way - everything is a file.Is it a good or a bad thing? Cheers. Elder.
Reply by ●April 30, 20042004-04-30
Dan Kegel <dank-news@kegel.com> wrote in message> What kind of time resolution do you need? >I presume this question was asked to me. I am just evaluating how well would Linux (either 2.4 with preemption and low latency patches or 2.6 with preemption enabled) perform for my application. Worst case interrupt latency of 400us and thread activation latency of 4ms are more than acceptable in my application. Regards. Elder.
Reply by ●April 30, 20042004-04-30
Herman Bruyninckx <Herman.Bruyninckx@mech.kuleuven.ac.be> wrote in message news:<Pine.LNX.4.44.0404291542290.9591-100000@srv04.mech.kuleuven.ac.be>...> On 29 Apr 2004, Mad@Spammers wrote: > > > I want to synchronize a user space thread to an external event that > > generates an interrupt. > > Maybe the ongoing work about D-Bus can give you inspiration: > <http://freedesktop.org/Software/dbus> > One of its motivations was/is exactly to be able to do more driver stuff in > user space, and I got the impression that that was what you are looking > for... > > HermanI had a quick look at it. My requirements are much more modest and I'd rather use native linux resources instead. Still I will look at its code for some tips. Elder.
Reply by ●April 30, 20042004-04-30
Wolfgang M�es wrote:> - Let your driver register a character interface > - from your user space thread, do a synchronous read. > - in your interrupt routine, copy the data and wakeup the > waiting thread.This method would get my vote. The "send a signal" approach is workable, but it can be difficult to get right. This is especially true if your application is already using a number of signals for other things. YMMV... John -- John W. Linville linville@tuxdriver.com