Forum: Compiler & IDEs push pop asusschalten


von Peter L. (registerpeter)


Lesenswert?

Hi,

gibt es eine Möglichkeit push/pop für eine funktion abzuschalten?
Habe das bisher nur in verbindung mit bascom gefunden als INterrupt.

Problem ist folgendes:

Im main lade ich werte in bestimmte register.
Dann ruf ich eine void unterfunktion auf, die auf diese Regs zugreift 
und die Ergebnisse in anderen bestimmten Regs abspeichert.
Diese will ich dann im main auslesen.
DUrch die pops am Ende werden die Regs ja wieder zerstört, oder?
Möchte die Werte auf keinen fall in den SPeicher legen und darin 
übergeben.


Im main wird ja erst am Schluss gepopt, oder? Das heisst die Werte 
müssten noch in den Regs stehen wenn ich in der Unterfunktion lande?

Danke schonmal

edit: Könnte natürlich auch von Hand die pushs und pops im assmblerfile 
entfernen, aber es wäre schöner und wichtig, wenn es einfach ausm 
AVRStudio schon richtig rauskommt =)

von Peter D. (peda)


Lesenswert?

Peter Lustig schrieb:
> gibt es eine Möglichkeit push/pop für eine funktion abzuschalten?

Warum willst Du, daß Dein Programm abstürzt?
Der Compiler ist ja nicht blöde, er sichert nur Register, die er 
benötigt.


> Im main lade ich werte in bestimmte register.

Dann hast Du schon verloren.
Als C-Programmierer benutzt man Variablen und keine Register.
Wenn dann der Compiler beim Optimieren Variablen in Register packt, dann 
ist das sein Bier.

Die Register gehören zu 100% dem Compiler.
Wenn Du über Register frei verfügen willst, darfst Du kein C 
programmieren.

> Dann ruf ich eine void unterfunktion auf, die auf diese Regs zugreift
> und die Ergebnisse in anderen bestimmten Regs abspeichert.

Nö, dazu nimmt man Argumente und Rückgabewerte!


> Im main wird ja erst am Schluss gepopt, oder?

Nö, das Main läuft endlos.
Wie gesagt, der Compiler ist ja nicht blöde, toten Code läßt er weg.


Peter

von Rolf Magnus (Gast)


Lesenswert?

Ein gewisses Problem dabei ist, daß es nur einen Rückgabewert gibt. Wenn 
man mehrere Werte zurückgeben will, muß man das über Zeiger-Parameter 
machen, und die Variablen müssen dann im Speicher stehen, damit man 
darauf zeigen kann.
Wenn das schon ein Problem darstellt, ist aber fraglich, ob C die 
richtige Sprache ist.

von Peter (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ein gewisses Problem dabei ist, daß es nur einen Rückgabewert gibt. Wenn
> man mehrere Werte zurückgeben will,

dafür kann man auch globale variable benutzen, im besten fall werden sie 
auch gleich zu Registern.

von Peter L. (registerpeter)


Lesenswert?

Also habe das jetzt über das naked attribut gemacht.
Assemblermässig sieht das ganze gut aus.
Obs dann eben läuft oder abschmiert wird sich noch zeigen.

@Peter:
Ich weiß, dass man das eigentlich auf keinen Fall so machen sollte, ABER 
falls Du Dich noch dran erinnerst, ich bin der mit dem modifizierten 
Atmel mit breiteren Registern und normalem Speicher. Deswegen MÜSSEN die 
Werte in den Regs gehandelt werden.

Danke trotzdem. Mal sehen ob das läuft...

von Rolf Magnus (Gast)


Lesenswert?

Peter schrieb:

> dafür kann man auch globale variable benutzen, im besten fall werden
> sie auch gleich zu Registern.

Ich kann mir kaum vorstellen, daß gcc jemals eine globale Variable von 
sich aus in ein Register steckt. Das muß man ihm dann explizit sagen.
Wäre zwar nicht sonderlich elegant, aber eine Alternative wäre es.

Peter Lustig schrieb:
> ich bin der mit dem modifizierten Atmel mit breiteren Registern und
> normalem Speicher. Deswegen MÜSSEN die Werte in den Regs gehandelt
> werden.

Ehrlich gesagt halte ich es immer noch für eine selten dämliche Idee, 
einen in einem einzelnen Detail modifizierten Prozessor-Core zu bauen, 
den Rest seiner Architektur nicht daran anzupassen und dann auch noch in 
C mit einem nicht an diese Änderung angepaßten Compiler zu 
programmieren.
Damit wird man regelmäßig auf die Schnauze fallen. Wenn ich mich recht 
erinnere, war es nicht deine Idee, aber ist es nicht möglich, demjenigen 
begreiflich zu machen, wie unsinnig das ist?

von Peter L. (registerpeter)


Lesenswert?

Hehe, ja Du sagst es =)

Aber hab die Problematik ganz gut im griff mittlerweile. Hab für 
Standard befehle den Zugriff auf die unteren 8 Bit beschränkt in den 
Regs, damit hab ich dann das printf Prob gelöst. War nur ein Hardware 
Bug meines Vorgängers...der mich 3 monate gekoster hat :-/

