Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Balkonkraftwerk Speicher und Wechselrichter Tests und Tutorials

 
(17 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
...
+
----
  Vielleicht kann hier ein GCC-Kollege das Beispiel einfügen
+
Die Schleife für die Zeitberechnung für avr-gcc hab ich in inline asm gefasst.
...
+
Mit ist nur nicht klar, welche "magische" Zahl was bedeutet.  
 +
Evtl wäre es klarer defines zu verwenden wie für F_CPU auch.  
 +
Das ganze in inline zu packen ist der einzige Weg, halbwegs aussagekräftige Werte zu bekommen.
 +
Ausserem müssen Interrupts abgeschaltet sein, da sonst die Zeitmessung ebenfalls nicht stimmt.
 +
Übrigens ist nicht nur der Optimierungsgrad dafür verantwortlich,
 +
wie eine solche Schleife später in asm aussieht, sondern noch ganz viele andere Faktoren.
 +
Und es ist auch ziemlich umständlch, aus den Wiki raus in ne Quelle zu kopieren;
 +
besonders dann, wenn an vielen Stellen die Quelle durch Wiki-Text auseinandergebrochen ist.
 +
Da könnten vielleicht Fussnoten oder so was helfen, oder den Text in die C-Quelle integrieren,
 +
so daß man später im Programm auch noch weiß was das alles soll und macht.
  
Vielleicht mal sagen, was man haben will bzw was die Blackox 'Pulsein' tut. Ich hab grad keine Lust, BASCOM zu installieren und zu debuggen ;-)
+
--[[Benutzer:SprinterSB|SprinterSB]] 14:54, 23. Dez 2005 (CET)
 
+
----
Es gibt 1000 Möglichkeiten, Zeiten zu messen...
+
Das ist eine Demo, wie man mit C Problem angehen könnte. Wär schön gewesen, wir wären auch bei der Sprache geblieben. Ich mußte nur 1 fremdes Statement reintun, sonst hätte der Optimizer zugeschlagen.<br>
 +
Die magischen Zahlen sind Cycles, INKLUSIVE while Schleife. Ich hoffe, der inline bewirkt das Gewünschte, die "Idle" schleife braucht 6 cycles.<br>
 +
Interrupts hab ich nicht disabled, weil's Bascom auch nicht tut. <br>
 +
Andere Faktoren ? zum Beispiel ? Du muß die Cycles aus der .Lss file zusammenrechnen<br>
 +
rauszukopieren: Ich seh das nicht als download-area. Wer das einfach 1:1 kopieren kann, hat nix davon.<br>
 +
 +
--PicNick 15:12, 23. Dez 2005 (CET)
  
 
----
 
----
  
Es geht nicht darum das man die Funktion nachbaut sondern das man die gleiche Aufgabe in GCC erfüllt. Wie du das machst bleibt Dir überlassen, es sollte nur eine möglichst kompakte Lösung sein. Decodieren eines RC-Signales. Dazu muss die Zeit bis zum Pegelwechsel gemessen werden (siehe [[Servos]]).
+
Das Problem ist ja, daß C keine Vorstellung hat von Taktzyklen oder Ausführungszeiten.
 +
Ein Compiler transformiert von C nach Assembler;
 +
was dabei rauskommt kann ''irgendwas'' sein, solange es die gleiche Semantik hat wie der ursprüngliche C-Code. Das ist bei solchen hardwarenahen Aufgaben teilweise lästig &#150; ohne Frage.
 +
Jedenfalls hat man keine Möglichkeit, den generierten asm-Code zu bestimmen.
 +
Die einzige Möglichkeit dazu liegt jenseits von C: in Assembler.
 +
Alles andere ist trial & error und es ist in keinster Weise gesichert, daß der
 +
Code bei jemand anderem genauso erzeugt wird.
  
--[[Benutzer:Frank|Frank]] 02:24, 6. Dez 2005 (CET)
+
Entsprechend BASCOM würde ein C-Beispiel eine Bibliotheksfunktion aufrufen,
 +
die in asm implementiert ist (wie in BASCOM auch), und irgendeine Lib mitliefern.
 +
Aber sonderlich hilfreich wäre das auch nicht...
  
 +
Andere Faktoren, die neben dem Optimierungsgrad Einfluss auf den erzeugten Code haben, sind:
 +
* der verwendete Compiler und sein Version(!)
 +
* weitere Kommandozeilen-Parameter, die die Codegenerierung beeinflussen, insbesondere
 +
