Volle22 schrieb:
> Axel S. schrieb:
>> Zeitverzögerung mit busy waiting kann man machen.
>
> machen aber nur Anfänger die das auch bleiben wollen.
> Es ist die schlechteste aller Möglichkeiten.
Bei einer Display-Initialisierung oder anderen "Blocking" Tasks ist das
durchaus legitim, deswegen frage ich ja auch. Mit nem Timer kann ich
es auch, keine Frage ;)
Eigentlich könnte ich es auch bei der Initialisierung nutzen, denn da
brauche ich den Timer sowieso (noch) nicht für andere Tasks.
Die Frage ist jedoch von ganz allgemeinem Interesse: Wie mache ich
später, bei anderen Programmen kurze Delays (us-Bereich), z.b. wenn ich
VGA/Video-Timings erzeuge? Genau da nutzt man üblicherweise
Busy-Waiting-Delays.
Axel S. schrieb:
> Zeitverzögerung mit busy waiting kann man machen. Aber natürlich
> muß man
> dann die Taktfrequenz berücksichtigen und die innere Schleife schreibt
> man besser in inline Assembler, damit es unabhängig vom Compiler wird.
> Für kurze Delays (wenige µs) sollte es dann besser ein Makro sein. Schau
> dir die delay-Funktionen aus der AVR-libc an. Die funktionieren, also
> kann das Design nicht ganz falsch sein.
Du meinst, die gesamte innere Schleife? Also auch mit bedingtem Sprung,
usw..?
Das wäre eine Idee, wenn der Compiler dann von der Optimierung dieses
Inline-ASM Teils absehen würde. SDCC unterstützt auch eine "Peephole
ASM" Optimierung - ob der Inline-Teil dann unangetastet bleibt, weiss
ich nicht. Alle bisherigen Beispiele hatten als Inline-ASM nur "NOP",
der Rest war in C.
In ASM ist es machbar, allerdings kenne ich mich mit der
STM8-Architektur nicht gut genug aus, ich weiss nicht, wie sich die
Pipeline, Wait sates etc... auswirken um das zyklengenau zu bekommen.
Einzige Alternative wäre an einem Portpin zu messen - ich würde es aber
gerne verstehen. Beim PIC ist es einfach: 4 Quarztakte normal, 4*2
Quarztakte bei Sprung
Im STM8 CPU Manual sieht man die Problematik:
http://www.st.com/content/ccc/resource/technical/document/programming_manual/43/24/13/9a/89/df/45/ed/CD00161709.pdf/files/CD00161709.pdf/jcr:content/translations/en.CD00161709.pdf
Die Zyklenzahl hängt ab ob aus dem Flash/RAM abgearbeitet wird, sie
hängt von der Länge des Instruction Words ab (Prefetch-Buffer 96 Bit)
usw... - es ist also relativ komplex, ähnlich wie bei 16/32-Bittern.