ecrt_master_prepare_async_io() hinzugef?gt.
--- a/include/ecrt.h Fri Mar 17 15:18:13 2006 +0000
+++ b/include/ecrt.h Fri Mar 17 16:25:02 2006 +0000
@@ -49,6 +49,7 @@
void ecrt_master_sync_io(ec_master_t *master);
void ecrt_master_async_send(ec_master_t *master);
void ecrt_master_async_receive(ec_master_t *master);
+void ecrt_master_prepare_async_io(ec_master_t *master);
void ecrt_master_debug(ec_master_t *master, int level);
void ecrt_master_print(const ec_master_t *master);
int ecrt_master_sdo_write(ec_master_t *master,
--- 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:
--- a/master/master.h Fri Mar 17 15:18:13 2006 +0000
+++ b/master/master.h Fri Mar 17 16:25:02 2006 +0000
@@ -52,6 +52,7 @@
struct list_head domains; /**< Liste der Prozessdatendomänen */
int debug_level; /**< Debug-Level im Master-Code */
ec_stats_t stats; /**< Rahmen-Statistiken */
+ unsigned int timeout; /**< Timeout für synchronen Datenaustausch */
};
/*****************************************************************************/
--- a/mini/mini.c Fri Mar 17 15:18:13 2006 +0000
+++ b/mini/mini.c Fri Mar 17 16:25:02 2006 +0000
@@ -14,7 +14,7 @@
#include "../include/ecrt.h" // Echtzeitschnittstelle
-//#define ASYNC
+#define ASYNC
/*****************************************************************************/
@@ -115,9 +115,8 @@
}
#ifdef ASYNC
- ecrt_domain_queue(domain1);
- ecrt_master_async_send(master);
- udelay(100);
+ // Einmal senden und warten...
+ ecrt_master_prepare_async_io(master);
#endif
printk("Starting cyclic sample thread.\n");
--- a/rt/msr_module.c Fri Mar 17 15:18:13 2006 +0000
+++ b/rt/msr_module.c Fri Mar 17 16:25:02 2006 +0000
@@ -37,7 +37,7 @@
// EtherCAT
#include "../include/ecrt.h"
-//#define ASYNC
+#define ASYNC
// Defines/Makros
#define HZREDUCTION (MSR_ABTASTFREQUENZ / HZ)
@@ -229,10 +229,8 @@
#endif
#ifdef ASYNC
- ecrt_domain_queue(domain1);
- ecrt_domain_queue(domain2);
- ecrt_master_async_send(master);
- udelay(100);
+ // Einmal senden und warten...
+ ecrt_master_prepare_async_io(master);
#endif
ipipe_init_attr(&attr);