Jeff Webb wrote:
> Unfortunately, I get the same results with this patch applied.  I 
> haven't been able to isolate the problem yet.  I did discover that 
> putting in a clock_nanosleep call at certain points in my simulation 
> loop allowed the loop to execute to completion without any FPU errors.  
> Maybe this is a clue...  I do still get an FPU error message at some 
> point after the main simulation loop is done, though.

Okay...  I have found a simple example that exhibits the problem on my
linux-2.4 system (see attached).  I am running xenomai 2.2.2 with the two RTAI
FIFO patches (and the latest FPU-related patch).  I get two unresolved
math-related symbols when I try to insert this module on my FC5 2.6 machine,
so I can't comment on the linux-2.6 behavior at this time.  But that's a
puzzle for another day...

When I insert the attached module, I get the following kernel log output:

Sep 15 17:30:08 kernel: fptest_init
Sep 15 17:30:08 kernel: rtf_create returned: 1
Sep 15 17:30:08 kernel: invalid use of FPU in Xenomai context at [f1f410a4]
Sep 15 17:30:08 kernel: Xenomai: suspending kernel thread efe22d30
('efe22d30') at 0xf1f410a4 after exception #7
Sep 15 17:30:08 kernel: spawned task

Removing the module yields:

Sep 15 17:30:13 kernel: fptest_cleanup
Sep 15 17:30:13 kernel: rtf_destroy returned: 0
Sep 15 17:30:13 kernel: f = 1

If I change the rtf_put command to output 500 bytes instead of 5000, the
program works as expected:

Sep 15 17:29:54 simhost kernel: fptest_init
Sep 15 17:29:54 simhost kernel: rtf_create returned: 1
Sep 15 17:29:54 simhost kernel: loop 0, f=1
Sep 15 17:29:54 simhost kernel: spawned task
Sep 15 17:29:55 simhost kernel: loop 1, f=2
Sep 15 17:29:56 simhost kernel: loop 2, f=3
Sep 15 17:29:57 simhost kernel: loop 3, f=4
Sep 15 17:29:58 simhost kernel: loop 4, f=5
Sep 15 17:29:59 simhost kernel: loop 5, f=6
Sep 15 17:30:00 simhost kernel: fptest_cleanup
Sep 15 17:30:00 simhost kernel: rtf_destroy returned: 0
Sep 15 17:30:00 simhost kernel: f = 6

Does this mean there is some FPU-related problem in the RTAI FIFO code?

Thanks,

Jeff


-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

/* Linux kernel includes */
#include <linux/module.h>

/* Xenomai includes */
#include <pthread.h>
#include <time.h>
#include <rtai/fifo.h>

/* RTAI FIFO numbers /dev/rtf? */
#define FIFO1 3

/* Global variables */
pthread_t fptest_task = NULL;
double f = 0.0;

/* Real-time task */
void * fptest_routine (void *cookie)
{  
  struct timespec dt_ts;

  int i;
  char c[6000];

  for (i=0; i<101; i++)
    {
      /* Do a floating point calclation */
      f = f * 1.0 + 1.1;

      /* Stuff some (garbage) data in a FIFO */
      rtf_put(FIFO1, c, 5000);

      /* Print message to the kernel log */
      if (i % 1 == 0)
	{
	  printk("loop %d, f=%d\n", i, (int)f);
	}

      /* Sleep for 1 second */
      dt_ts.tv_sec  = 1;
      dt_ts.tv_nsec = 0;      
      clock_nanosleep(CLOCK_REALTIME, 0, &dt_ts, NULL);
    };

  return NULL;
}

static int fptest_init(void)
{
  int err;
  pthread_attr_t attr;
 
  printk("fptest_init\n");

  /* Create an FIFO */
  err = rtf_create(FIFO1, 1024*1024*1);
  printk("rtf_create returned: %d\n", err);
  if (err < 0)
    {
      printk("could not create FIFO\n");
      return -1;
    }

  /* Create a real-time task */
  pthread_attr_init(&attr);
  pthread_attr_setfp_np(&attr, 1);
  err = pthread_create(&fptest_task, &attr, &fptest_routine, NULL);
  if (err)
    {
      printk("could not create thread (error code: %d)\n", err);
      err = rtf_destroy(FIFO1);
      printk("rtf_destroy returned: %d\n", err);
      return -1;
    }
  else
    {
      printk("spawned task\n");
    };

  return 0;
}

static void fptest_cleanup(void)
{
  int err;

  printk("fptest_cleanup\n");
  
  /* Shut down the real-time thread */
  pthread_cancel (fptest_task);
  pthread_join (fptest_task, NULL);  

  /* Destroy the fifo */
  err = rtf_destroy(FIFO1);
  printk("rtf_destroy returned: %d\n", err);

  /* Print the floating point result */
  printk("f = %d\n", (int)f);  
}

module_init(fptest_init);
module_exit(fptest_cleanup);


_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to