Hallo Ich muss in meinem µc Programm ( in C ) 125ms wartem. In einem Fachbuch wurde das mit einer for Schleife gelöst. z.B. for(x=0; x<525000 ; x++) Wie kommt man auf diese Zahl 525000? Ist das richtig: Wartezeit/ CPU takt? Muss man da noch etwas anderes beachten , weil die Zahlen stimmen bei den Beispielen nicht überein z.B. 525000 für 1sek 20000 für 10ms (müsste doch eigentlich 5250 sein ?)
"In einem Fachbuch wurde das mit einer for Schleife gelöst." Sowas gehört im Fachbuch maximal in das Kapitel "Schlechte Beispiele, und wie man es nicht machen sollte" "Wie kommt man auf diese Zahl 525000? " Der Fachbuch-Schreiber hat es ausprobiert oder das Orakel von Delphi um eine konkrete Berechnung der compilierten Schleifendurchlaufzeiten gebeten "Ist das richtig: Wartezeit/ CPU takt?" multipliziert mit (Summe aller Takte aller benötigten Assemblerbefehle, um Schleifenrumf und Schleifenkopf darzustellen) "Muss man da noch etwas anderes beachten" Sicherlich. Dies erklärt auch den beschriebenen Effekt
Du musst entschuldigen, der Herr Wegstabenverbuchsler hat seine ersten Gehversuche in Sachen µC gleich mit Timer-Interrupts incl. Stackmanagement gemacht...;]
@Meiomei: Die ersten Gehversuche macht man gefälligst in Assembler, denn sonst lernt man die Möglichkeiten der I/O-Features nie kennen, da man so mit der Hochsprache beschäftigt ist, dass man nicht mehr in das Datenblatt schaut. ...
Ja, das hilft unserem Anfänger sicher weiter, aber vielleicht kann er ja die Hochsprache und ist nicht nur mit ihr beschäftigt .. Das mit der Schleife kann man machen. Das Problem in C ist, daß man allerdings dazu in den erzeugten Assemblercode schauen muß, da man ja nicht genau weiß was der Compiler aus der "for" Schleife gemacht hat. Die Schleife besteht aus mehreren Assemblerinstruktionen. Dazu kommt die Initialisierung der Schleife die je nach Größe der Zahlen auch unterschiedlich ausfallen muß. Die Gesamtzeit setzt sich also zusammen aus Initialisierung (konstant bei gleichem Integertyp) und der Zeit in der Schleife. Daher die Unterschiede bei 10ms und 1s. Eine elegantere Möglichkeit ist einen Timer zu starten. Hierbei läßt sich die Zeit sehr genau einstellen. Mal ins Datenblatt schauen. Gruß Reiner
@Reiner: So in etwa meinte ich das, du hast es allerdings diplomatischer formuliert. Ohne ASM-Kenntnisse nutzt (beim AVR, nicht beim PC) die beste Hochsprache nix. Leider meinen Viele, sich durch den Einsatz einer Hochsprache vor dem Erlernen von ASM drücken zu können. "Takte zählen" geht aber nur in ASM korrekt. Ich bevorzuge aber Timer. Meist in Form eines ständig durchlaufenden Timers mit zyklischem Interrupt, in dessen ISR die gesamte Synchronisation des Programms stattfindet (auch Software-Timer für längere Verzögerungen). Oft ist man sich aber auch beim Programmierstil selbst im Weg. Die Aussage: "Eine bestimmte Zeit warten" erwartet, dass man das Programm an dieser Stelle blockiert. Natürlich auch für andere Aufgaben (Erweiterungen). Stattdessen würde ich lieber formulieren: "Eine bestimmte Zeit diesen Programmteil nicht abarbeiten". Dann kann man wenigstens während der "Wartezeit" andere Dinge erledigen und blockiert nicht das ganze Programm. Somit haben sich "Warteschleifen" erübrigt. Sowas braucht man nur im Spezialfall für extrem kurze Verzögerungen (z.B. bei OWI). ...
@Hannes, Ich gebe Dir ja recht. Aber das Problem für einen Anfänger stellt sich nun erst mal auf dieser Ebene. Ich kenne nicht sehr viel Literatur wo man für den Anfang Softwarearchitektur für Mikrocontrolleranwendungen einfach dargestellt nachlesen kann. Techniken wie präventives oder kooperatives Multitasking, ISRs, Scheduler etc. kommen später. @Anfänger Ich empfehle dringendst, nach einem Compilerlauf mal das erzeugte Assemblerlisting anzusehen. Man versteht dann leichter was da eigentlich passiert und lernt nebenher auch noch ein bißchen Assembler. Konkret zu Deiner Frage: Schau dir mal die Assemblerbehlstabelle im Datenblatt des entsprechenden Prozessors an. Da steht wieviel Taktschritte ein Befehl braucht. Schreib' die Anzahl der Schritte neben die entsprechenden Assemblerbefehle, addiere dann die Werte und multipliziere mit der Taktzeit (1/fosz). Das Ergebnis ist die Zeit. Gruß Reiner
@Meiomei @Reiner Nee, sicherlich hab ich meine ersten Brems-Schleifen auch so programmiert. Was ich (möglicherweise undiplomatisch oder nicht ganz so direkt) aussagen wollte war genau das, was Reiner und HanneS so schön prosaisch ausgeführt haben. In ein FACHBUCH gehört sicherlich nicht unbedingt als nachahmenswert hinein "for(x=0; x<525000 ; x++)", ohne nähere Erläuterung des Prozessors, der Taktrate und der Erklärung, wie der Autor denn nun auf 52500 kommt. Der nächste der so ein "Fachwissen" ernst nimmt und programmiert, kommt garantiert NICHT auf 1 Sekunde Wartezeit. Wenn da schon im FACHBUCH auf C im Mikroprozessor-Umfeld hingewiesen wird, ohne Bezug zu irgendwelchen Prozessoren etc, dann kann auch auf einen (möglicherweise nicht vorhandenen) Bibliotheks-Funktions-Aufruf "wait(ms)" verwiesen werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.