diff -r 178b1b43a88c -r 88c597598bbc master/master.c --- 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);