--- 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))) {