Re: RTAI and comedi: leaving real time?

On Mon, 2007-05-21 at 19:52 +0200, Paolo Mantegazza wrote:
> L.C. Karssen wrote:
> > On Mon, 2007-05-21 at 09:42 +0000, L.C. Karssen wrote:
> > 
> >>On Sun, 2007-05-13 at 23:37 +0200, Paolo Mantegazza wrote:
> >>
> >>>L.C. Karssen writes: 
> >>>
> >>>
> >>>>Hi list, 
> >>>>
> >>>>Excuse me for sending this message to both the Comedi and the RTAI list,
> >>>>but I'm not sure where the problem is. 
> >>>>
> >>>>I'm trying to control an NI-DAQ PCI-6024E card with comedi and RTAI. 
> >>>>I'm running RTAI in periodic mode. 
> >>
> Comedi_dio_bitfield is in the list of the defined Comedi functions 
> supported in user space by RTAI.
> 
> Just put an iopl(3) in you program and report the outcome. 
I now have this for-loop in my hard RT function:

for (i=0; i<options->n_rows; i++)
{
	iopl(3);
	rt_task_wait_period();
}

And I get another 156 (= n_rows) syscalls.

> It should be 
> rendundant as RTAI cares of it already but let's have a further check at 
> it too. Did you installed the RTAI comedi module?
Yes. This is the output of lsmod (regarding comedi and rtai):

Module                  Size  Used by
rtai_comedi             4608  0 
ni_pcimio              52992  0 
8255                    4992  1 ni_pcimio
ni_tio                 16640  1 ni_pcimio
mite                    8964  2 ni_pcimio,ni_tio
comedi_fc               2944  1 ni_pcimio
kcomedilib             13184  1 rtai_comedi
comedi                 36256  6
ni_pcimio,8255,ni_tio,mite,comedi_fc,kcomedilib
rtai_shm                9472  1 rtai_comedi
rtai_sem               17792  1 rtai_comedi
rtai_fifos             27852  0 
rtai_lxrt              83352  6
rtai_comedi,ni_pcimio,kcomedilib,rtai_shm,rtai_sem,rtai_fifos
rtai_hal               34000  11
rtai_comedi,ni_pcimio,ni_tio,mite,comedi_fc,kcomedilib,comedi,rtai_shm,rtai_sem,rtai_fifos,rtai_lxrt


Furthermore, I looked at rtai_comedi_dioout.c from RTAILab and found
that it includes rtai_comedi.h. I have the following RTAI and comedi
related includes:
#include "/usr/local/include/comedilib.h"
#include <rtai_lxrt.h>

I included rtai_comedi.h but that resulted in a lot of errors because of
overshadowed definitions (because of comedilib.h). When only including
rtai_comedi.h I get a lot of syntax errors. I'm going to check why that
happens.

Thanks,

