Forum: Compiler & IDEs AT90CAN32 avr-gcc: Groesse des RAMs angeben.


von Thorsten (Gast)


Lesenswert?

Hallo zusammen,

habe ein paar AT90CAN32 verbaut. Leider unterstuetzt mein avr-gcc (4.1.0 
bei debian) nicht exakt diesen uC, sondern den fast identischen 
AT90CAN128. AT90CAN32 und AT90CAN128 unterscheiden sich 
ausschliesslich in der Speichergroesse von Flash, RAM, und EEPROM. 
Code erzeugt fuer den AT90CAN128 laeuft also grundsaetzlich auf dem 
AT90CAN32.
Nur bei C gibt es ein kleines Problem mit dem Stackpointer: avr-gcc 
setzt den Stackpointer ans Ende des RAMs. Wenn ich fuer den AT90CAN128 
compiliere/linke, liegt das ausserhalb des gueltigen Bereiches fuer den 
AT90CAN32 und das Programm verreckt klaeglich bei einem RET.

Ich frage mich nun, wie ich den Compiler/Linker dazu bringen kann, 
einfach weniger RAM anzunehmen und den Stackpointer entsprechend zu 
setzen.
Wie kann ich sagen: Der RAM ist nur 2 KiByte (anstatt 8 KiBytes wie beim 
AT90CAN128 angenommen.)
Ich moechte weiterhin ein nettes Makefile benutzen.

Vielen Dank schon mal fuer die Hilfe!

Thorsten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thorsten wrote:

> habe ein paar AT90CAN32 verbaut. Leider unterstuetzt mein avr-gcc
> (4.1.0 bei debian) nicht exakt diesen uC, sondern den fast
> identischen AT90CAN128.

Dann patche ihn bitte entsprechend oder nerv' den Debian-Maintainer,
dass er die Tools auf dem Laufenden hält.

> Ich frage mich nun, wie ich den Compiler/Linker dazu bringen kann,
> einfach weniger RAM anzunehmen und den Stackpointer entsprechend zu
> setzen.
1
% avr-gcc --target-help
2
3
Target specific options:
4
...
5
  -minit-stack=STACK          Use STACK as the initial value of the stack
6
                              pointer
7
...

von Thorsten (Gast)


Lesenswert?

Hallo,

danke schonmal fuer die Hilfe. Scheinbar wird die Option aber 
ignoriert?!

Habe
CFLAGS += -minit-stack=0x4FF

und testhalber auch zusaetzlich
LDFAGS += -minit-stack=0x4FF

ins Makefile gepackt.

Sowohl beim Compilieren und beim Linken steht die Option drin. Eine 
Warnung deswegen wird nicht erzeugt.

Hinterher finde ich im main.sym jedoch:
000010ff W __stack

und im main.lss:
00000094 <__ctors_end>:
  94:   11 24           eor     r1, r1
  96:   1f be           out     0x3f, r1        ; 63
  98:   cf ef           ldi     r28, 0xFF       ; 255
  9a:   d0 e1           ldi     r29, 0x10       ; 16
  9c:   de bf           out     0x3e, r29       ; 62
  9e:   cd bf           out     0x3d, r28       ; 61

Wobei ja 3e und 3d der Stackpointer sind.

Ergo: Die Option hatte keine Auswirkung?
Natuerlich hab ich ein make clean vorher gemacht.

Habe gerade noch planlos mit #define RAMEND 0x4ff und #define __stack 
0x4ff rumgespielt, aber das hat auch nichts veraendert.

Mail an den Maintainer geht dann noch raus, aber ich wuerde gerne bald 
doch ne Loesung finden.

Any ideas?

Danke und Gruss

Thorsten

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hmpf.  Möglicherweise ist die Option inzwischen wirklich überflüssig
geworden. :-(

OK, dann nimm

CFLAGS += -Wl,--defsym=__stack=XXXX

von Thorsten (Gast)


Lesenswert?

Danke Jörg,

das scheint zumindest im main.lss zu wirken.
Ob's auf der Hardware laeuft, weiss ich in ein paar dutzend Minuten.

Die anderen .sections fangen ja `von vorne' im RAM an. Sollte also keine 
Probleme geben, oder?
Gibt es noch irgendwelche Besonderheiten, auf die ich jetzt achten muss?

Nochmals danke, Mail an den maintainer ist uebrigens raus,

Schoene Gruesse

Thorsten

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.