Ja ich muss halt darauf achten, dass sich der gcc an meine Vorgaben 
hält. Nee muss da jeztt leider durch bis ich dann in 1,5 Monaten fertig 
bin mit der DA.

Gruß und danke =)

von Peter D. (peda)


Lesenswert?

Peter Lustig schrieb:
> Hab für
> Standard befehle den Zugriff auf die unteren 8 Bit beschränkt in den
> Regs, damit hab ich dann das printf Prob gelöst. War nur ein Hardware
> Bug meines Vorgängers...der mich 3 monate gekoster hat :-/

Das wurde damals schon vermutet, da ein Fehler im printf längst 
aufgefallen sein müßte.

Ich würde trotzdem die erweiterten Register im SRAM mit einblenden.
Dann kannst Du sie in C zugreifen ohne jedwede Verrenkungen des 
Compilers oder des Code.


> Nee muss da jeztt leider durch bis ich dann in 1,5 Monaten fertig
> bin mit der DA.

Klingt recht sportlich.


Peter

von Peter L. (registerpeter)


Lesenswert?

Peter Dannegger schrieb:

> Das wurde damals schon vermutet, da ein Fehler im printf längst
> aufgefallen sein müßte.
>
> Ich würde trotzdem die erweiterten Register im SRAM mit einblenden.
> Dann kannst Du sie in C zugreifen ohne jedwede Verrenkungen des
> Compilers oder des Code.

Ja, das halte ich auch für das einzig vernünftige! Aber es geht nunmal 
leider auch um den Platz, der auf dem FPGA verbraucht wird. Und wenn das 
SRAM auch noch verbreitert würde ist das wohl zu viel Verbrauch...

Naja, da muss ich jetzt halt durch, und hey, ich schon ganz schön viel 
zum laufen gebracht auf dem Ding ;-)

von Karl H. (kbuchegg)


Lesenswert?

Peter Lustig schrieb:

> Naja, da muss ich jetzt halt durch, und hey, ich schon ganz schön viel
> zum laufen gebracht auf dem Ding ;-)


Vielleicht erinnere ich mich auch nicht mehr:
Ich hab da zwei Frage

Welche Befehle wurden da eigentlich verbreitert? Ich nehme mal an, dass 
es sich um Arithmetik u dgl. handelt und das Ziel ist es den Prozessor 
schneller zu machen. Für welche Anwendung ist das relevant oder ist das 
mehr eine allgemeine 'Zielsetzung'?

Frage 2: Gibt es schon Messergebnisse, was die Modifikation bringt?

von Peter L. (registerpeter)


Lesenswert?

aha, naked entfernt ja auch den ret...
Dann würde es wohl nie zurückkehre aus der Funktion, was?

Krieg ich das mit einem asm("ret") am Ende der Funktion in den Griff?

von Peter L. (registerpeter)


Lesenswert?

Karl heinz Buchegger schrieb:

> Vielleicht erinnere ich mich auch nicht mehr:
> Ich hab da zwei Frage
>
> Welche Befehle wurden da eigentlich verbreitert? Ich nehme mal an, dass
> es sich um Arithmetik u dgl. handelt und das Ziel ist es den Prozessor
> schneller zu machen. Für welche Anwendung ist das relevant oder ist das
> mehr eine allgemeine 'Zielsetzung'?
>
> Frage 2: Gibt es schon Messergebnisse, was die Modifikation bringt?

Das ist leider ein Punkt, zu dem ich mich nicht äußern kann.. Ist ja 
"geheim" und will da keinen ärger riskieren :-(

Es sind spezielle Berechnungen die eben über die ganze Regbreite 
durchgeführt werden. Dazu eben auch neue Befehle und Opcodes, die dem 
Assembler beigebracht wurden.

Ja die Ergebnisse haben so ca einen Faktor von 100. Also der 
modifizierte ist ein paar hundert mal schneller als der normale. Damit 
wird dann eben der mehraufwand in der Software gerechtfertigt.

von Karl H. (kbuchegg)


Lesenswert?

Peter Lustig schrieb:

> Das ist leider ein Punkt, zu dem ich mich nicht äußern kann.. Ist ja
> "geheim" und will da keinen ärger riskieren :-(

Schade.
Nicht mal eine Andeutung in welchem Bereich ihr euch bewegt
Finanzmathematik, Graphikworkstation, Regelungstechnik, Videoauswertung, 
OCR, teuflisch schwierige quadratische Gleichungen, .... ?

> Ja die Ergebnisse haben so ca einen Faktor von 100. Also der
> modifizierte ist ein paar hundert mal schneller als der normale. Damit
> wird dann eben der mehraufwand in der Software gerechtfertigt.

Faktor >100 ist schon nicht schlecht.

von Peter L. (registerpeter)


Lesenswert?

Karl heinz Buchegger schrieb:
> teuflisch schwierige quadratische Gleichungen,

das trifft es ganz gut =) Tut mir leid, ich trau mich echt nich mehr zu 
sagen, da das eben auch für spezielle Firmen ist und ich da wirklich die 
Klappe halten muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.