All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] Non-Real-Time Asynchronous Notification
@ 2008-03-19 22:05 Robert McCullough
  2008-03-20 19:29 ` Jan Kiszka
  0 siblings, 1 reply; 9+ messages in thread
From: Robert McCullough @ 2008-03-19 22:05 UTC (permalink / raw)
  To: xenomai

Hi,

How do I signal an asynchronous notification from a RTDM real-time task to a
non-real-time user-space Linux thread?
Do I use Non-Real-Time Signaling Services (rtdm_nrtsig_init,..)?
If so, how?

Here is the current code that I am trying to port to RTDM.

Current driver code to signal non-real-time Linux thread:

	// If event
	if(event){
		// and signal asynchronous readers 
		if (kmdpr_device->async_queue)
			kill_fasync(&kmdpr_device->async_queue, SIGIO,
POLL_IN);
	}

Current non-real-time Linux thread signal hander:

	// A static function to use for callback by OS
	static void signal_handler_func(int signo)
	{
		l_sighandler->signalHandler(signo);
	}

	void Kmss::startSignalHandler()
	{
		l_sighandler = this;

		struct sigaction action;

		memset(&action, 0, sizeof(action));
		action.sa_handler = signal_handler_func;
		action.sa_flags = 0;//SA_RESTART;

		sigaction(SIGIO, &action, NULL);
		fcntl(_fh, F_SETOWN, getpid());
		fcntl(_fh, F_SETFL, fcntl(_fh, F_GETFL) | FASYNC);
	}

	void Kmss::signalHandler(int signo)
	{
		kmdpr_events_t events;
	
		if (signo==SIGIO)
		{
			/* Process events */
		}
	}

Best regards, 
Rob




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-03-19 22:05 [Xenomai-help] Non-Real-Time Asynchronous Notification Robert McCullough
@ 2008-03-20 19:29 ` Jan Kiszka
  2008-03-21 14:57   ` Robert McCullough
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Kiszka @ 2008-03-20 19:29 UTC (permalink / raw)
  To: rob; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 669 bytes --]

Robert McCullough wrote:
> Hi,
> 
> How do I signal an asynchronous notification from a RTDM real-time task to a
> non-real-time user-space Linux thread?
> Do I use Non-Real-Time Signaling Services (rtdm_nrtsig_init,..)?
> If so, how?
> 
> Here is the current code that I am trying to port to RTDM.
> 
> Current driver code to signal non-real-time Linux thread:
> 
> 	// If event
> 	if(event){
> 		// and signal asynchronous readers 
> 		if (kmdpr_device->async_queue)
> 			kill_fasync(&kmdpr_device->async_queue, SIGIO,
> POLL_IN);
> 	}

Just push this code in the rtdm_nrtsig handler and trigger the handler 
execution from RT context.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-03-20 19:29 ` Jan Kiszka
@ 2008-03-21 14:57   ` Robert McCullough
  2008-03-21 20:09     ` Jan Kiszka
  0 siblings, 1 reply; 9+ messages in thread
From: Robert McCullough @ 2008-03-21 14:57 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Hi Jan,

  --> -----Original Message-----
  --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> Sent: Thursday, March 20, 2008 3:29 PM
  --> To: rob@domain.hid
  --> Cc: xenomai@xenomai.org
  --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  --> 
  --> Robert McCullough wrote:
  --> > Hi,
  --> >
  --> > How do I signal an asynchronous notification from a RTDM real-time
  --> task to a
  --> > non-real-time user-space Linux thread?
  --> > Do I use Non-Real-Time Signaling Services (rtdm_nrtsig_init,..)?
  --> > If so, how?
  --> >
  --> > Here is the current code that I am trying to port to RTDM.
  --> >
  --> > Current driver code to signal non-real-time Linux thread:
  --> >
  --> > 	// If event
  --> > 	if(event){
  --> > 		// and signal asynchronous readers
  --> > 		if (kmdpr_device->async_queue)
  --> > 			kill_fasync(&kmdpr_device->async_queue,
SIGIO,
  --> > POLL_IN);
  --> > 	}
  --> 
  --> Just push this code in the rtdm_nrtsig handler and trigger the handler
  --> execution from RT context.
  --> 
  --> Jan

[Robert McCullough] 
Ok, I understand that but how do I specify the file operation fasync in my
rtdm_device?  How do I replace or update the code marked TODO?

Here is a snippet of my current RTDM.

/* TODO replace fasync with Xenomai counterpart */
int kmdpr_fasync(int fd, struct file *filp, int mode)
{
	kmdpr_context_t *ctx = filp->private_data;

	return fasync_helper(fd, filp, mode, &ctx->async_queue);
}

static int kmdpr_close (struct rtdm_dev_context *context,
						rtdm_user_info_t *
user_info)
{
	kmdpr_context_t *ctx; /* device context information */

	PRODEBUG(MODULE_NAME, "Close: kmdpr\n");

/* TODO replace fasync with Xenomai counterpart */
	// remove this filp from the asynchronously notified filp's 
//	kmdpr_fasync(-1, filp, 0);


	ctx = (kmdpr_context_t *)context->dev_private;
	/*
	 * Shut Down KMDPR port
	 */
	shutdown(ctx);
	return 0;
}

/**
* This structure describe the kmdpr RTDM device
*
*/
static struct rtdm_device kmdpr_device = {
	struct_version:	RTDM_DEVICE_STRUCT_VER,
		 
	device_flags:		RTDM_NAMED_DEVICE,
	context_size:		sizeof(kmdpr_context_t),
	device_name:		DEVICE_NAME,
		 
	open_rt:			kmdpr_open,
	open_nrt: 			kmdpr_open,
		 
	ops: {
		close_rt:		kmdpr_close,
		close_nrt:		kmdpr_close,
		
		ioctl_rt:		kmdpr_ioctl,
		ioctl_nrt:		kmdpr_ioctl,

		read_rt:		NULL,
		read_nrt:		NULL,
		
		write_rt:		NULL,
		write_nrt:		NULL,
		
/* TODO replace fasync with Xenomai counterpart 
		fasync_rt:   	NULL,
		fasync_nrt:   	kmdpr_fasync,
*/
	},
		 
	device_class: 		RTDM_CLASS_KMDPR,
	device_sub_class:	RTDM_SUBCLASS_GENERIC,
	profile_version:	1,
	
	driver_name:		MODULE_NAME,
	driver_version:     RTDM_DRIVER_VER(MODULE_MAJOR_VER, 
	
MODULE_MINOR_VER, 
	
MODULE_BUGFIX_VER),
	peripheral_name:	MODULE_DESC,
	provider_name:		"Promess Incorporated",
	proc_name:			kmdpr_device.device_name,
};

Thanks,
Rob




^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-03-21 14:57   ` Robert McCullough
@ 2008-03-21 20:09     ` Jan Kiszka
  2008-03-31 15:22       ` Robert McCullough
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Kiszka @ 2008-03-21 20:09 UTC (permalink / raw)
  To: rob; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 1762 bytes --]

Robert McCullough wrote:
> Hi Jan,
> 
>   --> -----Original Message-----
>   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> Sent: Thursday, March 20, 2008 3:29 PM
>   --> To: rob@domain.hid
>   --> Cc: xenomai@xenomai.org
>   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
>   --> 
>   --> Robert McCullough wrote:
>   --> > Hi,
>   --> >
>   --> > How do I signal an asynchronous notification from a RTDM real-time
>   --> task to a
>   --> > non-real-time user-space Linux thread?
>   --> > Do I use Non-Real-Time Signaling Services (rtdm_nrtsig_init,..)?
>   --> > If so, how?
>   --> >
>   --> > Here is the current code that I am trying to port to RTDM.
>   --> >
>   --> > Current driver code to signal non-real-time Linux thread:
>   --> >
>   --> > 	// If event
>   --> > 	if(event){
>   --> > 		// and signal asynchronous readers
>   --> > 		if (kmdpr_device->async_queue)
>   --> > 			kill_fasync(&kmdpr_device->async_queue,
> SIGIO,
>   --> > POLL_IN);
>   --> > 	}
>   --> 
>   --> Just push this code in the rtdm_nrtsig handler and trigger the handler
>   --> execution from RT context.
>   --> 
>   --> Jan
> 
> [Robert McCullough] 
> Ok, I understand that but how do I specify the file operation fasync in my
> rtdm_device?  How do I replace or update the code marked TODO?

In fact, there is no fasync support available with RTDM, specifically as 
using signals under real-time constraints is a bad idea (not only 
because Xenomai has no hard-RT signal support).

But before suggesting any alternative pattern: What does your 
application actually require to work? How does asynchronous 
driver/application interaction currently look like?

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-03-21 20:09     ` Jan Kiszka
@ 2008-03-31 15:22       ` Robert McCullough
  2008-04-01 23:07         ` Jan Kiszka
  0 siblings, 1 reply; 9+ messages in thread
