Forum: Mikrocontroller und Digitale Elektronik Einen Header aus Variablen im Flash an bestimmte Adresse speichern.


von Georg X. (schorsch666)


Lesenswert?

Hallo,

ich benutze AVR-Studio 6 (GCC) und habe einen ATXMega64 µC.
Ich möchte für meine FW einen Header im Flash ablegen.
Der Header soll Version, Name, CRC usw. beinhalten.

Wie lege ich so eine Constante im Flash an einer bestimmten Adresse ab.
Eigentlich möchte ich den Header am Anfag des Flashbereichs haben.

Mit folgendem Code und dem Pragma PROGMEM kann ich die Variable im Flash 
ablegen. Aber nicht beeinflussen dass diese am Anfang des Flashes liegt.

const unsigned char header[11][10] PROGMEM =
{
{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09},
{0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13},
{0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D},
{0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27},
{0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31},
{0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B},
{0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45},
{0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F},
{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59},
{0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63},
{0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D}
};

Welchen Weg gibt es bei GCC und AVRStudio 6 um dies zu bewerkstelligen?

Danke.

Gruß,
Georg.

von Georg X. (schorsch666)


Lesenswert?

Hallo,


inzwischen ist mir bekannt wie ich mein array an eine beliebige Stelle 
im Flash ablegen kann.

static const unsigned char _attribute_ ((section (".HeaderSec"))) 
header[11][10]=
{
{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09},
{0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13},
{0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D},
{0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27},
{0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31},
{0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B},
{0x3C,0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,0x45},
{0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F},
{0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59},
{0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63},
{0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D}
};

Dem Linker muss dann mitgeteilt werden wohin die section .HeaderSec 
hingelegt werden muss.

Kennt sich jemand mit dem Linker besser aus als ich?

Wie teile ich dem Linker mit dass die section .HeaderSec soweit wie 
möglich nach vorne gelegt wird. Sprich nach der Vectortabelle usw.

Der Header sollte aber immer an der gleichen Stelle liegen damit ich 
diesen über die Adresse auslesen kann.

Danke.

Gruß,
Georg.

von Ulrich F. (Gast)


Lesenswert?

Ämm ..
Von "wo" willst du das Flash auslesen?
Wenn nicht vom Prozessor selber?

Warum reicht dir die Adresse von "header" nicht?
Die steht dir kostenlos zur Verfühgung.

von Georg X. (schorsch666)


Lesenswert?

Hallo,

ich habe den Flash quasi in 2 Teile aufgeteilt.
Der erste Teil wird bei Anlegen der Versorgung gestartet und soll den 2. 
Teil (dort liegt die eigentliche Applikation) prüfen und aufgrund dessen 
entscheiden ob der Bootloader oder die Applikation gestartet werden 
soll.

Dazu sollt der Header der Applikation immer an der gleichen Stelle 
liegen damit ich dort die notwendigen Daten zum Prüfen auslesen kann.

Danke.

Gruß,
Georg.

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.