Quoting Jan Kiszka <[EMAIL PROTECTED]>:
> Antonio, please use a recent Xenomai version (e.g. 2.2.5) to avoid that
> we may hunt old issues.
Ok, could be the right solution.
> Next post a simple demo code to xenomai-help,
> showing the misbehaviour. We could then check if other archs are
> involved, if it's reproducible on further PPC boards, or if some mistake
> might have slipped into the code.
> From your description I wonder if you lock the mutex in line 2 from the
> correct context (a Xenomai thread). If you call that lock from main,
> don't forget to invoke rt_task_shadow first.
A simplified version of the code (in the original code there is an hw DAQ and I
understand that the same code run 2-times, here one could use a buffer to write
for example a u(->for unlocking) and a l(->for locking) ):
/* -- START CODE HERE ---------- demo.c --------------------------------------*/
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <native/task.h>
#include <native/intr.h>
#include <native/mutex.h>
#include <native/sem.h>
#define TASK_PRIO 99
#define TASK_MODE (T_FPU | T_CPU(0))
#define TASK_STKSZ 4096
RT_INTR intr_desc;
RT_TASK task_desc;
RT_MUTEX mutex_desc;
int demo_finalize;
#define INTR_IRQ 76
static irqreturn_t demo_irqhandler(void)
{
rt_mutex_unlock(&mutex_desc); // IPC handling
return RT_INTR_HANDLED;
}
void rt_handler(void *data){
printk(KERN_ERR"entered in RT task\n"); // ok I know is
not right use printk
rt_mutex_lock(&mutex_desc, TM_INFINITE);
for(;;){
rt_mutex_lock(&mutex_desc, TM_INFINITE);
if(demo_finalize == 1)
break;
/* doing something */
}
return;
}
static int demo_init(void)
{
int result;
// initialize MUTEX
int err;
err = rt_mutex_create(&mutex_desc, "demo_mutex");
printk(KERN_ERR"mutex created and locked\n");
demo_finalize = 0;
// create the real-time task waiting for data
err = rt_task_create(&task_desc, "demo_acq", TASK_STKSZ, TASK_PRIO,
TASK_MODE);
if (!err) {
rt_task_start(&task_desc, &rt_handler, NULL);
printk(KERN_ERR"RT task started!\n");
} else
printk(KERN_ERR"can't start RT thread!!!\n");
result = rt_intr_create(&intr_desc, "demo_intr", INTR_IRQ,
demo_irqhandler, 0,
0);
return (0);
}
static void demo_exit(void)
{
rt_intr_delete(&intr_desc);
demo_finalize = 1;
rt_mutex_unlock(&mutex_desc);
rt_task_delete(&task_desc);
printk(KERN_ERR"demo: RT task destroyed\n");
return;
}
module_init(demo_init);
module_exit(demo_exit);
/* --- END CODE HERE ---------------------------------------------------------*/
With this code and Xenomai 2.2.0 you lose the machine control... I resolve this
using semaphores.
regards,
Antonio
PS. excuse me, was my error... replay to all, ok! Thanks!
_______________________________________________
Adeos-main mailing list
[email protected]
https://mail.gna.org/listinfo/adeos-main