Hi Philippe,
I am including some code below that will produce the problem I am seeing. I
must be missing something because if remove the force to primary mode in the
function task_procedure the signal will not be caught. This tells me that
without the rt_task_set_mode the task is starting off in secondary mode.
//------ Start
#include <signal.h>
#include <sys/mman.h>
#include <inttypes.h>
#include <native/task.h>
#include <native/queue.h>
typedef struct {
uint8_t data[1024];
} __attribute__((packed)) some_data;
void task_procedure(void *arg)
{
RT_QUEUE *msq_q = (RT_QUEUE *)arg;
rt_task_set_mode(0, T_PRIMARY | T_WARNSW, NULL);
some_data data;
rt_queue_read( msq_q, &data, sizeof ( some_data ), TM_NONBLOCK);
}
void signal_handler(int sig)
{
if (sig == SIGXCPU)
printf("---!! uh oh, switched to secondary mode !!--\n");
}
int main(int argc, char *argv[])
{
RT_QUEUE msg_q;
RT_TASK msg_task;
mlockall(MCL_CURRENT | MCL_FUTURE);
rt_task_set_mode(0, T_PRIMARY | T_WARNSW, NULL);
signal(SIGXCPU, signal_handler);
rt_queue_create( &msg_q, "phil_test", sizeof(some_data), Q_UNLIMITED,
Q_FIFO | Q_SHARED );
rt_task_create(&msg_task, NULL, 0, 5, T_FPU | T_JOINABLE);
rt_task_start(&msg_task, &task_procedure, &msg_q );
rt_task_join( &msg_task );
rt_task_delete( &msg_task );
rt_queue_delete( &msg_q );
return 0;
}
//-------- END
----- Original Message -----
From: Philippe Gerum <[EMAIL PROTECTED]>
Date: Friday, October 20, 2006 2:59 pm
Subject: Re: [Xenomai-help] rt_queue_read switch to secondary mode
> On Fri, 2006-10-20 at 14:50 -0600, Sunny Bhuller wrote:
> > Hello,
> > I am new to xenomai and was having a problem with the
> rt_queue_read call. I am creating a new RT_TASK from my main
> program with:
> >
> > rt_task_create(&task, NULL, 0 /* default stack size */, 5 /*
> priority */, T_FPU | T_JOINABLE);
> >
> > Once the task has started I switch it to primary mode with:
> >
> > rt_task_set_mode(0, T_PRIMARY | T_WARNSW, NULL);
>
> Forcing to primary is useless, every real-time task starts in primary
> mode, regardless of the relevant skin.
>
> >
> > Now if I call the rt_queue_read I catch the signal that
> specifies the system has switched to secondary mode. Is there
> something fundamentally wrong with what I am doing? I can post a
> more detailed explanation if required, thanks!
> >
>
> There is no reason for rt_queue_read() to move the thread to secondary
> mode. You should try running the app over GDB, and inspect the
> backtracewhen the signal is received; you might discover that some
> other code
> does cause this, or you might discover that we indeed have a bug
> hidingsomewhere. Posting a simple but complete test code that
> reproduces the
> issue unambiguously would help too.
>
> > -- Sunny
> >
> >
> >
> > _______________________________________________
> > Xenomai-help mailing list
> > [email protected]
> > https://mail.gna.org/listinfo/xenomai-help
> --
> Philippe.
>
>
>
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help