heise online | · | c't | · | iX | · | Technology Review | · | Telepolis | · | mobil | · | Security | · | Netze | · | heise open | · | heise resale | · | Autos | · | c't-TV | · | Jobs | · | Kiosk

Aktuelles Heft #### Support Hotline & FAQ Tipps & Tricks Treiber & BIOS Firmenkontakte #### Download Software zu c't Software-Verzeichnis c't-Projekte Testbilder & Vorlagen #### Service Tipp-Datenbank c't-CD-Register Internettarife Telefontarife Virenschutz #### Magazin Heftarchiv c't specials English Pages Benchmarks Red. Stuff Leserforum c't-Bildmotive URLs aus c't Schlagseite #### Aktionen Browsercheck Krypto-Kampagne Schulen ans Netz Netz gegen Kinderporno TV/Radio-Termine #### Info Abo & Heft Veranstaltungen Mediadaten Kontakt Impressum Kleinanzeigen und Veranstaltungen
| c't Projekte - c't-Bot und c't-Sim - Mailinglisten ## c't-Bot und c't-Sim [Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)] [Nach Datum][Nach Thread] ### RE: [ct-bot]Patch für Fehler in delay-Funktion Absender: Jörg Schüler-Maroldt Datum: Mo, 18.09.2006 15:21:58
    Hallo,

    die delay-Funktion im ct-Bot funktioniert so nicht sauber.
    Der Fehler liegt in der timer.c / timer.h
    Der Aufruf von timer_get_ms() und timer_get_s() nacheinander kann immer
    durch einen Interrupt unterbrochen werden und beim Überlauf von time_ms
    Differenzen von einer
    Sekunde hervorrufen.
    Es müßte deshalb eine Funtion geben die ms und s zusammen zurückliefert.

    timer_get_time(uint16 *pSec, uint16 * pmSec, uint16 *puSec);

    Was ihr eigentlich wollt ist jedoch folgendes:

    // Global
    volatile uint16 time_ms_tick;

    //Private
    static volatile uint16 time_micro_s;

    // Timer Interrupt
    void system_time_isr(void)
    {
    	// Disable Interrupt
    	time_micro_s += TIMER_STEPS;	/* Mikrosekundentimer erhoehen */
    	if (time_micro_s >= 1000)
    	{					/* Eine Mikrosekunde verstrichen? */
    		time_ms_tick++;
    		time_micro_s -= 1000;
    	}
    	// enable Interrupt
    }

    // Delay in ms
    void delay(uint16 ms)
    {

    	uint t1=time_ms_tick;
    	while ((time_ms_tick - t1) < ms)
    	{
    		asm volatile("nop");
    	}
    }

    Der Zugriff auf eine 16-Bit Variable (time_ms_tick) kann nicht unterbrochen
    werden,
    da es sich nur um eine Assembler-Anweisung handelt.
    Für größere Zeiten als 65s sollte man eine 32-Bit Variable verwenden, muß
    jedoch den Zugriff synchronisieren.
    Bei 32-Bit Prozessoren (PC) geht`s natürlich ohne.

    Falls der "time_ms_tick" überläuft rechnet die Delay-Funtion trotzdem
    richtig.
    Die "uint16 timer_get_ms_since(uint16 old_s, uint16 old_ms )"
    ist damit hinfällig, da Sie die gleichen Probleme hat.

    Die Zeitanzeige ist mit:
    {
    	uint16 tNow=time_ms_tick;
    	printf("%d.%d s",tNow/1000,tNow%1000);
    }

    auch kein Problem, läuft jedoch nach 65s über.

    Für genauere Auflosungen benötigt man evtl. auch noch "time_us_tick"

    Ein Problem ist jedoch die Änderung der ct-Bot Software.
    Ich würde vorschlagen als erstes die time_ms_tick Variable in timer.c
    einzubauen
    und delay() richtig zu implementieren.

    timer_get_ms_since() usw. kann man dann für veraltet zu erklären und den
    Code bereinigen.

    Den Patch für den Code könnte ich machen, falls diese Begründung
    einleuchtend ist.

    Gruß
      Jörg Schüler-Maroldt
Antworten: RE: [ct-bot]Patch für Fehler in delay-Funktion From: Timo Sandmann Voriger (Datum): [ct-bot] IRC-Chat umgezogen, Benjamin Benz Nächster (Datum): RE: [ct-bot]Patch für Fehler in delay-Funktion, Timo Sandmann Voriger (Thread): [ct-bot] IRC-Chat umgezogen, Benjamin Benz Nächster (Thread): RE: [ct-bot]Patch für Fehler in delay-Funktion, Timo Sandmann Indizes: Datum Thread |

Copyright © 2007 Heise Zeitschriften Verlag | Kritik, Anregungen bitte an c't-WWW | Datenschutzhinweis Impressum