Hello again.
I traced the errors down and now dicovered that calling printf (as it would
be) turns a real time task in a non real time one. so I chaged the code and it
is almost working as expected, except for something that now seens to be some
kind of bug. If I use any sord of rtdm_event_[timed,]wait, the app returns and
there is a trace on kernel about a null pointer, just after the call to wait.
It seens similar with
<http://www.mail-archive.com/[email protected]/msg04427.html>
And I there is no other references on google. So I will try to recompile with
some changes and maybe test with another kernel. Hope you can point something
I am running in a AMD Athlon(tm) 64 X2 Dual Core Processor 4000+, kernel
2.6.38-8, ubuntu natty 11.04 and latest stable xenomai source.
If it will help, I can send the code.
Thanks.
--
Carlos Novaes.
Em qua 10 ago 2011, às 16:57:57, Carlos Eduardo de Brito Novaes escreveu:
> Sorry, the timer questio is solved, its a wrong call to unix ioctl instead
> of real time version from xenomai. By now I can initialize and even fire
> events, start the app again and again and also load/unload/reload the
> module without errors. The only problem seens to be related with the line
> ret = rtdm_event_timedwait(&ctx->RtdmReadyEvent,2000000000, &timeout_seq);
> on the read operation. If I uncomment it the first call to read will hang
> the entire CPU. I also changed it to include an timeout sequence with no
> sucess. By now, it seens that I have misundertood something. Maybe someone
> can poit it out.
>
> Thanks
>
> --
> Carlos Novaes.
>
> Em qua 10 ago 2011, às 14:49:53, Carlos Eduardo de Brito Novaes escreveu:
> > Hello to all,
> >
> > I am learning how to use rtdm_timer and also rtdm_event to use on
> > acquisition board. The board itself has a FIFO and can be configurated do
> > fill it in a predefined time. The problem is that there is no interrupt
> > generated when the FIFO is full or on a given number of samples, so I
> > have to poll the data.
> >
> > As the conversion time is know (based on board latency, conversion time
> > and number os channels to scan), a better approach would be let the
> > board do its conversion and at given times, where the data should be
> > ready on FIFO (and also, the FIFO is far large than the amount of data
> > retrieved) and then, get it, setup a new delay based on the estimated
> > remaining data for the next scan, fire an event to unblock an read
> > operation and loop the entire proccess again...
> > Also, there is an user space real time application that will open the
> > rtdm device, issue some configurations via ioctl and loop reading the
> > device.
> >
> > The code specific to timming is working almost as good, I can see the app
> > returning a increasing counter by the time it is running. The only issue
> > is that the CPU hangs if I try to remove the module or run the app one
> > second time (or if I close and then reopen the device)
> > Any call to configure the rtdm_event will hang the CPU.
> >
> > Hope you can give some appointments or tell me what I am doing wrong.
> > Here is the relevant sections of code, only code specific to xenomai and
> > related with the issues.
> >
> > --- For the app
> > int main(int argc, char **argv)
> > {
> >
> > int device;
> > int ret;
> > int32_t sample_number;
> >
> > ret = mlockall(MCL_CURRENT | MCL_FUTURE);...
> > ret = rt_task_shadow(&rt_task_desc, NULL, 1, 0);...
> >
> > sample_number = 0;
> > //Open
> > device = rt_dev_open(DEVICE_NAME, 0);....
> >
> > // IOCTL Start
> > ret = rt_dev_ioctl(device, 0x07);...
> >
> > sleep(3);
> > // Read
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > sleep(3);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > sleep(3);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> > sleep(2);
> > ret = rt_dev_read (device, &sample_number, sizeof(sample_number));
> > printf("Read %d. Sample %d\n", ret, sample_number);
> >
> > // IOCTL Stop
> >
> > ret = ioctl(device, 0x08);...
> >
> > /* close the device */
> > ret = rt_dev_close(device);...
> > return 0;
> >
> > }
> >
> > ---
> >
> > --- For the Driver
> > ...
> > static struct rtdm_device RtdmDevice = {
> >
> > .struct_version = RTDM_DEVICE_STRUCT_VER,
> > .device_flags = RTDM_NAMED_DEVICE,
> > .context_size = 0,
> > .device_name = DEVICE_NAME,
> >
> > .open_nrt = pci18xx_rtdm_open,
> > .open_rt = pci18xx_rtdm_open,
> >
> >
> > .ops = {
> >
> > .close_nrt = pci18xx_rtdm_close,
> > .close_rt = pci18xx_rtdm_close,
> > .read_rt = pci18xx_rtdm_read_rt,
> > .read_nrt = pci18xx_rtdm_read_rt,
> > .write_rt = pci18xx_rtdm_write_rt,
> > .ioctl_rt = pci18xx_rtdm_ioctl_nrt,
> > .ioctl_nrt = pci18xx_rtdm_ioctl_nrt,
> >
> > },
> >
> > .device_class = RTDM_CLASS_EXPERIMENTAL,
> > .device_sub_class = SOME_SUB_CLASS,
> > .profile_version = 1,
> > .driver_name = DRIVER_NAME,
> > .driver_version = RTDM_DRIVER_VER(0, 1, 2),
> > .peripheral_name = "Icpdas Daq18xx Board",
> > .provider_name = "Carlos Novaes",
> > .proc_name = RtdmDevice.device_name,
> > .device_id = -1,
> >
> > };...
> > ...
> > static int pci18xx_rtdm_ioctl_nrt(struct rtdm_dev_context
> > *context, rtdm_user_info_t *user_info, unsigned int request, void __user
> > *arg) {
> >
> > pci18xx_context_t *ctx;
> > int err;
> >
> > err = 0;
> > rtdm_printk("IOCTL Device NRT. Request = %d\n", request);
> >
> > ctx = (pci18xx_context_t *)context->dev_private;
> > switch (request){
> >
> > case IOCTL_START:
> > err = pci18xx_start(context, ctx, user_info, arg);
> > break;
> >
> > case IOCTL_STOP:
> > err = pci18xx_stop(ctx, user_info, arg);
> > break;
> >
> > default:
> > return PCI18XX_E_INVALID_IOCTL;
> >
> > }
> > return PCI18XX_OK;
> >
> > };...
> > ...
> > static ssize_t pci18xx_rtdm_read_rt(struct rtdm_dev_context
> > *context, rtdm_user_info_t * user_info, void *buf, size_t nbyte){
> >
> > int16_t size;
> > int32_t value;
> > int err;
> >
> > pci18xx_context_t *ctx;
> > // following line fails
> > //err = rtdm_event_timedwait(&ctx->RtdmReadyEvent,2000000000, NULL);
> >
> > ctx = (pci18xx_context_t *) context->dev_private;
> > size=sizeof(ctx->SampleNumber);
> >
> > if (rtdm_safe_copy_to_user(user_info, buf, &(ctx->SampleNumber),
> >
> > size)){... return size;
> > };...
> > ...
> > static int pci18xx_start(struct rtdm_dev_context *context,
> > pci18xx_context_t *ctx, rtdm_user_info_t *user_info, void __user *arg){
> >
> > rtdm_timer_init(&ctx->RtdmTimer, pci18xx_timer_proc, context->device-
> > >
> > >device_name);
> > >
> > // following line fail
> > //rtdm_event_init(&ctx->RtdmReadyEvent, 0);
> > ctx->Running=1;
> > ctx->SampleNumber=0;
> > ctx->time = rtdm_clock_read_monotonic();
> > ctx->time += 1000000000;
> > rtdm_timer_start(&ctx->RtdmTimer, ctx->time, 0,
> > RTDM_TIMERMODE_ABSOLUTE); return 0;
> >
> > };
> > static int pci18xx_stop(pci18xx_context_t *ctx,
> > rtdm_user_info_t *user_info, void __user *arg){
> >
> > rtdm_printk("stop function\n");
> > if (ctx->Running){
> >
> > ctx->Running=0;
> > // following line fail
> > //rtdm_event_destroy(&ctx->RtdmReadyEvent);
> > rtdm_timer_destroy(&ctx->RtdmTimer);
> >
> > }
> > return 0;
> >
> > };
> > static void pci18xx_timer_proc(rtdm_timer_t *timer){
> >
> > pci18xx_context_t *ctx;
> > int err;
> > ctx = container_of(timer, pci18xx_context_t, RtdmTimer);
> > ctx->SampleNumber++;
> > ctx->time += 1000000000;
> > err = rtdm_timer_start_in_handler(&ctx->RtdmTimer, ctx->time, 0,
> >
> > RTDM_TIMERMODE_ABSOLUTE);
> >
> > // following line fail
> > //rtdm_event_pulse(&ctx->RtdmReadyEvent);
> >
> > };
> > ---
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help