examples/dc_rtai/dc_rtai_sample.c
changeset 1500 ed1a733efbc5
parent 1466 362147819ca1
child 1508 60a116ed3897
--- a/examples/dc_rtai/dc_rtai_sample.c	Fri Jul 10 10:40:05 2009 +0000
+++ b/examples/dc_rtai/dc_rtai_sample.c	Mon Jul 13 15:18:28 2009 +0000
@@ -58,7 +58,6 @@
 // EtherCAT
 static ec_master_t *master = NULL;
 static ec_master_state_t master_state = {};
-spinlock_t master_lock = SPIN_LOCK_UNLOCKED;
 
 static ec_domain_t *domain1 = NULL;
 static ec_domain_state_t domain1_state = {};
@@ -125,9 +124,9 @@
 {
     ec_domain_state_t ds;
 
-    spin_lock(&master_lock);
+    rt_sem_wait(&master_sem);
     ecrt_domain_state(domain1, &ds);
-    spin_unlock(&master_lock);
+    rt_sem_signal(&master_sem);
 
     if (ds.working_counter != domain1_state.working_counter)
         printk(KERN_INFO PFX "Domain1: WC %u.\n", ds.working_counter);
@@ -143,9 +142,9 @@
 {
     ec_master_state_t ms;
 
-    spin_lock(&master_lock);
+    rt_sem_wait(&master_sem);
     ecrt_master_state(master, &ms);
-    spin_unlock(&master_lock);
+    rt_sem_signal(&master_sem);
 
     if (ms.slaves_responding != master_state.slaves_responding)
         printk(KERN_INFO PFX "%u slave(s).\n", ms.slaves_responding);
@@ -239,21 +238,26 @@
 
 /*****************************************************************************/
 
-int request_lock(void *data)
+void send_callback(ec_master_t *master)
 {
     // too close to the next real time cycle: deny access...
-    if (get_cycles() - t_last_cycle > t_critical) return -1;
-
-    // allow access
-    rt_sem_wait(&master_sem);
-    return 0;
-}
-
-/*****************************************************************************/
-
-void release_lock(void *data)
-{
-    rt_sem_signal(&master_sem);
+    if (get_cycles() - t_last_cycle <= t_critical) {
+        rt_sem_wait(&master_sem);
+        ecrt_master_send_ext(master);
+        rt_sem_signal(&master_sem);
+    }
+}
+
+/*****************************************************************************/
+
+void receive_callback(ec_master_t *master)
+{
+    // 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(master);
+        rt_sem_signal(&master_sem);
+    }
 }
 
 /*****************************************************************************/
@@ -277,7 +281,7 @@
         goto out_return;
     }
 
-    ecrt_master_callbacks(master, request_lock, release_lock, NULL);
+    ecrt_master_callbacks(master, send_callback, receive_callback);
 
     printk(KERN_INFO PFX "Registering domain...\n");
     if (!(domain1 = ecrt_master_create_domain(master))) {