PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Flash) Memory Section automatisch oder überprüfen mit #if



Bumbum
26.11.2014, 07:57
Hallo,

mein Thema ist etwas komplex und ich hoffe der Titel des Threads ist einigermaßen passend. Ich muss bei einem Atmel-Prozessor den Flash-Speicher während der Laufzeit ändern. Dies geht laut Atmel nur, wenn der entsprechende Code zur Flash-Manipulation im bootloader-Bereich liegt. Dies habe ich wie folgt gelöst:



void setup_write (void) BOOTLOADER_SECTION;


Das ganze funktioniert wunderbar, nur muss ich die .bootloader Section manuell in den Projekt-Optionen einstellen. (Unter Memory Settings). Wenn ich diese konfiguration weg lasse, wird automatisch eine .bootloader-Section konfiguriert. Ich erhalte aber eine Warnung über eine Überlappung mit einer anderen Sektion.

Kann man diese falsche automatische Konfiguration irgendwie umgehen und die Memory-Sektion automatisch richtig konfigurieren lassen? (Ich nutze AVR-Studio 4.19, Build 716)

Ansonsten: Ist es möglich im Code anstatt in den Projekt-Optionen die Memory-Sektion zu konfigurieren? Zum Beispiel mit einem #define? Ich habe bei meiner Suche im Netz leider nichts dazu gefunden.

Der Grund für meine Frage ist, dass ich den Programmteil auf verschiedenen Controllern verwende. Wenn ich vor dem flashen nicht aufpasse und die Projekt-Konfiguration manuell ändere erhalte ich überhaupt keine Fehlermeldungen, das Programm funktioniert nur in dem Teil nicht, da der Programmbereich dann nicht im Bootloader-Bereich liegt.

Ein Workaround wäre die Position der Memory Sektion abzufragen mit einem #if Befehl. Aber auch dazu habe ich leider nichts gefunden. Wenn das aber ginge (z.B. #if Section (".bootloader") == #0x3800 könnte ich in Kombination mit den definierten _AVR #defines eine Warnung beim compilieren ausgeben, wenn der Bootloader-Bereich falsch ist.

Kann mir jemand weiterhelfen?

Viele Grüße
Andreas

Bumbum
26.11.2014, 14:14
Hallo,

mir ist jetzt selbst eine Möglichkeit eingefallen die korrekte Position der Funktion im Bootloader-Bereich zu prüfen. Leider nur zur Laufzeit:



void *ptrSetup_Write = &setup_write;

if (ptrSetup_Write == 0x3800)

Ok
else
Fehler


Jetzt suche ich noch nach einer Möglichkeit einen Fehler zur kompilierungszeit zu erzeugen wenn der Bootloader-Bereich falsch konfiguriert wurde:



#if (ptrSetup_Write == 0x3800)
#error Ok
#else
#error Falsche Adresse für .bootloader-Section!
#endif


Funktioniert leider nicht. Kann mir hier jemand einen Tipp geben ob und wie das zu lösen ist?

Viele Grüße
Andreas

Peter(TOO)
26.11.2014, 14:26
Hallo Andreas,

Jetzt suche ich noch nach einer Möglichkeit einen Fehler zur kompilierungszeit zu erzeugen wenn der Bootloader-Bereich falsch konfiguriert wurde:



#if (ptrSetup_Write == 0x3800)
#error Ok
#else
#error Falsche Adresse für .bootloader-Section!
#endif


Funktioniert leider nicht. Kann mir hier jemand einen Tipp geben ob und wie das zu lösen ist?

Klar geht das so nicht, schon alleine weil die Adressen erst beim Linken festgelegt werden!
Beim Compilieren kannst du das nur überprüfen, wenn du die entsprechenden Konstant auch dort festlegst.

Ich kenne deinen Compiler nicht, aber es müsste eigentlich bei den #pragma-Anweisungen etwas geben um Speicherbereiche festzulegen.

MfG Peter(TOO)

Bumbum
26.11.2014, 15:19
Hallo Peter,

mir war das schon bewußt, dass die Adresse erst zur Laufzeit zugewiesen wird. Es war mehr symbolisch gedacht. Als Compiler nutze ich WinAVR (20100110). Leider habe ich keine Auflistung der möglichen #pragma-Direktiven gefunden. Kann mir da jemand helfen?

Viele Grüße
Andreas