--- a/examples/dc_rtai/dc_rtai_sample.c Thu Sep 06 14:21:02 2012 +0200
+++ b/examples/dc_rtai/dc_rtai_sample.c Mon Nov 03 15:20:05 2014 +0100
@@ -220,7 +220,7 @@
tv.tv_sec++;
}
ecrt_master_application_time(master, EC_TIMEVAL2NANO(tv));
-
+
if (sync_ref_counter) {
sync_ref_counter--;
} else {
@@ -229,8 +229,8 @@
}
ecrt_master_sync_slave_clocks(master);
ecrt_domain_queue(domain1);
+ ecrt_master_send(master);
rt_sem_signal(&master_sem);
- ecrt_master_send(master);
rt_task_wait_period();
}
@@ -238,18 +238,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);
+ }
}
/*****************************************************************************/
@@ -268,12 +280,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))) {