www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler in C einbinden, Parameter übergabe


Autor: kein Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Dank euch habe ich doch tatsächlich recht viel über Mikrocontroller 
gelernt und habe auch schon einiges damit angestellt. Bisher habe ich 
immer in ASM programmiert und bin damit auch prima zurecht gekommen.
Beim aktuellen Projekt habe ich ein Handydisplay an den AVR 
angeschlossen. Ich habe die Ansteuerung in ASM geschrieben. Nun ist es 
aber wirklich zeitrauben und mühsam um irgendwelche Grafiken etc zu 
zeichnen, es wird einfach ziemlich unübersichtlich.
Gut habe ich mir gedacht, C kannst du ja ein bisschen jetzt wirds Zeit 
um auf C umzusteigen, den MC kennst du ja nun doch ziemlich gut.
Gesagt getan, habe ich die Ansteuerungsroutinen in C nochmals 
geschrieben. Und oh Schreck, das ist ja um mindestens den Faktor 2-3 
langsamer. Jetzt schaffe ich noch eine Bildwiderholrate von ca. 5/s, mit 
den ASM Routinen habe ich gegen 20 (oder doch mehr) geschafft. Und das 
trotz Optimierungsstufe 2!
OK, es gibt ja noch die Möglichkeit ASM in C einzubinden. Habe dazu im 
Tutorial ein bisschen was gefunden, auch wenn ich da noch nicht wirklich 
durchsteige wie man das jetzt am einfachsten macht (nicht 
inline-assembler, sondern ganze Funktionen oder so).
Die Hauptfrage die sich aber aufdrängt, wie mache ich die 
Parameterübergabe an eine ASM-Funktion am einfachsten? per Stack, kann 
ich in C Register direkt verwenden, oder über S-Ram?
Danke für alle Tipps diesbezüglich. Da schweigt das Tutorial...

Gruss

Autor: Luhar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und oh Schreck, das ist ja um mindestens den Faktor 2-3 langsamer.

Dann solltest Du Deinen Programmierstil optimieren :-)

Wie die Parameterübergabe von C stattfindet sagt Dir das Handbuch. Aber 
Du kannst sie auch herausfinden, indem Du eine C-Routine schreibst und 
Dir im Ass-Listing ansiehst, was in Registern und was auf dem Stack 
übergeben wird.
Was immer klappt: globale Variablen anlegen, Paramater dort eintragen 
und die Ass-Routinen darauf zugreifen lassen.

Autor: deter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du den c code assemblierst, kannst du deine Funktion einfach 
einbinden.

dannach compilest du erst

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C ist gerade bei Grafikoperationen sehr dankbar, wenn man 
Pointerberechnungen aus den Schleifen herauszieht... z.B. (konstruiertes 
Beispiel):



for (y = 0; y < 64; y++)
  for (x = 0; x < 5; x++)
    pixelout[y*64+x] = quellpixel



würde zu


uint8_t* pixelptr = pixelout

for (y=0; y < 64; y++)
{
  for (x = 0; x < 5; x++)
    *(pixelptr++) = quellpixel;
  pixelptr += (64 - 5);
}


sowas wird dann meist sehr gut optimiert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Da schweigt das Tutorial..."

Nö.

guggst du hier

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Oliver

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kein Rahul wrote:

> geschrieben. Und oh Schreck, das ist ja um mindestens den Faktor 2-3
> langsamer. Jetzt schaffe ich noch eine Bildwiderholrate von ca. 5/s, mit
> den ASM Routinen habe ich gegen 20 (oder doch mehr) geschafft. Und das

Scheib einfach so, wie in Assembler, bloß mit C-Ausdrücken.

Du darfst sogar goto verwenden.

Zeig doch mal ein Beispiel.


Peter

Autor: kein Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Also ihr dürft mich schlagen oder quälen wie ihr wollt. Ich habe nach 
jedem Frame das geschrieben wird eine delay-Funktion drin, die mir das 
ganze um 50ms pro Frame gebremst hat.... Schande über mich. Jetzt läufts 
ganz schön :)
Somit werde ich wohl doch verzichten diese Funktion in ASM zu schreiben, 
zumal das ganze miner Meinung nach eher mühsam ist (die Cracks werden 
das nicht verstehen, aber es ist doch sehr gewöhnungsbedürftig wenn 
man es noch  nie gemacht hat)
Danke für die Hilfe, ich gebe mir mühe, dass so was nicht mehr vorkommt 
:)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kein Rahul wrote:

> Somit werde ich wohl doch verzichten diese Funktion in ASM zu schreiben,
> zumal das ganze miner Meinung nach eher mühsam ist (die Cracks werden
> das nicht verstehen, aber es ist doch sehr gewöhnungsbedürftig wenn
> man es noch  nie gemacht hat)


Ne, zumindest ich sehe es genauso.

Ich habe auch erst versucht, alten Assembler einzubinden, als ich mit C 
angefangen habe. Das ist ne Sackgasse.

Nun programmiere ich nach der Devise: alles in C schreiben.

Notfalls guckt man sich den erzeugten Assembler an und dann sieht man 
eigentlich schnell, wo man dem Compiler etwas nicht richtig gesagt hat 
und er etwas umständlich vorgeht.

Und man muß erstmal überlegen, ob es sich überhaupt lohnt, um nem Zyklus 
mehr zu feilschen. Das bringt ja nur in der innersten kurzen von 
mehrfachen Schleifen etwas oder in häufigen kurzen Interrupts.


Peter

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.