--- a/master/master.c Fri Mar 17 15:18:13 2006 +0000
+++ b/master/master.c Fri Mar 17 16:25:02 2006 +0000
@@ -100,6 +100,7 @@
master->command_index = 0;
master->debug_level = 0;
+ master->timeout = 100; // us
master->stats.timeouts = 0;
master->stats.delayed = 0;
master->stats.corrupted = 0;
@@ -857,7 +858,7 @@
ec_master_send_commands(master);
t_start = get_cycles(); // Sendezeit nehmen
- t_timeout = 100 * cpu_khz / 1000; // 100us
+ t_timeout = master->timeout * cpu_khz / 1000;
do {
ec_device_call_isr(master->device);
@@ -960,6 +961,37 @@
/*****************************************************************************/
/**
+ Bereitet Synchronen Datenverkehr vor.
+
+ Fürgt einmal die Kommandos aller Domains zur Warteschlange hinzu, sendet
+ diese ab und wartet so lange, bis diese anschließend problemlos empfangen
+ werden können.
+*/
+
+void ecrt_master_prepare_async_io(ec_master_t *master)
+{
+ ec_domain_t *domain;
+ cycles_t t_start, t_end, t_timeout;
+
+ // Alle empfangenen Kommandos aus der Liste entfernen
+ list_for_each_entry(domain, &master->domains, list)
+ ecrt_domain_queue(domain);
+
+ ecrt_master_async_send(master);
+
+ t_start = get_cycles(); // Sendezeit nehmen
+ t_timeout = master->timeout * cpu_khz / 1000;
+
+ // Aktiv warten!
+ do {
+ t_end = get_cycles();
+ }
+ while (t_end - t_start < t_timeout);
+}
+
+/*****************************************************************************/
+
+/**
Setzt die Debug-Ebene des Masters.
Folgende Debug-Level sind definiert: