- From: L.C. Karssen <l.c.karssen_at_phys.uu.nl>
- Date: Mon, 21 May 2007 16:30:30 +0000
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
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Received on 2007-05-21Z15:30:30