* der Controller(-Typ), für den generiert wird. Nicht alle Controller hab einen gleich mächtigen Befehlssatz
 +
* die Vorgeschichte der entsprechenden Code-Stelle; dies hat starken Einfluss auf die Registerzuordnungen, für die sich der Compiler entscheidet, und somit auch auf die verwendeten Befehle
 +
* wie die Funktion eingebunden ist: auch eine Funktion, die nicht als inline deklariert ist, darf geinlinet werden. Auch das hat weitreichende Folgen auf die Codeerzeugung
 +
 +
Im lst-File nachzuschauen, wie viel Befehle verwendet werden, das eintragen und ein Rebuilt
 +
wird i.d.R. zum Ergebnis führen, aber sichergestellt ist es nicht.
 +
Es ist denkbar, daß das lst sagt, die Sequenz dauert n Zyklen. Nach Ändern der Quelle auf n Zyklen dauert die Schleife aber evtl. m Zyklen.
 +
 +
Und so ganz klar, was der ganze Sourcevergleich soll, ist mit immer noch nicht.
 +
Äpfel mit Birnen vergleichen ist jedenfalls einfacher...
 +
Einem BASCOM-Programmierer bringt es eigentlich ebensowenig wie einem C-Programmierer.
 +
 +
--[[Benutzer:SprinterSB|SprinterSB]] 16:16, 23. Dez 2005 (CET)
  
 
----
 
----
 +
Der Vergleich hat den Sinn, daß bei gleicher Aufgabenstellung der C Programmierer sieht, wie das in Bascom aussehen müßte und vice versa. Das ist nur möglich, wenn man auch dann bis auf den letzten Drücker ausschließlich die Sprachmittel dieser Sprache verwendet. Nur dadurch kann ich dies Sprachmittel auch vergleichen.<br>
 +
Es kann nicht sein, daß man einfach hinschreibt, "das geht nicht, da muß du Assembler lernen".
 +
--PicNick 18:56, 23. Dez 2005 (CET)
  
PickNick betrifft das GCC-Beispiel zu Pulsein! Es geht eigentlich nicht darum die Aufgabe Funktionell auf die gleiche Weise zu lösen (kann man natürlich auch machen). Es geht nur darum eine Lösung zu finden und diese aufzuzeigen damit Einsteiger die auch gleich nutzen können. Das könnte auch eine Timerlösung sein.
+
----
Du hast jetzt einen denkbaren Aufruf eingetragen, aber die Lösung fehlt noch. Der leser sieht so auf den ersten Blick nicht das dort noch Code fehlt und könnte denken das wäre in C genauso einfach zu lösen wie in Bascom. Du solltest nochmal FETT markieren das hier noch die Lösung und das Programmgerüst fehlen, sonst ist die Gegenüberstellung etwas verfälscht.
+
Bei der State-Machine ist die Reihenfolge Bascom-GCC-Assembler nicht eingehalten. Ich würde es so lassen, da die Erläuterung der Aufgabe ja bei GCC erfolgt, und Bascom sich darauf bezieht. Wenn das aber jemanden stört, bitte ich ergebenst um Umbau
  
--[[Benutzer:Frank|Frank]] 14:40, 21. Dez 2005 (CET)
+
--PicNick 14:16, 17. Jan 2006 (CET)
  
Ich versteh' schon. Die Vorgabe von "pulsein" ist ja eigentlich unter die Gürtellinie. So zum Drüberstreuen (ohne Timer) mit relativ guter Genauigkeit Pulse messen geht in Hochsprachen (wenn wir C dazurechnen) einfach nicht. Aber gut, irgendwie kriegen wir das Code-Kästchen schon voll
 
  
--PicNick 15:01, 21. Dez 2005 (CET)
+
-----
 +
Damit die Links im Inhaltsverzeichnis richtig funktionieren müssen Unterüberschriften verschieden sein. Daher hab ich mal den beispielnamen in Klammern angefügt
  
----
+
--[[Benutzer:Frank|Frank]] 15:17, 17. Jan 2006 (CET)
  
Siehst du etwas zu verbissen ;-) Es geht ja nicht darum Beispiele zu suchen die überall gleich funktionieren, sondern einfach zu zeigen wie man am schnellsten bestimmte Aufgaben lösen kann, und das wart eine ganz typische Aufgabe die man sehr oft braucht. Hätte es kein PulseIn-Befehl gegeben, hätte ich dort ein Bascom-Timer Beispiel gepostet. Auch ein C-Programmierer kann kleine Aufgaben posten die in Bascom nicht so leicht umzusetzen sind. Es geht um Lösungen nicht um direkte Algorithmen-Vergleiche.
+
-----
 +
