AVR Problem mit -nostartfiles

(Firma: drx) #6862751
Lesenswert?

Hallo,

mir ist aufgefallen, wenn ich die Option -nostartfiles in Atmel Studio 7
nutze, dass Strings die ich über Uart senden möchte nicht Ausgegeben
werden. Grund dafür ist, dass das erzeugte Programm den Text aus dem
Flash nicht ins RAM kopiert. Die Funktion __do_copy_data wird zwar
eingefügt aber nie Aufgerufen. Warum ist das so? Selbes Phänomen ist mir
auch bei dem Attiny2313 und ATmega32 aufgefallen.
Erstelle ich mir eine eigene __do_copy_data werden die Strings korrekt
ausgegeben.

Eine Vermutung von mir wäre, dass ich mit dem falschen Sektor arbeite,
allerdings habe ich dazu nicht viel gefunden.
1
__attribute__((section(".ctors"))) void boot(void)

Ich füge mal das Programm mit an. Mein Ziel wäre quasi das nur die
Interrupt Tabelle nicht eingefügt wird, dafür aber die
Stackinitialisierung und das Kopieren der Texte ins RAM.

Danke für eure Antworten oder Hilfe.

BG
Umbrecht
Angehängte Dateien:
(Firma: drx) #6862974
Lesenswert?

Johann L. schrieb:
> Was willst du denn erreichen?

Stored B. schrieb:
> Mein Ziel wäre quasi das nur die
> Interrupt Tabelle nicht eingefügt wird, dafür aber die
> Stackinitialisierung und das Kopieren der Texte ins RAM.



Johann L. schrieb:
> Mit -nostartfiles fehlt der Start-Code der avr-libc (crt*.o).

Nicht ganz. Ein Teil davon (__do_copy_data) befindet sich trotzdem im 
Programm, wird aber nicht aufgerufen.
#6863043
Lesenswert?

Wenn Du den String einfach direkt aus dem Flash liest, dann brauchst du 
überhaupt keine Kopierroutine sondern kannst den String direkt aus den 
Flash raus verwenden. Das spart dann auch RAM.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read

Was hier passiert, ist das der (Konstante)  String im "rodata" segment 
definiert wird. Der Initialwert dafür liegt im Flash und muss beim 
Booten erst aus dem Flash in den Ram übertragen werden. Wenn das halt 
fehlt...
Gast #6863443
Lesenswert?

Apollo M. schrieb:
> Kann man (wenn ja wie) in gcc eine C-Funktion schreiben, die vor main()
> als eigene Init-Funktion aufgerufen wird?
1
// Installiert die my_init() Prozedur in den Start-Bereich 5,
2
// so dass sie automatisch vor main() ausgeführt wird.
3
void my_init() __attribute__ ((naked))  __attribute__ ((section (".init5")));
4

5
// Initialisiert ... was auch immer
6
void my_init() 
7
{
8
   ...
9
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren