From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <4F0627A1.9070903@domain.hid> Date: Thu, 05 Jan 2012 23:43:45 +0100 From: Philippe Gerum MIME-Version: 1.0 References: <4F062328.1090309@domain.hid> In-Reply-To: Content-Type: text/plain; charset="iso-8859-1"; format="flowed" Content-Transfer-Encoding: quoted-printable Subject: Re: [Xenomai-help] RTDM and spi List-Id: Help regarding installation and common use of Xenomai List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Terry Fryar Cc: xenomai@xenomai.org On 01/05/2012 11:28 PM, Terry Fryar wrote: > Ah...simple enough! One question though...are the xenomai sync services > items and irq functions available for non-RT kernel threads?? IRQ related routines? like request, enable, disable: yes. It's even=20 recommended to use them in that context actually. Xenomai blocking services can only be used over a Xenomai thread, that=20 is a golden rule. Reason: to wait for a sync, the thread has to be held=20 by the scheduler of the kernel in question while it sleeps. Only Xenomai=20 threads have the required internal data to allow the Xenomai scheduler=20 to hold them. > > -----Original Message----- > From: Philippe Gerum [mailto:rpm@xenomai.org] > Sent: Thursday, January 05, 2012 4:25 PM > To: Terry Fryar > Cc: xenomai@xenomai.org > Subject: Re: [Xenomai-help] RTDM and spi > > On 01/05/2012 11:12 PM, Terry Fryar wrote: >> Using the RTDM api with Xen 2.6 to develop a linux driver. >> Basically have an ISR registered using *rtdm_irq_request*()that is >> triggered from a gpio pin. ISR works fine. Inside ISR, the only thing >> done is a *rtdm_event_signal*() on an event. >> Then, I have a task created using *rtdm_task_init*() that is waiting >> on the event using *rtdm_event_timedwait*(). >> So far, so good...all works. But, in the task I am making an SPI call >> after the event is signaled using spi_message_add_tail() and >> spi_sync() and that's where I get this: >> BUG: sleeping function called from invalid context at >> kernel/mutex.c:278 [ 98.449178] in_atomic(): 1, irqs_disabled(): 0, pid: > -555875760, name: >> v=FF=FF=FD=FF=BF=B7=BD=FF=A7=FF=FF=F5>=FF=FF=FDw=BF@=DE=DEP=DE=DE >> [ 98.458686] INFO: lockdep is turned off. >> [ 98.462811] [] (unwind_backtrace+0x0/0xe0) from >> [] >> (mutex_lock_nested+0x24/0x384) >> [ 98.472501] [] (mutex_lock_nested+0x24/0x384) from >> [] (__spi_sync+0x88/0xd8) [ 98.481730] [] >> (__spi_sync+0x88/0xd8) from [] >> (irqdrv_task+0x44/0xd4 [irqdrv]) >> [ 98.491149] [] (irqdrv_task+0x44/0xd4 [irqdrv]) from >> [] (xnarch_thread_trampoline+0x20/0x2c) >> [ 98.501845] [] (xnarch_thread_trampoline+0x20/0x2c) from >> [] (__xnpod_schedule+0x5cc/0xa54) [ 98.512355] [] >> (__xnpod_schedule+0x5cc/0xa54) from [] (0xfff7febf) [ >> 98.520674] Xenomai: suspending kernel thread bf008180 ('irqdrvTask') >> at 0xc00a92f8 after exception #0x0 I have tried this inside a kthread >> and it works fine. I can also try the spi stuff without being >> triggered by an IRQ, and I get the same error. I know this is >> something simple??? > > You may not call the regular Linux kernel routines from a real-time conte= xt. > You have two kernels running side by side, Linux and Xenomai, > unsynchronized. Your RTDM driver is entering __spi_sync() over a non-Linux > context, this can't work since that context may have preempted Linux > anywhere, including in the middle of what Linux thinks is an atomic secti= on. > > Any kernel code you want to call from the real-time co-kernel has to be > adapted to support this. Specifically, you cannot run the regular SPI sta= ck > over a real-time RTDM context. > >> >> >> >> _______________________________________________ >> Xenomai-help mailing list >> Xenomai-help@domain.hid >> https://mail.gna.org/listinfo/xenomai-help > > --=20 Philippe.