diff -r af21f0bdc7c9 -r 2b9c78543663 examples/rtai/rtai_sample.c --- a/examples/rtai/rtai_sample.c Thu Sep 06 14:21:02 2012 +0200 +++ b/examples/rtai/rtai_sample.c Mon Nov 03 15:20:05 2014 +0100 @@ -234,8 +234,8 @@ rt_sem_wait(&master_sem); ecrt_domain_queue(domain1); + ecrt_master_send(master); rt_sem_signal(&master_sem); - ecrt_master_send(master); rt_task_wait_period(); } @@ -243,18 +243,30 @@ /*****************************************************************************/ -void request_lock_callback(void *cb_data) +void send_callback(void *cb_data) { ec_master_t *m = (ec_master_t *) cb_data; - rt_sem_wait(&master_sem); -} - -/*****************************************************************************/ - -void release_lock_callback(void *cb_data) + + // too close to the next real time cycle: deny access... + if (get_cycles() - t_last_cycle <= t_critical) { + rt_sem_wait(&master_sem); + ecrt_master_send_ext(m); + rt_sem_signal(&master_sem); + } +} + +/*****************************************************************************/ + +void receive_callback(void *cb_data) { ec_master_t *m = (ec_master_t *) cb_data; - rt_sem_signal(&master_sem); + + // too close to the next real time cycle: deny access... + if (get_cycles() - t_last_cycle <= t_critical) { + rt_sem_wait(&master_sem); + ecrt_master_receive(m); + rt_sem_signal(&master_sem); + } } /*****************************************************************************/ @@ -275,12 +287,12 @@ master = ecrt_request_master(0); if (!master) { - ret = -EBUSY; + ret = -EBUSY; printk(KERN_ERR PFX "Requesting master 0 failed!\n"); goto out_return; } - ecrt_master_callbacks(master, request_lock_callback, release_lock_callback, master); + ecrt_master_callbacks(master, send_callback, receive_callback, master); printk(KERN_INFO PFX "Registering domain...\n"); if (!(domain1 = ecrt_master_create_domain(master))) {