From: Robert McCullough @ 2008-03-31 15:22 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Hi Jan,

  --> -----Original Message-----
  --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> Sent: Friday, March 21, 2008 4:10 PM
  --> To: rob@domain.hid
  --> Cc: xenomai@xenomai.org
  --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  --> 
  --> Robert McCullough wrote:
  --> > Hi Jan,
  --> >
  --> >   --> -----Original Message-----
  --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> >   --> Sent: Thursday, March 20, 2008 3:29 PM
  --> >   --> To: rob@domain.hid
  --> >   --> Cc: xenomai@xenomai.org
  --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
  --> Notification
  --> >   -->
  --> >   --> Robert McCullough wrote:
  --> >   --> > Hi,
  --> >   --> >
  --> >   --> > How do I signal an asynchronous notification from a RTDM
  --> real-time
  --> >   --> task to a
  --> >   --> > non-real-time user-space Linux thread?
  --> >   --> > Do I use Non-Real-Time Signaling Services
  --> (rtdm_nrtsig_init,..)?
  --> >   --> > If so, how?
  --> >   --> >
  --> >   --> > Here is the current code that I am trying to port to RTDM.
  --> >   --> >
  --> >   --> > Current driver code to signal non-real-time Linux thread:
  --> >   --> >
  --> >   --> > 	// If event
  --> >   --> > 	if(event){
  --> >   --> > 		// and signal asynchronous readers
  --> >   --> > 		if (kmdpr_device->async_queue)
  --> >   --> >
kill_fasync(&kmdpr_device->async_queue,
  --> > SIGIO,
  --> >   --> > POLL_IN);
  --> >   --> > 	}
  --> >   -->
  --> >   --> Just push this code in the rtdm_nrtsig handler and trigger the
  --> handler
  --> >   --> execution from RT context.
  --> >   -->
  --> >   --> Jan
  --> >
  --> > [Robert McCullough]
  --> > Ok, I understand that but how do I specify the file operation fasync
  --> in my
  --> > rtdm_device?  How do I replace or update the code marked TODO?
  --> 
  --> In fact, there is no fasync support available with RTDM, specifically
  --> as
  --> using signals under real-time constraints is a bad idea (not only
  --> because Xenomai has no hard-RT signal support).
  --> 
  --> But before suggesting any alternative pattern: What does your
  --> application actually require to work? How does asynchronous
  --> driver/application interaction currently look like?
  --> 
  --> Jan

[Robert McCullough]
Here is a little background on how my driver works.
The driver is the interface/control for an AC servo drive which controls an
AC motor.  The interface to the drive is done through a dual-ported RAM.
The I/O from the servo drive is updated and an IRQ is triggered from the
servo drive through the DP RAM to our MPC5200 at a 4 kHz rate.  In my IRQ
handler I read, process, and update the I/O in the RAM.  Some of the data
from the servo drive contains status bits that represent asynchronous
events/faults from the drive that needs to be passed up to the user
application.  In my current non-real-time driver I used fasync to send a
SIGIO signal to the user application whenever one of these events/faults
changed and then the application would read the status bits with an ioctl
call and process them.

I hope this clarifies the requirements a little.
How would you suggest I solve this in my RTDM driver?
 

Best regards, 
Robert McCullough





