examples/rtai/rtai_sample.c
changeset 1500 ed1a733efbc5
parent 1363 11c0b2caa253
child 1508 60a116ed3897
--- a/examples/rtai/rtai_sample.c	Fri Jul 10 10:40:05 2009 +0000
+++ b/examples/rtai/rtai_sample.c	Mon Jul 13 15:18:28 2009 +0000
@@ -59,7 +59,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 = {};
@@ -146,9 +145,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);
@@ -164,9 +163,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);
@@ -184,9 +183,9 @@
 {
     ec_slave_config_state_t s;
 
-    spin_lock(&master_lock);
+    rt_sem_wait(&master_sem);
     ecrt_slave_config_state(sc_ana_in, &s);
-    spin_unlock(&master_lock);
+    rt_sem_signal(&master_sem);
 
     if (s.al_state != sc_ana_in_state.al_state)
         printk(KERN_INFO PFX "AnaIn: State 0x%02X.\n", s.al_state);
@@ -244,21 +243,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,6 @@
 
     t_critical = cpu_khz * 1000 / FREQUENCY - cpu_khz * INHIBIT_TIME / 1000;
 
-
     master = ecrt_request_master(0);
     if (IS_ERR(master)) {
         ret = PTR_ERR(master); 
@@ -285,7 +288,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))) {