mikrocontroller.net

Forum: Compiler & IDEs Configurationsdaten an definierte Speicherstelle compilieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: FindetMemo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe ein Array in dem eine ganze Menge Konfigurationsdaten stehen.
Das ganze ist eigentlich nur in einem Header definiert als
unsigned char config[] = {...};

Es wäre enorm hilfreich, wenn ich dieses Array in einem definierten 
Speicherbereich abspeichern könnte und zugleich sicherstellen könnte, 
dass damit genau 4096 Byte gefüllt werden, damit kein anderer 
Programmcode auf diesem Flash-Block mit untergebracht wird.

Kann man dieses Array irgendwie einer ganz bestimmte Speicheradresse zum 
liegen kommen lassen, eben so dass es exakt eine Flash-Zelle 
beansprucht?

Es geht um Eclipse mit dem GCC Compiler in C

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Separate section anlegen und per Linkerscript dann entsprechend
platzieren.
const uint8_t xxx[] = { ... } __attribute__((section(".foo")));

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
...und hier ein Beispiel für ein solches Script bzw. Augmentation des 
Standard-Scripts:
SECTIONS
{
  .flash1 :
  {
    . = MAX (ABSOLUTE(0x10000), .);
    PROVIDE (__flash1_start = .);
    . = ALIGN(2);
    *(.text.flash1.*)
    *(.progmem1.data*)
    PROVIDE (__flash1_end = .);

    ASSERT (__flash1_start == __flash1_end || __flash1_start >= ABSOLUTE(0x10000),
          "__flash1 data in .progmem1.data below 0x10000");
    ASSERT (__flash1_start == __flash1_end || __flash1_end <= ABSOLUTE(0x20000),
          "__flash1 data in .progmem1.data exceeds 0x20000");
  }

  .flash2 :
  {
    . = MAX (ABSOLUTE(0x20000), .);
    PROVIDE (__flash2_start = .);
    . = ALIGN(2);
    *(.text.flash2.*)
    *(.progmem2.data*)
    PROVIDE (__flash2_end = .);

    ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),
          "__flash2 data in .progmem2.data below 0x20000");
    ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),
          "__flash2 data in .progmem2.data exceeds 0x30000");
  }
}

INSERT AFTER .text
und die Datei dann qua -T<name> dem Linker-Treiber (also avr-gcc) 
übergeben und das Ergebnis im Map-File überprüfen.

Das Beispiel ist zwar für den Support der avr-gcc Address-Spaces 
__flash1/2, aber in deinem Fall kann man das ähnlich angehen.  Kommt 
halt darauf an, wo das Zeug genau hin soll.  Das MAX fällt bei dir weg, 
und das ALIGN brauchst auch nicht.  Die definierten Symbole können 
hilfreich sein wenn z.B. eine Checksumme zu berechnen ist.

: Bearbeitet durch User
Autor: FindetMemo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo nochmal,

was hat es mit den Zeilen:

> *(.text.flash1.*)
> *(.progmem1.data*)

auf sich?


Ich habe in anderen Beispielen auch Zeilen gefunden die da wären:

> *(.data)
> .bss : { *(.bss) }


und kann das irgendwie noch nicht so richtig übersetzen...

Welche von diesen Keywörtern benötigt man denn noch so, um die 
Initialisierung auch richtig zu machen?

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FindetMemo schrieb:
> Welche von diesen Keywörtern

Das sind keine „Keywörter“, sondern die Namen deiner Speicherbereiche
(sections), die du explizit oder implizit (.text, .data, .bss) im
Programm vergibst.

Die Dokumentation zu den Linkerscripten des GNU Linkers solltest du
als Referenz schon mal daneben halten, damit du am Ende weißt, was
darin welchen Zweck hat.  Johanns und meine Antworten sollten kein
Kochrezept darstellen, das du blind befolgen kannst, sondern nur
Ideen und Anregungen in die Runde werfen.

: Bearbeitet durch Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.