Lennart
> 
> Paolo
> 
> > 
> > 
> >>Any help is appreciated!
> >>
> >>
> >>Lennart.
> >>
> >>
> >>int do_comedi(struct data_struct *options)
> >>{
> >>    comedi_t *comedi_dev = options->device;
> >>    unsigned int ao_subdev  = options->AO_subdevice;  // Analog Output
> >>    unsigned int dio_subdev = options-> DIO_subdevice; // Digital IO
> >>    int range=0; // AO has only one range: 10V -> -10V
> >>    comedi_insn insn;
> >>    lsampl_t data;
> >>    unsigned int dio_bits;
> >>    int aref = AREF_GROUND;
> >>    unsigned int dio_mask = 0xFFFFFFFF; // Tells which DIO bits are to
> >>be flipped (all).
> >>
> >>    int period;
> >>    struct bits *data_arr = options->bitsarr;
> >>    
> >>    RT_TASK* task;
> >>    int priority=0;
> >>    int stack_size=4096;
> >>    int msg_size=0;
> >>    
> >>    int i;
> >>
> >>    /* Prepare the AO instruction as much as possible. Later, in real
> >>time
> >>     *  we'll only fill in the data sample. */
> >>    insn.insn = INSN_WRITE;
> >>    insn.n = 1;
> >>    insn.subdev = ao_subdev;
> >>
> >>    /* A better scheduler than linux' one */
> >>    struct sched_param mysched;
> >>    
> >>    /* We don't want to be swapped out the mem */
> >>    mlockall (MCL_CURRENT | MCL_FUTURE);
> >>    /* Allow nonroot users hard realtime access */
> >>    rt_allow_nonroot_hrt();
> >>
> >>    /* Initialise Scheduler as SCHED_FIFO. Greatly improves scheduler!
> >>*/ 
> >>    mysched.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1;
> >>    if( sched_setscheduler( 0, SCHED_FIFO, &mysched ) == -1 ) 
> >>    {
> >>	fprintf(stderr, "Error in setting the Scheduler!\n");
> >>	exit(1);
> >>    }
> >>    
> >>    /* Register this thread as a RT task. As long as it's
> >>       not switched to hard_real_time, it's still a normal process and
> >>       can do all normal things */
> >>    task = rt_task_init(nam2num("do_comedi"), priority, stack_size,
> >>msg_size);
> >>
> >>    // Set mode to periodic. Other option is 'oneshot'
> >>    rt_set_periodic_mode();
> >>    period = (int) nano2count((RTIME)options->period*1000);
> >>
> >>    start_rt_timer(period);
> >>
> >>    // Switch to hard realtime mode
> >>    rt_make_hard_real_time();
> >>
> >>    // Start scheduler 
> >>    rt_task_make_periodic(task, rt_get_time() + period, period);
> >>    
> >>    
> >>    for (i=0; i<options->n_rows; i++)
> >>    {
> >>	
> >>	/* Prepare and write digital data. */
> >>	dio_bits = data_arr[i].DIO;
> >>	comedi_dio_bitfield(comedi_dev, dio_subdev, dio_mask, &dio_bits);
> >>
> >>	/* Prepare and write AO data */
> >>	data = data_arr[i].AO0;
> >>	insn.data = &data;
> >>	insn.chanspec = CR_PACK(0, range, aref);
> >>	if(comedi_do_insn(comedi_dev, &insn)<0)
> >>	{
> >>	    comedi_perror("/dev/comedi0");
> >>	    exit(1);
> >>	}
> >>
> >>	data = data_arr[i].AO1;
> >>	insn.data = &data;
> >>	insn.chanspec = CR_PACK(1, range, aref);
> >>	if(comedi_do_insn(comedi_dev, &insn)<0)
> >>	{
> >>	    comedi_perror("/dev/comedi0");
> >>	    exit(1);
> >>	}
> >>	rt_task_wait_period();
> >>    }
> >>
> >>    rt_make_soft_real_time();
> >>
> >>#ifdef DEBUG
> >>    printf("We're back in soft realtime.\n");
> >>#endif
> >>    
> >>    // Stop timer
> >>    stop_rt_timer();
> >>
> >>    // Unregister RT task
> >>    rt_task_delete(task);
> >>
> >>    // Unlock mem
> >>    munlockall();
> >>
> >>    return 0;
> >>}
> >>
> >>
> >>
> >>>Paolo. 
> >>>
> >>>
> >>>>Lennart.
> >>>>-- 
> >>>>*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
> >>>>L.C. Karssen
> >>>>Department of Physics and Astronomy
> >>>>Faculty of Science
> >>>>Utrecht University
> >>>>Princetonplein 1
> >>>>3584 CC  Utrecht
> >>>>The Netherlands 
> >>>>
> >>>>tel.: +31 (0)30-253-2208
> >>>>fax.: +31 (0)30-253-7468
> >>>>e-mail: L.C.Karssen_at_phys.uu.nl
> >>>>www: http://www1.phys.uu.nl/wwwaoud
> >>>>-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 
> >>>>
> >>>>
> >>>>_______________________________________________
> >>>>RTAI mailing list
> >>>>RTAI_at_rtai.org
> >>>>https://mail.rtai.org/cgi-bin/mailman/listinfo/rtai
> >>>
> >>> 
> 
-- 
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
L.C. Karssen
Department of Physics and Astronomy
Faculty of Science
Utrecht University
Princetonplein 1
3584 CC  Utrecht
The Netherlands

tel.: +31 (0)30-253-2208
fax.: +31 (0)30-253-7468
e-mail: L.C.Karssen_at_phys.uu.nl
www: http://www1.phys.uu.nl/wwwaoud
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-


_______________________________________________
RTAI mailing list
RTAI_at_rtai.org
https://mail.rtai.org/cgi-bin/mailman/listinfo/rtai

Received on 2007-05-21Z15:30:30