[Date Prev][Date Next] [Chronological] [Thread] [Top]

[rtl] write on pipe is crashing



----- Forwarded message from Olaf Petzold -----

>From owner-rtl@rtlinux.cs.nmt.edu Tue Jun  1 12:35 MET 1999
Received: from rtlinux.cs.nmt.edu (rtlinux.cs.nmt.edu [129.138.6.62])
	by csmd2.cs.uni-magdeburg.de (8.9.1a/8.9.1) with ESMTP id MAA08881
	for <petzold@prinz-atm.CS.Uni-Magdeburg.De>; Tue, 1 Jun 1999 12:35:48 +0200 (MET DST)
Received: from localhost (mail@localhost)
	by rtlinux.cs.nmt.edu (8.8.7/8.8.7) with SMTP id EAA14783;
	Tue, 1 Jun 1999 04:29:24 -0600
Received: by rtlinux.cs.nmt.edu (bulk_mailer v1.12); Tue, 1 Jun 1999 04:28:57 -0600
Received: (from majordom@localhost)
	by rtlinux.cs.nmt.edu (8.8.7/8.8.7) id EAA14764
	for rtl-outgoing; Tue, 1 Jun 1999 04:28:56 -0600
X-Authentication-Warning: rtlinux.cs.nmt.edu: majordom set sender to owner-rtl@rtlinux.cs.nmt.edu using -f
From: Olaf Petzold <petzold@mail.CS.Uni-Magdeburg.De>
Date: Tue, 1 Jun 1999 12:31:50 +0200 (MESZ)
Message-Id: <199906011031.MAA02650@csmd1.cs.UNI-Magdeburg.DE>
Sender: owner-rtl@rtlinux.cs.nmt.edu
To: undisclosed-recipients:;
Content-Type: text
Content-Length:  3461

Hallo,

I have a problem using pipes. Inside user-space I'm using 
the function fCliOnOff to start selected tasks. If I use:

  msg.task = ((1<<TASK1) | (1<<TASK2));

all things are going on. If I use:

  msg.task = ((1<<TASK1) | (1<<TASK2) | (1<<TASK3));

I will get a segmentation fault. The values of msg.task
are the right one (3 for the first case and 7 for the
second). The problem is the "write" function - this will
crash. I never got the COMMAND_TASK_START inside the
rt-process for the last case. Why is this and how can
I correct my code to going on working?

The structure MY_COMMAND I'm using for shared-memory 
commands as well but, this should not be the reason.


----------------- common.h ------------------------
#define COMMAND_TASK_START   (1<<0)
#define COMMAND_TASK_ON      (1<<1)
...
#define TASK1    0x00
#define TASK2    0x01
#define TASK3    0x02
#define TASKS    3

#define CTRL_FIFO 0
#define CTRL_FIFO_SIZE 1024

#define RT_TASK_STACK_SIZE 1024
#define RT_TASK_PRIORITY   1

static RT_TASK tasks[TASKS];
...

---------------- commands.c -----------------------
...
typedef struct 
{
  unsigned int inuse;
  unsigned int task;
  unsigned int command;
  unsigned int command_number;
  int arg1;
  int arg2;
} MY_COMMAND;


extern int ctrlfd; /* fd from Ctrl FIFO, opened in app.c
		    ... ctrlfd = open("/dev/rtf0", O_WRONLY)... */

...

int fCliTaskOnOff()
{
  /* Ctrl-Pipe */
  MY_COMMAND msg;

  msg.command = COMMAND_TASK_START;
  msg.task = ((1<<TASK1) | (1<<TASK2) | (1<<TASK3));

  if (write(ctrlfd, &msg, sizeof(msg)) < 0) {
    fprintf(stderr, "Can't send a command to Control-FIFO (%s)", 
	    strerror(errno));
    exit(errno);
  }
  
  return(0);
}
...

----------------- rt_process.c ----------------
static void fController(int task_no)
{
  ...
}

int fTaskHandler(unsigned int fifo)
{
 MY_COMMAND msg;
  int err;
  register int task_no;
  RTIME now;

  while ((err=rtf_get(fifo, &msg, sizeof(msg))) > 0) {
    switch (msg.command) {
      case COMMAND_TASK_START:
	for(task_no=TASK1; task_no<TASKS; task_no++) {
	  if((1 << task_no) & msg.task) {
	    rt_task_make_periodic(&tasks[task_no],  /* RT_TASK */ 
				  rt_get_time(),    /* Now! */
				  MUSECS_TO_RTIME(RT_TASK_CYCLE_TIME));
	  }
	} 
	break;
	
      case COMMAND_TASK_ON:
        ...
	  rt_task_wakeup(&tasks[task_no]);
	...
	break;

      case COMMAND_TASK_OFF:
        ...
	  rt_task_suspend(&tasks[task_no);
	...
	break;

      case COMMAND_TASK_PERIOD:
	...
	  now = rt_get_time();
	  rt_task_make_periodic(&tasks[task_no] now, msg.arg1);
	...
	break;

      default:
	return -EINVAL;
    }
  }

  ...
}
  
int init_module(void)
{
  register int task_no;

  ...
  for(task_no=TASK1; task_no<TASKS; task_no++) {
     ...
    /* initialize task code */
    rt_task_init(&tasks[task_no],	  /* RT_TASK */
		 fController,	          /* task code function */
		 task_no,		  /* startup arg to task code */
		 RT_TASK_STACK_SIZE,      /* task stack size */
		 RT_TASK_PRIORITY);       /* priority */
    
    /* use fp */
    rt_task_use_fp(&tasks[task_no], 1);
  }
  ...
  rtf_create(CTRL_FIFO, CTRL_FIFO_SIZE);
  rtf_create_handler(CTRL_FIFO, &fTaskHandler);

  return 0;
}

void cleanup_module(void)
{
  ...
}

--- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail majordomo@rtlinux.cs.nmt.edu OR
echo "unsubscribe rtl <Your_email>" | mail majordomo@rtlinux.cs.nmt.edu
----
For more information on Real-Time Linux see:
http://www.rtlinux.org/~rtlinux/

----- End of forwarded message from Olaf Petzold -----
--- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail majordomo@rtlinux.cs.nmt.edu OR
echo "unsubscribe rtl <Your_email>" | mail majordomo@rtlinux.cs.nmt.edu
----
For more information on Real-Time Linux see:
http://www.rtlinux.org/~rtlinux/