Hello,

I work on a MPC8347 processor and I found out a problem with
rtdm_event_wait(). I reproduce the problem with a simple code :

*driver.c* :
#include <rtdm/rtdm_driver.h>

MODULE_AUTHOR("P.Martignoni");
MODULE_LICENSE("GPL");

#define DEV_FILE_NAME       "DspDev"
#define DRV_NAME            "DspDrv"

#define DEV_FILE_DSP            "dspdev0"

static rtdm_event_t s_ReadEvent;

static int Open(struct rtdm_dev_context    *p_Context,
                rtdm_user_info_t           *p_UserInfo,
                int                        Oflags)
{
    int ret = 0;

    rtdm_event_init(&s_ReadEvent,0);

    // generates an error : Oops : Kernel access of bad area, sig : 11 [#1]
    rtdm_event_wait(&s_ReadEvent);


    return ret;

}

static int Close(struct rtdm_dev_context   *p_Context,
                 rtdm_user_info_t          *p_UserInfo)
{

    rtdm_event_destroy(&s_ReadEvent);

    return 0;
}

/*****************************************************/
/*               Structures rtdm_device              */
/*****************************************************/
static struct rtdm_device t_IdspDevice = {
    struct_version:     RTDM_DEVICE_STRUCT_VER,
    device_flags:       RTDM_NAMED_DEVICE,
    context_size:       0,
    device_name:        DEV_FILE_DSP,

    open_rt:        NULL,
    open_nrt:       Open,

    ops:{
        close_rt:   NULL,
        close_nrt:  Close,
        ioctl_rt:   NULL,
        ioctl_nrt:  NULL,
        read_rt:    NULL,
        read_nrt:   NULL,
        write_rt:   NULL,
        write_rt:   NULL,
        recvmsg_rt: NULL,
        recvmsg_nrt:NULL,
        sendmsg_rt: NULL,
        sendmsg_nrt:NULL,
    },
    device_class:       RTDM_CLASS_EXPERIMENTAL,
    device_sub_class:   222,
    driver_name:        DRV_NAME,
    peripheral_name:    DEV_FILE_NAME,
    provider_name:      "-",
    proc_name:          t_IdspDevice.device_name,
};

/**************************************/
/*          Init Driver               */
/**************************************/
static int ddsp_Init(void)
{

    if(rtdm_dev_register(&t_IdspDevice)!=0)
        rtdm_printk("Enregistrement impossible\n");
    else
        rtdm_printk("Initialisation OK\n");

    return 0;
}

/*************************************/
/*           Exit Driver             */
/*************************************/
static void ddsp_Exit(void)
{

    if(rtdm_dev_unregister(&t_IdspDevice,0))
        rtdm_printk("Desabonnement KO\n");
    else
        rtdm_printk("Desabonnement OK\n");
}

module_init(ddsp_Init);
module_exit(ddsp_Exit);

*App.c* :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/mman.h>
#include <native/task.h>

#define DEV_FILE_DSP            "dspdev0"
#define TASK_PRIO             50

static RT_TASK s_TaskTest;

int main(int argc, char * argv[])
{
    int ret = 0;

    mlockall(MCL_CURRENT | MCL_FUTURE);

    // set the currrent task in rt mode
    ret = rt_task_shadow(&s_TaskTest,NULL,1,0);

    rt_dev_open(DEV_FILE_DSP, 0);

    return ret;
}

When I launch this code, I have this error : *Oops : Kernel access of bad
area, sig 11 [#1]

*I notice that if the rtdm_event_wait() is called in a kernel task, there is
no problem.

Have you any idea for my issue ?

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

Reply via email to