Hallo,
ich habe mich aufgrund eines zeitkritischen Codeteils in den Inline
Assembler reingefummelt. Nun habe ich folgendes Problem.
Zum Ausprobieren habe ich folgenden Code geschrieben:
(Die Inhalte der Arrays sind nur Beispielhaft. 16bit sind schon nötig,
und ich nutze AVR Studio4 mit GCC und programmiere einen ATMega8 mit
10MHz. Die Optimierung ist auf -0s eingestellt. Das ganze steckt in
einer main. Die Arrays werden in der main auf der Ebene der Deklaration
der PortIO über Funktionen, die mir zum einen die Bitfolge und zum
anderen das Delay dazwischen berechnen, deklariert und belegt. Der ganze
Code ist in C, bis auf die 2 verschachtelten For-Schleifen, die aufgrund
des präzisen Timings in inline Assembler realisiert werden sollen.
Das funktioniert auch ganz gut. Die Bitfolge wird an PORTC geschickt und
zur Kontrolle auf LEDs ausgegeben. Alles so wie es soll. Das Delay mit
den Nops ist hier nur dazu da, dass ich überhaupt was sehe. Mein Problem
tritt im nächsten Schritt auf....
In diesem Schritt wollte ich das Delay auf die gleiche Art und Weise wie
die Bitfolge über ein Array Delay[10] übergeben, dessen Inhalt vorher
mit der Formel "Zählwert=Delay[s]*Taktfrequenz/Anzahl Takte" berechnet
wird:
Hier werden mir nun immer Fehler in einem xyz1234.s File produziert, die
sagen, dass je nach obigen Code (ich habe vieles ausprobiert) z.B.
X_POINTER_REG nicht gefunden wird? Nehme ich andere Register z.B. 28:27
kommt die Meldung r28 in asm nicht möglich. Auch alle Register mit
%A0,%B0, usw. im obigen Code anzugeben ändert nichts. Verwende ich %a0,
usw. kommen Meldungen über nicht gefundene Referenzen zu x,y,z
Registern. Weiterhin wird ausgegeben, dass die falschen Constraints
benutzt wurden. Ich habe alle durch, die etwas mit Pointern zu tun haben
(und auch sowieso alle anderen), aber der Fehler geht nicht weg. Das .s
File ist im Temp nach Kompilerangabe, aber ich finde es dort nicht.
Falls es überhaupt hilft da rein zu schauen?
Was mache ich hier falsch? Ich würde mich über Hinweise sehr freuen, da
mir so langsam die Ideeen, Internetquellen und Bücher ausgehen. Zumahl
ich da jetzt schon seit diversen Stunden erfolglos rumkompiliere.
Eine Frage hätte ich noch zusätzlich:
Wie spricht man denn Zahlenwerte an, die die 16bit sprengen, was ja bei
großen Delays bzw. Zählwerten gut passieren kann?
Deine Verwendung von inline Assembler ist nicht korrekt:
* du beschreibst Input-Operanden, verwendest sie aber nicht
* du clobberst Register, die nicht verwendet werden
* in "e" sind weniger Register verfügbar (wegen den Clobbers) als
benötigt werden
* der Code selbst sieht überaus seltsam aus, zB Verwendung von Z. Du
kannst so immer nur auf das erste Array-Element zugreifen. Von daher
scheint es eher angebracht, wenn du bei C bleibst.