--- a/master/master.c Thu Nov 23 20:19:26 2006 +0000
+++ b/master/master.c Fri Nov 24 11:02:35 2006 +0000
@@ -129,7 +129,6 @@
master->debug_level = 0;
master->stats.timeouts = 0;
- master->stats.starved = 0;
master->stats.corrupted = 0;
master->stats.skipped = 0;
master->stats.unmatched = 0;
@@ -711,11 +710,6 @@
master->stats.timeouts == 1 ? "" : "s");
master->stats.timeouts = 0;
}
- if (master->stats.starved) {
- EC_WARN("%i datagram%s STARVED!\n", master->stats.starved,
- master->stats.starved == 1 ? "" : "s");
- master->stats.starved = 0;
- }
if (master->stats.corrupted) {
EC_WARN("%i frame%s CORRUPTED!\n", master->stats.corrupted,
master->stats.corrupted == 1 ? "" : "s");
@@ -1272,6 +1266,36 @@
return -1;
}
+/*****************************************************************************/
+
+/**
+ Prepares synchronous IO.
+ Queues all domain datagrams and sends them. Then waits a certain time, so
+ that ecrt_master_receive() can be called securely.
+*/
+
+void ec_master_prepare(ec_master_t *master /**< EtherCAT master */)
+{
+ ec_domain_t *domain;
+ cycles_t cycles_start, cycles_end, cycles_timeout;
+
+ // queue datagrams of all domains
+ list_for_each_entry(domain, &master->domains, list)
+ ecrt_domain_queue(domain);
+
+ ecrt_master_send(master);
+
+ cycles_start = get_cycles();
+ cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
+
+ // active waiting
+ while (1) {
+ udelay(100);
+ cycles_end = get_cycles();
+ if (cycles_end - cycles_start >= cycles_timeout) break;
+ }
+}
+
/******************************************************************************
* Realtime interface
*****************************************************************************/
@@ -1354,26 +1378,14 @@
}
}
+ ec_master_prepare(master); // prepare asynchronous IO
+
return 0;
}
/*****************************************************************************/
/**
- Resets all slaves to INIT state.
- This method is deprecated and will disappear in the next version
- of the realtime interface. The functionality is moved to
- ecrt_master_release().
- \ingroup RealtimeInterface
-*/
-
-void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */)
-{
-}
-
-/*****************************************************************************/
-
-/**
Sends queued datagrams and waits for their reception.
*/
@@ -1445,59 +1457,15 @@
// dequeue all datagrams that timed out
list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
- switch (datagram->state) {
- case EC_DATAGRAM_QUEUED:
- if (master->device->cycles_isr
- - datagram->cycles_queued > cycles_timeout) {
- list_del_init(&datagram->queue);
- datagram->state = EC_DATAGRAM_TIMED_OUT;
- master->stats.starved++;
- ec_master_output_stats(master);
- }
- break;
- case EC_DATAGRAM_SENT:
- if (master->device->cycles_isr
- - datagram->cycles_sent > cycles_timeout) {
- list_del_init(&datagram->queue);
- datagram->state = EC_DATAGRAM_TIMED_OUT;
- master->stats.timeouts++;
- ec_master_output_stats(master);
- }
- break;
- default:
- break;
- }
- }
-}
-
-/*****************************************************************************/
-
-/**
- Prepares synchronous IO.
- Queues all domain datagrams and sends them. Then waits a certain time, so
- that ecrt_master_receive() can be called securely.
- \ingroup RealtimeInterface
-*/
-
-void ecrt_master_prepare(ec_master_t *master /**< EtherCAT master */)
-{
- ec_domain_t *domain;
- cycles_t cycles_start, cycles_end, cycles_timeout;
-
- // queue datagrams of all domains
- list_for_each_entry(domain, &master->domains, list)
- ec_domain_queue_datagrams(domain);
-
- ecrt_master_send(master);
-
- cycles_start = get_cycles();
- cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
-
- // active waiting
- while (1) {
- udelay(100);
- cycles_end = get_cycles();
- if (cycles_end - cycles_start >= cycles_timeout) break;
+ if (datagram->state != EC_DATAGRAM_SENT) continue;
+
+ if (master->device->cycles_isr - datagram->cycles_sent
+ > cycles_timeout) {
+ list_del_init(&datagram->queue);
+ datagram->state = EC_DATAGRAM_TIMED_OUT;
+ master->stats.timeouts++;
+ ec_master_output_stats(master);
+ }
}
}
@@ -1651,8 +1619,6 @@
EXPORT_SYMBOL(ecrt_master_create_domain);
EXPORT_SYMBOL(ecrt_master_activate);
-EXPORT_SYMBOL(ecrt_master_deactivate);
-EXPORT_SYMBOL(ecrt_master_prepare);
EXPORT_SYMBOL(ecrt_master_send);
EXPORT_SYMBOL(ecrt_master_receive);
EXPORT_SYMBOL(ecrt_master_run);