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)
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.
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
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

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.