Forum: Mikrocontroller und Digitale Elektronik LPCXpresso Flash Speicherbereich nicht vom Compiler verwenden lassen


von Oliver S. (os252)


Lesenswert?

Hallo,

ich habe einen LPC1115 µC, den ich mit LPCXpresso programmiere. Da diese 
Controller "nur" SRAM und Flash-Speicher (keinen EEPROM Bereich) 
besitzen, gibt es für die dauerhafte Speicherung von Daten die IAP 
Funtionen. Diese ermöglichen die Speicherung von Daten im Flash 
Speicher.

Das Abspeichern und wieder aus dem Flash funktioniert (auch nach einem 
Spannungsausfall sind die Daten vorhanden)

Nun ist allerdings mein Projekt gewachsen und scheinbar legt der 
Compiler Programmdaten in den Speicherbereich, den ich zum Speichern der 
Daten verwendet habe. Das darf natürlich auf keinen Fall passieren.

Nun könnte ich mir jedes Mal die Speicherbelegung nachsehen und den 
Bereich der Daten verschieben, aber kann man dem Compiler nicht 
mitgeben, welche Speicherbereiche nicht beschrieben werden dürfen (also 
freibleiben müssen)?

Eventuell habe ich auch einen Denkfehler drin, wäre nett, wenn ihr mich 
aufklären könnt.

Grüße,
Olli

von einfügen (Gast)


Lesenswert?

Oliver S. schrieb:
> Hallo,
>
> Nun könnte ich mir jedes Mal die Speicherbelegung nachsehen und den
> Bereich der Daten verschieben, aber kann man dem Compiler nicht
> mitgeben, welche Speicherbereiche nicht beschrieben werden dürfen (also
> freibleiben müssen)?
>

Das lässt sich per Linker-Script kontrollieren. Weiss aber nicht, ob 
LPCespresso das unterstützt

von Lutz (Gast)


Lesenswert?

Da gibt es ganz viele Wege. Im linker Script eine section erstellen und 
die Daten dort reinschreiben.
Es gibt wahrscheinlich auch fertige Makros dafuer in LPCOpen.
Oder im linker Script die Flashsize verringern und deine Daten dahin 
schreiben
Oder ....

von Christian K. (christian_rx7) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo.

Das funktioniert am leichtesten in den Projekteinstellungen in dem du 
die µC Einstellungen veränderst, siehe Anhang.
Beachte, dass die IAP Funktionen auch das Ended des RAMs verwenden und 
es somit nicht vom restlichen Programm verwendet werden soll. (Bei mir 
ab 0x1000 1FE0)
Ich verwende hier den Flash ab 0x0000 DFE0 für das Speichern von ein 
paar Parametern.

Die Funktion dazu sieht so aus:
1
/**
2
 * @brief  Schreibt die übergebene Node ID in den Flash
3
 *       __attribute__ ((section(".after_vectors"))) damit es nicht im zu löschenden Sektor liegt
4
 * @param  nodeID  : Node ID
5
 * @return  0 wenn erfolgreich
6
 *       1 bei Fehler
7
 */
8
__attribute__ ((section(".after_vectors"))) uint8_t Board_Address_Set(uint8_t nodeID)
9
{
10
  uint8_t flashBuffer[4096] __attribute__ ((aligned(4)));
11
  uint8_t sector = NODE_ID_FLASH_LOCATION >> 12;
12
  uint8_t* keyLocationBuffer = (uint8_t *)((NODE_ID_FLASH_LOCATION & 0x0FFF) + flashBuffer);    //Pionter auf NodeID im Puffer
13
14
  // Interrupts abschalten, damit nicht versehentlich in einen gerade gelöschten Speicherbereich gesprungen wird
15
  __disable_irq();
16
17
  //Flash sichern
18
  memcpy(flashBuffer, (uint8_t *)(NODE_ID_FLASH_LOCATION & 0xF000), 0x1000);
19
20
  //Node ID einfügen
21
  memcpy(keyLocationBuffer, &nodeID, 1);
22
23
  // Sektor für Löschen, freischalten und löschen
24
  if (IAP_PrepareSectors(sector, sector) != IAP_STA_CMD_SUCCESS)
25
  {
26
    __enable_irq();
27
    return 1;
28
  }
29
  if (IAP_EraseSectors(sector, sector) != IAP_STA_CMD_SUCCESS)
30
  {
31
    __enable_irq();
32
    return 1;
33
  }
34
35
  // Sektor für Schreiben, freischalten und schreiben
36
  if (IAP_PrepareSectors(sector, sector) != IAP_STA_CMD_SUCCESS)
37
  {
38
    __enable_irq();
39
    return 1;
40
  }
41
  if (IAP_CopyRAMToFlash((NODE_ID_FLASH_LOCATION & 0xF000), (uint32_t)flashBuffer, 4096) != IAP_STA_CMD_SUCCESS)
42
  {
43
    __enable_irq();
44
    return 1;
45
  }
46
47
  __enable_irq();
48
  return 0;
49
}

Viel Erfolg,
Christian_RX7

von Johannes S. (Gast)


Lesenswert?

Die MCU Settings hätte ich auch empfohlen. Das setzt voraus das du auch 
das 'Managed Linker Script' verwendest, also das LPCXpresso das selber 
generiert aus den MCU Settings.
Und es setzt voraus das überhaupt noch genügend Flash frei ist. Der Code 
wächst üblicherweise von Flash Start nach Ende, wenn der jetzt schon in 
die Daten reicht dann wird der Linker meckern mit 'region text 
overflowed with xxxx bytes' dann musst du erstmal Code abspecken. Die 
code size wird üblicherweise nach erfolgreichem kompilieren angezeigt, 
das lässt sich also leicht ausrechnen ob noch genügend Platz ist.

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.