On 04/23/2012 01:56 PM, Andrey Nechypurenko wrote: > Hi Folks, > > Following my tests with PWM generation using GPIO in user space [1], > I've made the RTDM module [2] to further reduce the jitter. As a > result, jitter was improved, but still under heavy system load the > servo motor I am trying to control starts shaking. Now, I fill stuck > and hope to get some help here. > > At one hand, I can not imaging that 800MHz ARM (BeagleBoard xM) could > not manage to generate 20mS PWMs from RTDM driver precise enough to > avoid sporadic servo movements. So probably I am doing something > wrong. On the other hand, I do not see where the possible mistake can > happen and hope that someone experienced in with Xenomai could help. > > There is an article about observed behavior [3] with more details, but > the core problem, I guess, boils down to the following code fragment: > > void pwm_task_proc(void *arg) { > const int which = (int)arg; > > // Toggling GPIO pin > for(;;) { > //set_data_out has offset 0x94 . Set gpio pin to 1 (up) > iowrite32(0x40000000, gpio + 0x6094); > > // wait requested pulse width time (duty) > if(0 != rtdm_task_sleep(up_period[which])) > rtdm_printk("PWM: rtdm_task_sleep() returns error\n"); > > //clear_data_out has offset 0x90 . Set gpio pin to 0 (down) > iowrite32(0x40000000, gpio + 0x6090); > > // wait until the next pulse should start (20mS interval) > if(0 != rtdm_task_wait_period()) > rtdm_printk("PWM: rtdm_task_wait_period() returns error\n"); > } > > This is the function running as a periodic task started with the following > call: > > retval = rtdm_task_init(&pwm_task[i], // there is currently only one > element in this array > "pwm-task", > pwm_task_proc, > 0, > RTDM_TASK_HIGHEST_PRIORITY, > 20000000); // 20ms period
Do not use a thread, use a timer. -- Gilles. _______________________________________________ Xenomai-help mailing list Xenomai-help@gna.org https://mail.gna.org/listinfo/xenomai-help