diff -r 5461fce4a2ea -r ed1a733efbc5 examples/rtai/rtai_sample.c --- 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))) {