www.mikrocontroller.net

Forum: GCC Schnelligkeit, Interrupt oder While()

Autor: Hsus (Gast)
Datum: 06.05.2008 19:56

Hallo,

eine Frage... was ist schneller, I²C Kommunikation mit Interrupt zu
steuern, oder eine while() Schleife einbauen, die den Interrupt-Flag
testet?

Danke!
Autor: Sven Pauli (haku) Benutzerseite
Datum: 06.05.2008 19:59

Meistens der Interrupt. Da entfällt nämlich das Rumgepolle und
rumgespringe.
Autor: Johannes M. (johnny-m)
Datum: 06.05.2008 20:01

Busy-Wait ist fast immer zumindest ein paar Takte schneller als
Interrupt-Bearbeitung. Mit welcher affenartigen Geschwindigkeit läuft
bei Dir denn die Übertragung, wenn es auf die paar Takte ankommt?
Autor: Johannes M. (johnny-m)
Datum: 06.05.2008 20:05

Sven Pauli wrote:
> Meistens der Interrupt. Da entfällt nämlich das Rumgepolle und
> rumgespringe.
Nö, gerade nicht. Ein Interrupt beim AVR (da kein konkreter
Controllertyp genannt wurde, gehe ich mal von AVR aus...) hat allein
hardwaremäßig für Ein- und Rücksprung schon einen Bedarf von 8
CPU-Takten (PC sichern, Flag löschen und in Vektor springen und am Ende
das ganze retour, je 4 Takte), dazu kommt bei
Hochsprachen-Programmierung generell noch der Sprung aus der
Vektortabelle in die ISR (2 oder 3 Takte, je nach Flash-Größe) plus
Sichern und Rückschreiben von SREG (je 3 Takte). Das ist die
Minimal-Latenz, wenn der Compiler nicht noch andere Register sichern
muss. Ein einfaches Pollen ist da deutlich schneller...
Autor: Bernhard R. (barnyhh)
Datum: 07.05.2008 09:50

Eine kleine Rechnung: Bei einer Übertragungsgeschwindigkeit von 400
kBit/s benötigt das Übertragen eines Bytes ca. 250 Mikrosekunden. Bei
einem angenommenen Processor-Takt von 10 MHz - wenn wesentlich
langsamer, dann macht nämlich TWI nicht mehr mit - sind das 2500
Processor-Clocks pro übertragenem Byte. Was soll diese
"Mikrometerschrauben-Optimierung" denn bringen?

meint
Bernhard
Autor: Hsus (Gast)
Datum: 07.05.2008 09:54

Danke! Warum dauert denn meine Übertragung von 64 Bytes von einem
Mikrocontroller zum anderen Mikrocontroller über TWI 140ms ???

Warum solange?

TWI läuft mit 300kHz. Ich benutze Atmega644 mit 16MHz Quarz.
Autor: Rolf Magnus (Gast)
Datum: 07.05.2008 10:29

> Ein Interrupt beim AVR (da kein konkreter Controllertyp genannt wurde,
> gehe ich mal von AVR aus...) hat allein hardwaremäßig für Ein- und
> Rücksprung schon einen Bedarf von 8 CPU-Takten (PC sichern, Flag
> löschen und in Vektor springen

Außerdem wird noch der aktuell ausgeführte Befehl fertiggemacht, bevor
das alles passiert. Je nach Typ braucht z.B. ein ret 4 oder 5
Taktzyklen. Falls man noch einen Sleepmodus benutzt, kommt noch die
Aufwachzeit plus ein paar Takte dazu.

> und am Ende das ganze retour, je 4 Takte), dazu kommt bei
> Hochsprachen-Programmierung generell noch der Sprung aus
> der Vektortabelle in die ISR (2 oder 3 Takte, je nach Flash-Größe)

Nicht nur bei Hochsprachen-Programmierung.

> plus Sichern und Rückschreiben von SREG (je 3 Takte).

Es sind je 5.

> Das ist die Minimal-Latenz, wenn der Compiler nicht noch andere
> Register sichern muss.

Das muß er aber eigentlich fast immer. Macht dann pro Register weitere 2
Zyklen jeweils für das Sichern und das Zurückschreiben.

@Bernhard R.

> Eine kleine Rechnung: Bei einer Übertragungsgeschwindigkeit von 400
> kBit/s benötigt das Übertragen eines Bytes ca. 250 Mikrosekunden.

Wie kommst du auf diesen Wert? Ich käme eher so ca. auf ein Zehntel
(ohne Adressierung).

>  Was soll diese "Mikrometerschrauben-Optimierung" denn bringen?

Vielleicht dachten hier manche an SPI, das man mit bis zu halbem
Prozessortakt betreiben kann. In dem Fall sähe es dann nämlich anders
aus.
Autor: Johannes M. (johnny-m)
Datum: 07.05.2008 10:45

Rolf Magnus wrote:
>> und am Ende das ganze retour, je 4 Takte), dazu kommt bei
>> Hochsprachen-Programmierung generell noch der Sprung aus
>> der Vektortabelle in die ISR (2 oder 3 Takte, je nach Flash-Größe)
>
> Nicht nur bei Hochsprachen-Programmierung.
In Assembler kann man aber, wenn es wirklich zeitkritisch ist und man
nur den einen Interrupt nutzt, den Handler direkt in die Vektortabelle
schreiben, was zumindest den Sprung (jmp oder rjmp) eliminiert und damit
2-3 Takte einspart. Aber das geht eben wirklich nur in diesem
Spezialfall. Und in einer Hochsprache geht es gar nicht, weil der
Compiler grundsätzlich die komplette Vektortabelle anlegt mit allem was
dazugehört. Und das meinte ich mit "... bei
Hochsprachen-Programmierung..."...

Man kann einen Interrupt Handler zwar auch in C als naked anlegen und
damit die ganze Registerpusherei und -Popperei rauswerfen, aber eben
auch nur dann, wenn man sich zu 100 % sicher ist, dass im Handler das
SREG und andere Register (Pointer...) nicht beeinflusst werden.
Autor: Johannes M. (johnny-m)
Datum: 07.05.2008 10:47

Hsus wrote:
> Danke! Warum dauert denn meine Übertragung von 64 Bytes von einem
> Mikrocontroller zum anderen Mikrocontroller über TWI 140ms ???
>
> Warum solange?
>
> TWI läuft mit 300kHz. Ich benutze Atmega644 mit 16MHz Quarz.
Tja, das muss eigentlich am Programm liegen, das Du bisher nicht gezeigt
hast. Mit den Parametern sollte das schneller gehen, wenn während der
Übertragung tatsächlich nix anderes gemacht wird.
Autor: Bernhard R. (barnyhh)
Datum: 07.05.2008 11:08

@ Rolf Magnus: Natürlich! 25 us / Byte, nicht 250. Da hat mein
"Rechenschieber geeiert". Es verbleiben ca. 250 Clocks/Byte.

Für die Entscheidung Polling vs. Interrupt spielt auch folgendes eine
Rolle: Was bringt Parallelisierung? Läßt sich zwischendrin etwas
Vernünftiges tun? Und last not least: Was ist einfacher zu
implementieren (insbesondere zu testen)?

Bernhard

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net