^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-03-31 15:22       ` Robert McCullough
@ 2008-04-01 23:07         ` Jan Kiszka
  2008-04-02 13:29           ` Robert McCullough
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Kiszka @ 2008-04-01 23:07 UTC (permalink / raw)
  To: rob; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 3864 bytes --]

Robert McCullough wrote:
> Hi Jan,
> 
>   --> -----Original Message-----
>   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> Sent: Friday, March 21, 2008 4:10 PM
>   --> To: rob@domain.hid
>   --> Cc: xenomai@xenomai.org
>   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
>   --> 
>   --> Robert McCullough wrote:
>   --> > Hi Jan,
>   --> >
>   --> >   --> -----Original Message-----
>   --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> >   --> Sent: Thursday, March 20, 2008 3:29 PM
>   --> >   --> To: rob@domain.hid
>   --> >   --> Cc: xenomai@xenomai.org
>   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
>   --> Notification
>   --> >   -->
>   --> >   --> Robert McCullough wrote:
>   --> >   --> > Hi,
>   --> >   --> >
>   --> >   --> > How do I signal an asynchronous notification from a RTDM
>   --> real-time
>   --> >   --> task to a
>   --> >   --> > non-real-time user-space Linux thread?
>   --> >   --> > Do I use Non-Real-Time Signaling Services
>   --> (rtdm_nrtsig_init,..)?
>   --> >   --> > If so, how?
>   --> >   --> >
>   --> >   --> > Here is the current code that I am trying to port to RTDM.
>   --> >   --> >
>   --> >   --> > Current driver code to signal non-real-time Linux thread:
>   --> >   --> >
>   --> >   --> > 	// If event
>   --> >   --> > 	if(event){
>   --> >   --> > 		// and signal asynchronous readers
>   --> >   --> > 		if (kmdpr_device->async_queue)
>   --> >   --> >
> kill_fasync(&kmdpr_device->async_queue,
>   --> > SIGIO,
>   --> >   --> > POLL_IN);
>   --> >   --> > 	}
>   --> >   -->
>   --> >   --> Just push this code in the rtdm_nrtsig handler and trigger the
>   --> handler
>   --> >   --> execution from RT context.
>   --> >   -->
>   --> >   --> Jan
>   --> >
>   --> > [Robert McCullough]
>   --> > Ok, I understand that but how do I specify the file operation fasync
>   --> in my
>   --> > rtdm_device?  How do I replace or update the code marked TODO?
>   --> 
>   --> In fact, there is no fasync support available with RTDM, specifically
>   --> as
>   --> using signals under real-time constraints is a bad idea (not only
>   --> because Xenomai has no hard-RT signal support).
>   --> 
>   --> But before suggesting any alternative pattern: What does your
>   --> application actually require to work? How does asynchronous
>   --> driver/application interaction currently look like?
>   --> 
>   --> Jan
> 
> [Robert McCullough]
> Here is a little background on how my driver works.
> The driver is the interface/control for an AC servo drive which controls an
> AC motor.  The interface to the drive is done through a dual-ported RAM.
> The I/O from the servo drive is updated and an IRQ is triggered from the
> servo drive through the DP RAM to our MPC5200 at a 4 kHz rate.  In my IRQ
> handler I read, process, and update the I/O in the RAM.  Some of the data
> from the servo drive contains status bits that represent asynchronous
> events/faults from the drive that needs to be passed up to the user
> application.  In my current non-real-time driver I used fasync to send a
> SIGIO signal to the user application whenever one of these events/faults
> changed and then the application would read the status bits with an ioctl
> call and process them.
> 
> I hope this clarifies the requirements a little.
> How would you suggest I solve this in my RTDM driver?

Well, a classic pattern is to encapsulate the async event handling in 
one or more dedicated threads that block-wait on those events. Check the 
RTDM profile for serial devices for such a channel. This has the 
advantage that you can cleanly specify the handling priority, 
specifically compared to "normal" operations.

HTH,
Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-04-01 23:07         ` Jan Kiszka
@ 2008-04-02 13:29           ` Robert McCullough
  2008-04-05 15:41             ` Jan Kiszka
  0 siblings, 1 reply; 9+ messages in thread
