Forum: Compiler & IDEs Atmel Cortex-M3: settings im flash speichern


von Fabian B. (fabs)


Lesenswert?

Servus,
 ich benutze einen ATSAM3S2B Cortex-M3 Controller und möchte einige 
Settings im internen Flash speichern. Ein EEProm gibt's ja nicht.
 Hierzu habe ich ein Array definiert, das an Adresse 0x41C300 im Flash 
liegt (Page 451 von 512).

Die Atmel ASF bietet für Zugriffe auf's Flash ja nun die NVM Library an, 
und diese dann die Funktion "nvm_write".
 Leider scheint diese Funktion gern mal zu hängen, was dann zu einem 
totalen Lock des Systems führt.
 Da es manchmal funktionierte, habe ich schon an Interrupts gedacht, 
aber selbst wenn ich diese vor dem nvm_write deaktiviere, lockt das 
system.

Mein Aufruf:
1
    cpu_irq_enter_critical();
2
      nvm_write(INT_FLASH, (uint32_t)&myData, (void *)(&payload[9]), 256);
3
    cpu_irq_leave_critical();
Payload ist dabei ein Array, das die zu schreibenden Daten enhält 
(uint8_t payload[7680]. MyData ist das Array an Adresse 0x41C300.

Kenn jemand das Problem oder einen Workaround?

Gruß
Fabian

von Fabian B. (fabs)


Lesenswert?

So.
Ich habe jetzt noch festgestellt, dass das schreiben (scheinbar) 
zuverlässig funktioniert, wenn ich einmal vorher im Programm
1
  nvm_get_size(INT_FLASH, &mem_size);
2
  nvm_get_page_size(INT_FLASH, &page_size);
aufrufe. Wo scheint egal zu sein.
Da diese Aufrufe eigentlich keinen Bezug zum Schreiben haben, sondern 
nur einen Wert zurückgeben (den ich dann auch gleich wieder verwerfe) 
ist das schon komisch.

Ein fahler Geschmack bleibt... erinnert mich ein bischen an die 
unvollständig definierte Init-Funktion vom TC-Modul...

Gruß
Fabian

von Steffen R. (steffen_rose)


Lesenswert?

Ich würde eher davon ausgehen, dass diese Funktionen eine von Dir 
vergessene (Initialisierungs-)Funktion aufrufen.

von Steffen R. (steffen_rose)


Lesenswert?


von Fabian B. (fabs)


Lesenswert?

Hallo Steffen,
 die Init rufe ich natürlich vor allem auf, aber wenn man sich diese mal 
ansieht, dann tut sie für "INT_FLASH" genau gar nix produktives (ausser 
ein return STATUS_OK;).
Ist schon richtig, vermutlich werden die genannten Funktionen noch 
irgendwas initialisieren, aber das ist dann schon recht dirty...

Hat keiner "persönliche" Erfahrungen mit der ASF und den M3?

Gruß
Fabian

von Fabian B. (fabs)


Lesenswert?

Zusätzlich:
 ein ähnliches Problem habe ich auch beim setzten der GPNVM Bits 
(Security/Boot). Auch hier hängt das System.

Da in beiden Fällen die gleich ASF Funktion hängt denke, ich es wir auch 
die gleiche Ursache haben:
Beim Befehl

  p_efc->EEFC_FCR = ul_fcr;
in "RAMFUNC uint32_t efc_perform_fcr(Efc *p_efc, uint32_t ul_fcr)" 
[efc.c]

stirbt mir das System.

Ich habe jetzt bei Atmel einen Bug gefiled, weil ich auch kaum usecases, 
oder Beschreibungen dazu im Netz finde: 
http://asf.atmel.com/bugzilla/show_bug.cgi?id=3381

Gruß
Fabian

von Fabian B. (fabs)


Lesenswert?

Ich habe das Problem scheinbar auf die Optimizer Settings runter 
gebrochen.

Das Problem ensteht nur mit -O2, mit -O1 läuft alles einwandfrei.

Vielleicht hilft's ja noch jemandem...

Gruß
Fabian

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.