Da hast du recht, ist eigentlich auch logisch. Man bessert sich !
  
--[[Benutzer:Frank|Frank]] 16:38, 21. Dez 2005 (CET)
+
--PicNick 16:13, 17. Jan 2006 (CET)
  
 
----
 
----
 +
Die Abfolge der Unterabschnitte ist ja nicht sooo wichtig...wir sind ja nicht aufm Amt ;-)
  
Na, is ja auch egal, jetzt haben wir es schon, das war ja schon peinlich
+
Was steht eigentlich "rechts" vom '.' im Bascom-Beispiel? Ich kann mich da nicht aus.
 +
Argument = "11."
 +
Die Maschine schreibt ja da hin.
  
--PicNick 17:08, 21. Dez 2005 (CET)
+
--[[Benutzer:SprinterSB|SprinterSB]] 16:36, 17. Jan 2006 (CET)
  
 +
----
 +
Du meinst rechts vom Punkt ? 0x00. Durch das initialisieren ist ja argument ein (20 + 1) byte langes array von 0x00.
  
Nicht unbedingt peinlich, halt symptomatisch  in C. Manche Dinge sind halt wesentlich aufweniger und erfordern viel mehr Zeit als in Basic. Was ist so schlimm daran dieses zuzugeben.
+
Die "Band"längen berechnung von dir hab ich nicht nachvollzogen. Das Platz muß reichen. fix codiert ist die sache sowieso
  
--[[Benutzer:Frank|Frank]] 15:53, 22. Dez 2005 (CET)
+
--PicNick 16:47, 17. Jan 2006 (CET)
  
 
----
 
----
Was so schlimm ist ? Der Stolz, der Stolz !  "Geht nicht, gibt's nicht"
 
  
Willst du für Assembler sourcen auch eine "Sourcecode" Kategorie aufmachen a la Bascom und C ?
+
Ok, jetzt hab ich's auch gesehen...
  
--PicNick 16:15, 22. Dez 2005 (CET)
+
--[[Benutzer:SprinterSB|SprinterSB]] 16:56, 17. Jan 2006 (CET)

Aktuelle Version vom 17. Januar 2006, 16:56 Uhr


Die Schleife für die Zeitberechnung für avr-gcc hab ich in inline asm gefasst. Mit ist nur nicht klar, welche "magische" Zahl was bedeutet. Evtl wäre es klarer defines zu verwenden wie für F_CPU auch. Das ganze in inline zu packen ist der einzige Weg, halbwegs aussagekräftige Werte zu bekommen. Ausserem müssen Interrupts abgeschaltet sein, da sonst die Zeitmessung ebenfalls nicht stimmt. Übrigens ist nicht nur der Optimierungsgrad dafür verantwortlich, wie eine solche Schleife später in asm aussieht, sondern noch ganz viele andere Faktoren. Und es ist auch ziemlich umständlch, aus den Wiki raus in ne Quelle zu kopieren; besonders dann, wenn an vielen Stellen die Quelle durch Wiki-Text auseinandergebrochen ist. Da könnten vielleicht Fussnoten oder so was helfen, oder den Text in die C-Quelle integrieren, so daß man später im Programm auch noch weiß was das alles soll und macht.

--SprinterSB 14:54, 23. Dez 2005 (CET)


Das ist eine Demo, wie man mit C Problem angehen könnte. Wär schön gewesen, wir wären auch bei der Sprache geblieben. Ich mußte nur 1 fremdes Statement reintun, sonst hätte der Optimizer zugeschlagen.
Die magischen Zahlen sind Cycles, INKLUSIVE while Schleife. Ich hoffe, der inline bewirkt das Gewünschte, die "Idle" schleife braucht 6 cycles.
Interrupts hab ich nicht disabled, weil's Bascom auch nicht tut.
Andere Faktoren ? zum Beispiel ? Du muß die Cycles aus der .Lss file zusammenrechnen
rauszukopieren: Ich seh das nicht als download-area. Wer das einfach 1:1 kopieren kann, hat nix davon.

--PicNick 15:12, 23. Dez 2005 (CET)


Das Problem ist ja, daß C keine Vorstellung hat von Taktzyklen oder Ausführungszeiten. Ein Compiler transformiert von C nach Assembler; was dabei rauskommt kann irgendwas sein, solange es die gleiche Semantik hat wie der ursprüngliche C-Code. Das ist bei solchen hardwarenahen Aufgaben teilweise lästig – ohne Frage. Jedenfalls hat man keine Möglichkeit, den generierten asm-Code zu bestimmen. Die einzige Möglichkeit dazu liegt jenseits von C: in Assembler. Alles andere ist trial & error und es ist in keinster Weise gesichert, daß der Code bei jemand anderem genauso erzeugt wird.

Entsprechend BASCOM würde ein C-Beispiel eine Bibliotheksfunktion aufrufen, die in asm implementiert ist (wie in BASCOM auch), und irgendeine Lib mitliefern. Aber sonderlich hilfreich wäre das auch nicht...

Andere Faktoren, die neben dem Optimierungsgrad Einfluss auf den erzeugten Code haben, sind:

  • der verwendete Compiler und sein Version(!)
  • weitere Kommandozeilen-Parameter, die die Codegenerierung beeinflussen, insbesondere
  • der Controller(-Typ), für den generiert wird. Nicht alle Controller hab einen gleich mächtigen Befehlssatz
  • die Vorgeschichte der entsprechenden Code-Stelle; dies hat starken Einfluss auf die Registerzuordnungen, für die sich der Compiler entscheidet, und somit auch auf die verwendeten Befehle
  • wie die Funktion eingebunden ist: auch eine Funktion, die nicht als inline deklariert ist, darf geinlinet werden. Auch das hat weitreichende Folgen auf die Codeerzeugung

Im lst-File nachzuschauen, wie viel Befehle verwendet werden, das eintragen und ein Rebuilt wird i.d.R. zum Ergebnis führen, aber sichergestellt ist es nicht. Es ist denkbar, daß das lst sagt, die Sequenz dauert n Zyklen. Nach Ändern der Quelle auf n Zyklen dauert die Schleife aber evtl. m Zyklen.

Und so ganz klar, was der ganze Sourcevergleich soll, ist mit immer noch nicht. Äpfel mit Birnen vergleichen ist jedenfalls einfacher... Einem BASCOM-Programmierer bringt es eigentlich ebensowenig wie einem C-Programmierer.

--SprinterSB 16:16, 23. Dez 2005 (CET)


Der Vergleich hat den Sinn, daß bei gleicher Aufgabenstellung der C Programmierer sieht, wie das in Bascom aussehen müßte und vice versa. Das ist nur möglich, wenn man auch dann bis auf den letzten Drücker ausschließlich die Sprachmittel dieser Sprache verwendet. Nur dadurch kann ich dies Sprachmittel auch vergleichen.
Es kann nicht sein, daß man einfach hinschreibt, "das geht nicht, da muß du Assembler lernen". --PicNick 18:56, 23. Dez 2005 (CET)


Bei der State-Machine ist die Reihenfolge Bascom-GCC-Assembler nicht eingehalten. Ich würde es so lassen, da die Erläuterung der Aufgabe ja bei GCC erfolgt, und Bascom sich darauf bezieht. Wenn das aber jemanden stört, bitte ich ergebenst um Umbau

--PicNick 14:16, 17. Jan 2006 (CET)



Damit die Links im Inhaltsverzeichnis richtig funktionieren müssen Unterüberschriften verschieden sein. Daher hab ich mal den beispielnamen in Klammern angefügt

--Frank 15:17, 17. Jan 2006 (CET)


Da hast du recht, ist eigentlich auch logisch. Man bessert sich !

--PicNick 16:13, 17. Jan 2006 (CET)


Die Abfolge der Unterabschnitte ist ja nicht sooo wichtig...wir sind ja nicht aufm Amt ;-)

Was steht eigentlich "rechts" vom '.' im Bascom-Beispiel? Ich kann mich da nicht aus.

Argument = "11."

Die Maschine schreibt ja da hin.

--SprinterSB 16:36, 17. Jan 2006 (CET)


Du meinst rechts vom Punkt ? 0x00. Durch das initialisieren ist ja argument ein (20 + 1) byte langes array von 0x00.

Die "Band"längen berechnung von dir hab ich nicht nachvollzogen. Das Platz muß reichen. fix codiert ist die sache sowieso

--PicNick 16:47, 17. Jan 2006 (CET)


Ok, jetzt hab ich's auch gesehen...

--SprinterSB 16:56, 17. Jan 2006 (CET)


LiFePO4 Speicher Test