AVR Problem mit -nostartfiles

OP (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:
OP (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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.