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
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
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 ....
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.