master/master.c
changeset 106 d6679c77ad3f
parent 104 052bc82d5442
child 109 c6766baead5e
equal deleted inserted replaced
105:fad6709a526f 106:d6679c77ad3f
    98         kfree(domain);
    98         kfree(domain);
    99     }
    99     }
   100 
   100 
   101     master->command_index = 0;
   101     master->command_index = 0;
   102     master->debug_level = 0;
   102     master->debug_level = 0;
       
   103     master->timeout = 100; // us
   103     master->stats.timeouts = 0;
   104     master->stats.timeouts = 0;
   104     master->stats.delayed = 0;
   105     master->stats.delayed = 0;
   105     master->stats.corrupted = 0;
   106     master->stats.corrupted = 0;
   106     master->stats.unmatched = 0;
   107     master->stats.unmatched = 0;
   107     master->stats.t_last = 0;
   108     master->stats.t_last = 0;
   855 
   856 
   856     // Rahmen senden
   857     // Rahmen senden
   857     ec_master_send_commands(master);
   858     ec_master_send_commands(master);
   858 
   859 
   859     t_start = get_cycles(); // Sendezeit nehmen
   860     t_start = get_cycles(); // Sendezeit nehmen
   860     t_timeout = 100 * cpu_khz / 1000; // 100us
   861     t_timeout = master->timeout * cpu_khz / 1000;
   861 
   862 
   862     do {
   863     do {
   863         ec_device_call_isr(master->device);
   864         ec_device_call_isr(master->device);
   864 
   865 
   865         t_end = get_cycles(); // Aktuelle Zeit nehmen
   866         t_end = get_cycles(); // Aktuelle Zeit nehmen
   958 }
   959 }
   959 
   960 
   960 /*****************************************************************************/
   961 /*****************************************************************************/
   961 
   962 
   962 /**
   963 /**
       
   964    Bereitet Synchronen Datenverkehr vor.
       
   965 
       
   966    Fürgt einmal die Kommandos aller Domains zur Warteschlange hinzu, sendet
       
   967    diese ab und wartet so lange, bis diese anschließend problemlos empfangen
       
   968    werden können.
       
   969 */
       
   970 
       
   971 void ecrt_master_prepare_async_io(ec_master_t *master)
       
   972 {
       
   973     ec_domain_t *domain;
       
   974     cycles_t t_start, t_end, t_timeout;
       
   975 
       
   976     // Alle empfangenen Kommandos aus der Liste entfernen
       
   977     list_for_each_entry(domain, &master->domains, list)
       
   978         ecrt_domain_queue(domain);
       
   979 
       
   980     ecrt_master_async_send(master);
       
   981 
       
   982     t_start = get_cycles(); // Sendezeit nehmen
       
   983     t_timeout = master->timeout * cpu_khz / 1000;
       
   984 
       
   985     // Aktiv warten!
       
   986     do {
       
   987         t_end = get_cycles();
       
   988     }
       
   989     while (t_end - t_start < t_timeout);
       
   990 }
       
   991 
       
   992 /*****************************************************************************/
       
   993 
       
   994 /**
   963    Setzt die Debug-Ebene des Masters.
   995    Setzt die Debug-Ebene des Masters.
   964 
   996 
   965    Folgende Debug-Level sind definiert:
   997    Folgende Debug-Level sind definiert:
   966 
   998 
   967    - 1: Nur Positionsmarken in bestimmten Funktionen
   999    - 1: Nur Positionsmarken in bestimmten Funktionen