From: Robert McCullough @ 2008-04-02 13:29 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Hi Jan,

  --> -----Original Message-----
  --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> Sent: Tuesday, April 01, 2008 7:07 PM
  --> To: rob@domain.hid
  --> Cc: xenomai@xenomai.org
  --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  --> 
  --> Robert McCullough wrote:
  --> > Hi Jan,
  --> >
  --> >   --> -----Original Message-----
  --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> >   --> Sent: Friday, March 21, 2008 4:10 PM
  --> >   --> To: rob@domain.hid
  --> >   --> Cc: xenomai@xenomai.org
  --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
  --> Notification
  --> >   -->
  --> >   --> Robert McCullough wrote:
  --> >   --> > Hi Jan,
  --> >   --> >
  --> >   --> >   --> -----Original Message-----
  --> >   --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> >   --> >   --> Sent: Thursday, March 20, 2008 3:29 PM
  --> >   --> >   --> To: rob@domain.hid
  --> >   --> >   --> Cc: xenomai@xenomai.org
  --> >   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
  --> >   --> Notification
  --> >   --> >   -->
  --> >   --> >   --> Robert McCullough wrote:
  --> >   --> >   --> > Hi,
  --> >   --> >   --> >
  --> >   --> >   --> > How do I signal an asynchronous notification from a
  --> RTDM
  --> >   --> real-time
  --> >   --> >   --> task to a
  --> >   --> >   --> > non-real-time user-space Linux thread?
  --> >   --> >   --> > Do I use Non-Real-Time Signaling Services
  --> >   --> (rtdm_nrtsig_init,..)?
  --> >   --> >   --> > If so, how?
  --> >   --> >   --> >
  --> >   --> >   --> > Here is the current code that I am trying to port to
  --> RTDM.
  --> >   --> >   --> >
  --> >   --> >   --> > Current driver code to signal non-real-time Linux
  --> thread:
  --> >   --> >   --> >
  --> >   --> >   --> > 	// If event
  --> >   --> >   --> > 	if(event){
  --> >   --> >   --> > 		// and signal asynchronous readers
  --> >   --> >   --> > 		if (kmdpr_device->async_queue)
  --> >   --> >   --> >
  --> > kill_fasync(&kmdpr_device->async_queue,
  --> >   --> > SIGIO,
  --> >   --> >   --> > POLL_IN);
  --> >   --> >   --> > 	}
  --> >   --> >   -->
  --> >   --> >   --> Just push this code in the rtdm_nrtsig handler and
  --> trigger the
  --> >   --> handler
  --> >   --> >   --> execution from RT context.
  --> >   --> >   -->
  --> >   --> >   --> Jan
  --> >   --> >
  --> >   --> > [Robert McCullough]
  --> >   --> > Ok, I understand that but how do I specify the file
  --> operation fasync
  --> >   --> in my
  --> >   --> > rtdm_device?  How do I replace or update the code marked
  --> TODO?
  --> >   -->
  --> >   --> In fact, there is no fasync support available with RTDM,
  --> specifically
  --> >   --> as
  --> >   --> using signals under real-time constraints is a bad idea (not
  --> only
  --> >   --> because Xenomai has no hard-RT signal support).
  --> >   -->
  --> >   --> But before suggesting any alternative pattern: What does your
  --> >   --> application actually require to work? How does asynchronous
  --> >   --> driver/application interaction currently look like?
  --> >   -->
  --> >   --> Jan
  --> >
  --> > [Robert McCullough]
  --> > Here is a little background on how my driver works.
  --> > The driver is the interface/control for an AC servo drive which
  --> controls an
  --> > AC motor.  The interface to the drive is done through a dual-ported
  --> RAM.
  --> > The I/O from the servo drive is updated and an IRQ is triggered from
  --> the
  --> > servo drive through the DP RAM to our MPC5200 at a 4 kHz rate.  In
  --> my IRQ
  --> > handler I read, process, and update the I/O in the RAM.  Some of the
  --> data
  --> > from the servo drive contains status bits that represent
  --> asynchronous
  --> > events/faults from the drive that needs to be passed up to the user
  --> > application.  In my current non-real-time driver I used fasync to
  --> send a
  --> > SIGIO signal to the user application whenever one of these
  --> events/faults
  --> > changed and then the application would read the status bits with an
  --> ioctl
  --> > call and process them.
  --> >
  --> > I hope this clarifies the requirements a little.
  --> > How would you suggest I solve this in my RTDM driver?
  --> 
  --> Well, a classic pattern is to encapsulate the async event handling in
  --> one or more dedicated threads that block-wait on those events. Check
  --> the
  --> RTDM profile for serial devices for such a channel. This has the
  --> advantage that you can cleanly specify the handling priority,
  --> specifically compared to "normal" operations.
  --> 
  --> HTH,
  --> Jan

[Robert McCullough] 
Are you referring to the RTSER_RTIOC_WAIT_EVENT in the serial profile?
If so, this can only be called from a real-time user-space task.
I need to see the event in a non-real-time user-space task.
How would I do this?

Best regards, 
Robert McCullough





^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-04-02 13:29           ` Robert McCullough
@ 2008-04-05 15:41             ` Jan Kiszka
  2008-04-09 18:31               ` Robert McCullough
  0 siblings, 1 reply; 9+ messages in thread
From: Jan Kiszka @ 2008-04-05 15:41 UTC (permalink / raw)
  To: rob; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 5594 bytes --]

Robert McCullough wrote:
> Hi Jan,
> 
>   --> -----Original Message-----
>   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> Sent: Tuesday, April 01, 2008 7:07 PM
>   --> To: rob@domain.hid
>   --> Cc: xenomai@xenomai.org
>   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
>   --> 
>   --> Robert McCullough wrote:
>   --> > Hi Jan,
>   --> >
>   --> >   --> -----Original Message-----
>   --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> >   --> Sent: Friday, March 21, 2008 4:10 PM
>   --> >   --> To: rob@domain.hid
>   --> >   --> Cc: xenomai@xenomai.org
>   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
>   --> Notification
>   --> >   -->
>   --> >   --> Robert McCullough wrote:
>   --> >   --> > Hi Jan,
>   --> >   --> >
>   --> >   --> >   --> -----Original Message-----
>   --> >   --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
>   --> >   --> >   --> Sent: Thursday, March 20, 2008 3:29 PM
>   --> >   --> >   --> To: rob@domain.hid
>   --> >   --> >   --> Cc: xenomai@xenomai.org
>   --> >   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
>   --> >   --> Notification
>   --> >   --> >   -->
>   --> >   --> >   --> Robert McCullough wrote:
>   --> >   --> >   --> > Hi,
>   --> >   --> >   --> >
>   --> >   --> >   --> > How do I signal an asynchronous notification from a
>   --> RTDM
>   --> >   --> real-time
>   --> >   --> >   --> task to a
>   --> >   --> >   --> > non-real-time user-space Linux thread?
>   --> >   --> >   --> > Do I use Non-Real-Time Signaling Services
>   --> >   --> (rtdm_nrtsig_init,..)?
>   --> >   --> >   --> > If so, how?
>   --> >   --> >   --> >
>   --> >   --> >   --> > Here is the current code that I am trying to port to
>   --> RTDM.
>   --> >   --> >   --> >
>   --> >   --> >   --> > Current driver code to signal non-real-time Linux
>   --> thread:
>   --> >   --> >   --> >
>   --> >   --> >   --> > 	// If event
>   --> >   --> >   --> > 	if(event){
>   --> >   --> >   --> > 		// and signal asynchronous readers
>   --> >   --> >   --> > 		if (kmdpr_device->async_queue)
>   --> >   --> >   --> >
>   --> > kill_fasync(&kmdpr_device->async_queue,
>   --> >   --> > SIGIO,
>   --> >   --> >   --> > POLL_IN);
>   --> >   --> >   --> > 	}
>   --> >   --> >   -->
>   --> >   --> >   --> Just push this code in the rtdm_nrtsig handler and
>   --> trigger the
>   --> >   --> handler
>   --> >   --> >   --> execution from RT context.
>   --> >   --> >   -->
>   --> >   --> >   --> Jan
>   --> >   --> >
>   --> >   --> > [Robert McCullough]
>   --> >   --> > Ok, I understand that but how do I specify the file
>   --> operation fasync
>   --> >   --> in my
>   --> >   --> > rtdm_device?  How do I replace or update the code marked
>   --> TODO?
>   --> >   -->
>   --> >   --> In fact, there is no fasync support available with RTDM,
>   --> specifically
>   --> >   --> as
>   --> >   --> using signals under real-time constraints is a bad idea (not
>   --> only
>   --> >   --> because Xenomai has no hard-RT signal support).
>   --> >   -->
>   --> >   --> But before suggesting any alternative pattern: What does your
>   --> >   --> application actually require to work? How does asynchronous
>   --> >   --> driver/application interaction currently look like?
>   --> >   -->
>   --> >   --> Jan
>   --> >
>   --> > [Robert McCullough]
>   --> > Here is a little background on how my driver works.
>   --> > The driver is the interface/control for an AC servo drive which
>   --> controls an
>   --> > AC motor.  The interface to the drive is done through a dual-ported
>   --> RAM.
>   --> > The I/O from the servo drive is updated and an IRQ is triggered from
>   --> the
>   --> > servo drive through the DP RAM to our MPC5200 at a 4 kHz rate.  In
>   --> my IRQ
>   --> > handler I read, process, and update the I/O in the RAM.  Some of the
>   --> data
>   --> > from the servo drive contains status bits that represent
>   --> asynchronous
>   --> > events/faults from the drive that needs to be passed up to the user
>   --> > application.  In my current non-real-time driver I used fasync to
>   --> send a
>   --> > SIGIO signal to the user application whenever one of these
>   --> events/faults
>   --> > changed and then the application would read the status bits with an
>   --> ioctl
>   --> > call and process them.
>   --> >
>   --> > I hope this clarifies the requirements a little.
>   --> > How would you suggest I solve this in my RTDM driver?
>   --> 
>   --> Well, a classic pattern is to encapsulate the async event handling in
>   --> one or more dedicated threads that block-wait on those events. Check
>   --> the
>   --> RTDM profile for serial devices for such a channel. This has the
>   --> advantage that you can cleanly specify the handling priority,
>   --> specifically compared to "normal" operations.
>   --> 
>   --> HTH,
>   --> Jan
> 
> [Robert McCullough] 
> Are you referring to the RTSER_RTIOC_WAIT_EVENT in the serial profile?
> If so, this can only be called from a real-time user-space task.
> I need to see the event in a non-real-time user-space task.
> How would I do this?

Then you can simply built the signaling on top of Linux mechanisms that 
are triggered from the RT domain via a rtdm_nrtsig. You can hook the 
non-RT API into the RTDM device by using *_nrt handlers (e.g. ioctl_nrt).

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 254 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  2008-04-05 15:41             ` Jan Kiszka
@ 2008-04-09 18:31               ` Robert McCullough
  0 siblings, 0 replies; 9+ messages in thread
From: Robert McCullough @ 2008-04-09 18:31 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Hi Jan,

  --> -----Original Message-----
  --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> Sent: Saturday, April 05, 2008 11:42 AM
  --> To: rob@domain.hid
  --> Cc: xenomai@xenomai.org
  --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous Notification
  --> 
  --> Robert McCullough wrote:
  --> > Hi Jan,
  --> >
  --> >   --> -----Original Message-----
  --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> >   --> Sent: Tuesday, April 01, 2008 7:07 PM
  --> >   --> To: rob@domain.hid
  --> >   --> Cc: xenomai@xenomai.org
  --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
  --> Notification
  --> >   -->
  --> >   --> Robert McCullough wrote:
  --> >   --> > Hi Jan,
  --> >   --> >
  --> >   --> >   --> -----Original Message-----
  --> >   --> >   --> From: jan.kiszka@domain.hid [mailto:jan.kiszka@domain.hid]
  --> >   --> >   --> Sent: Friday, March 21, 2008 4:10 PM
  --> >   --> >   --> To: rob@domain.hid
  --> >   --> >   --> Cc: xenomai@xenomai.org
  --> >   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time Asynchronous
  --> >   --> Notification
  --> >   --> >   -->
  --> >   --> >   --> Robert McCullough wrote:
  --> >   --> >   --> > Hi Jan,
  --> >   --> >   --> >
  --> >   --> >   --> >   --> -----Original Message-----
  --> >   --> >   --> >   --> From: jan.kiszka@domain.hid
  --> [mailto:jan.kiszka@domain.hid]
  --> >   --> >   --> >   --> Sent: Thursday, March 20, 2008 3:29 PM
  --> >   --> >   --> >   --> To: rob@domain.hid
  --> >   --> >   --> >   --> Cc: xenomai@xenomai.org
  --> >   --> >   --> >   --> Subject: Re: [Xenomai-help] Non-Real-Time
  --> Asynchronous
  --> >   --> >   --> Notification
  --> >   --> >   --> >   -->
  --> >   --> >   --> >   --> Robert McCullough wrote:
  --> >   --> >   --> >   --> > Hi,
  --> >   --> >   --> >   --> >
  --> >   --> >   --> >   --> > How do I signal an asynchronous notification
  --> from a
  --> >   --> RTDM
  --> >   --> >   --> real-time
  --> >   --> >   --> >   --> task to a
  --> >   --> >   --> >   --> > non-real-time user-space Linux thread?
  --> >   --> >   --> >   --> > Do I use Non-Real-Time Signaling Services
  --> >   --> >   --> (rtdm_nrtsig_init,..)?
  --> >   --> >   --> >   --> > If so, how?
  --> >   --> >   --> >   --> >
  --> >   --> >   --> >   --> > Here is the current code that I am trying to
  --> port to
  --> >   --> RTDM.
  --> >   --> >   --> >   --> >
  --> >   --> >   --> >   --> > Current driver code to signal non-real-time
  --> Linux
  --> >   --> thread:
  --> >   --> >   --> >   --> >
  --> >   --> >   --> >   --> > 	// If event
  --> >   --> >   --> >   --> > 	if(event){
  --> >   --> >   --> >   --> > 		// and signal asynchronous
readers
  --> >   --> >   --> >   --> > 		if
(kmdpr_device->async_queue)
  --> >   --> >   --> >   --> >
  --> >   --> > kill_fasync(&kmdpr_device->async_queue,
  --> >   --> >   --> > SIGIO,
  --> >   --> >   --> >   --> > POLL_IN);
  --> >   --> >   --> >   --> > 	}
  --> >   --> >   --> >   -->
  --> >   --> >   --> >   --> Just push this code in the rtdm_nrtsig handler
  --> and
  --> >   --> trigger the
  --> >   --> >   --> handler
  --> >   --> >   --> >   --> execution from RT context.
  --> >   --> >   --> >   -->
  --> >   --> >   --> >   --> Jan
  --> >   --> >   --> >
  --> >   --> >   --> > [Robert McCullough]
  --> >   --> >   --> > Ok, I understand that but how do I specify the file
  --> >   --> operation fasync
  --> >   --> >   --> in my
  --> >   --> >   --> > rtdm_device?  How do I replace or update the code
  --> marked
  --> >   --> TODO?
  --> >   --> >   -->
  --> >   --> >   --> In fact, there is no fasync support available with
  --> RTDM,
  --> >   --> specifically
  --> >   --> >   --> as
  --> >   --> >   --> using signals under real-time constraints is a bad
  --> idea (not
  --> >   --> only
  --> >   --> >   --> because Xenomai has no hard-RT signal support).
  --> >   --> >   -->
  --> >   --> >   --> But before suggesting any alternative pattern: What
  --> does your
  --> >   --> >   --> application actually require to work? How does
  --> asynchronous
  --> >   --> >   --> driver/application interaction currently look like?
  --> >   --> >   -->
  --> >   --> >   --> Jan
  --> >   --> >
  --> >   --> > [Robert McCullough]
  --> >   --> > Here is a little background on how my driver works.
  --> >   --> > The driver is the interface/control for an AC servo drive
  --> which
  --> >   --> controls an
  --> >   --> > AC motor.  The interface to the drive is done through a
  --> dual-ported
  --> >   --> RAM.
  --> >   --> > The I/O from the servo drive is updated and an IRQ is
  --> triggered from
  --> >   --> the
  --> >   --> > servo drive through the DP RAM to our MPC5200 at a 4 kHz
  --> rate.  In
  --> >   --> my IRQ
  --> >   --> > handler I read, process, and update the I/O in the RAM.
  --> Some of the
  --> >   --> data
  --> >   --> > from the servo drive contains status bits that represent
  --> >   --> asynchronous
  --> >   --> > events/faults from the drive that needs to be passed up to
  --> the user
  --> >   --> > application.  In my current non-real-time driver I used
  --> fasync to
  --> >   --> send a
  --> >   --> > SIGIO signal to the user application whenever one of these
  --> >   --> events/faults
  --> >   --> > changed and then the application would read the status bits
  --> with an
  --> >   --> ioctl
  --> >   --> > call and process them.
  --> >   --> >
  --> >   --> > I hope this clarifies the requirements a little.
  --> >   --> > How would you suggest I solve this in my RTDM driver?
  --> >   -->
  --> >   --> Well, a classic pattern is to encapsulate the async event
  --> handling in
  --> >   --> one or more dedicated threads that block-wait on those events.
  --> Check
  --> >   --> the
  --> >   --> RTDM profile for serial devices for such a channel. This has
  --> the
  --> >   --> advantage that you can cleanly specify the handling priority,
  --> >   --> specifically compared to "normal" operations.
  --> >   -->
  --> >   --> HTH,
  --> >   --> Jan
  --> >
  --> > [Robert McCullough]
  --> > Are you referring to the RTSER_RTIOC_WAIT_EVENT in the serial
  --> profile?
  --> > If so, this can only be called from a real-time user-space task.
  --> > I need to see the event in a non-real-time user-space task.
  --> > How would I do this?
  --> 
  --> Then you can simply built the signaling on top of Linux mechanisms
  --> that
  --> are triggered from the RT domain via a rtdm_nrtsig. You can hook the
  --> non-RT API into the RTDM device by using *_nrt handlers (e.g.
  --> ioctl_nrt).
  --> 
  --> Jan

[Robert McCullough] 

Thanks for your help.  I solved my problem using a dedicated user real-time
task that calls an ioctl and block-wait on the event similar to the
RTSER_RTIOC_WAIT_EVENT in the serial profile that you suggested.  Then when
the event occurs the task unblocks and sends a Linux signal to my
non-real-time user thread.  The Linux signal causes a switch to secondary
mode which is understandable and acceptable.   

Best regards, 
Robert McCullough




^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2008-04-09 18:31 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-19 22:05 [Xenomai-help] Non-Real-Time Asynchronous Notification Robert McCullough
2008-03-20 19:29 ` Jan Kiszka
2008-03-21 14:57   ` Robert McCullough
2008-03-21 20:09     ` Jan Kiszka
2008-03-31 15:22       ` Robert McCullough
2008-04-01 23:07         ` Jan Kiszka
2008-04-02 13:29           ` Robert McCullough
2008-04-05 15:41             ` Jan Kiszka
2008-04-09 18:31               ` Robert McCullough

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.