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