-         

Ergebnis 1 bis 4 von 4

Thema: (Flash) Memory Section automatisch oder überprüfen mit #if

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672

    (Flash) Memory Section automatisch oder überprüfen mit #if

    Anzeige

    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:

    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    Hallo,

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

    Code:
    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:

    Code:
    #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

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Andreas,
    Zitat Zitat von Bumbum Beitrag anzeigen
    Jetzt Suche ich noch nach einer Möglichkeit einen Fehler zur kompilierungszeit zu erzeugen wenn der Bootloader-Bereich falsch konfiguriert wurde:

    Code:
    #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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    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

Ähnliche Themen

  1. [ERLEDIGT] memory löschen mit c
    Von Ritchie im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 30.08.2012, 20:27
  2. Memory Stick Micro (M2) mit ATMega read/write ?
    Von tc-maxx im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 31.01.2010, 17:21
  3. Flash Memory aus CF Card
    Von eurocopter im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 24.07.2009, 10:49
  4. überprüfen ob eine Phase da ist oder nicht
    Von roboter im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 30.01.2008, 11:45
  5. Antworten: 1
    Letzter Beitrag: 24.05.2007, 21:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •