mikrocontroller.net

Forum: Compiler & IDEs mspgcc const variable im flash beschreiben


Autor: Patrick Kögel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe gesehen dieses Problem wurde schon häufiger diskutiert. Habe
aber nicht die Antwort gefunden die ich gesucht habe. Ich habe ein
Programm welches nach dem Programmieren einmal in eine spezielle
Einstellfunktion springen soll und bei den weiteren starts dies nicht
mehr tuen soll. Deshalb brauche ich eine Variable welche ich im Flash
beschreiben kann. Habe aufgrund von den Posts folgendes gemacht.

const unsigned int FirstStart = 0; // Variable als const deklarieren
                                     so im flash speicher

if (FirstStart == 0)
{
  einstell();
      WriteFlash((unsigned int*)&FirstStart,1);
}


void WriteFlash( unsigned int *uintAddress, unsigned int uintData)
{
  WDTCTL = WDTPW+0x0c;
  asm("dint");
  while(BUSY & FCTL3);
  FCTL3 = FWKEY;
  FCTL1 = FWKEY + WRT;
  *uintAddress = uintData;
  FCTL1 = FWKEY;
  FCTL3 ^= (FXKEY + LOCK);
  asm("eint");
}

die flash Routine ist die wo bei mspgcc dabei ist.
Problem ist nun wenn ich das ausführe stürzt mein msp ständig ab und
fängt von vorne an. Weis jemand einen Rat...

Danke
Patrick

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Also mit dem mspgcc kenne ich mich ja noch nicht aus, für meine ersten
Schritte habe ich bis jetzt die IRA Workbench verwendet. Mein
Lösungsvorschlag: Definiere über ein #define eine Konstante, welche die
Adresse eines Stücks des für solche Dinge vorgesehenen
Informationsspeichers enthält. Dort schreibst du dann hin, ob der MSP
schon laufen drufte oder nicht. So würde ich das machen.

Gruss

Tom

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du die manuals aufmerksam gelesen hättest, wäre dir bekannt, das du
beim schreiben in's flash bits nur von 1 auf 0 setzen kannst. bei der
initieliesierung stehen also alle nicht vom programm genutzten bits auf
1. wenn du nun ein bit von 0 auf 1 setzen willst (oder einen neuen wert
an eine bestimmte speicherstelle schreiben willst), mußt du zunächst
das betroffenen speichersegment löschen. erst dann kannst du einen
neuen wert an eine bestimmte speicheradresse korrekt schreiben.

ein weiteres problem wird sein, das du mit dem const nicht definieren
kannst an welcher stelle im flash die konstante liegt. würdest du nun
mit der adresse der konstanten ein segment (512 byte) löschen, kannst
du nicht absehen was du alles löscht.

die beste losung meiner meinung nach ist es sie variable in den
information memory zu legen. dieser besteht aus 2 128 byte segmenten ab
adresse 1000h. dies sind die einzigen segmente die kleiner als 512 byte
sind und einzeln gelöscht werden können und sicher nicht vom programm
selber genutzt werden.

du legst fest, dass deine variable FirstStart zb. an der adresse 1000h
liegen soll. nach dem programmieren und 1. systemstart steht an dieser
adresse 0xff (wir erinnern uns, ein gelöschter bereich ist mit 1
vollgeschrieben). nach systemstart prüfst du also ob an adresse 1000h
0xff steht. ist dies der fall, schreist du an die adresse einen neuen
wert zb. 0x00. (ich incrementiere den wert bei jedem systemstart. somit
habe einen startupcounter).
solltest du den infomem für weiter variablen (log o. konfig) nutzen
wollen, solltest du vor jedem schreiben die entsprechenden werte
auslesen, dann das segment löschen und dann die aktualisierten werte
wieder reinschreiben.

Autor: Patrick Kögel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die ausführliche Antwort. Ich denke deine vorgehensweise wird
wohl so am besten sein. Aber wie definiere ich das meine Variable an
1000h steht das habe ich noch nicht herausgefunden. Zum schreiben muss
ich ja die obenstehende Routine verwenden, ist das richtig. Wenn nicht
wäre ich für einen Vorschlag sehr dankbar.

Patrick

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, du kannst nich definieren das deine variable an 1000h liegt.
du legst eine variable FirstStart an, dieser weist du den wert der
speicherstelle 1000h zu.

unsigned int FirstStart = *(unsigned int)0x1000;

um den wert zu ändern, löscht du zunächst das segment ab 1000h und
schreibst dann den neuen wert mit der von dir geseigten routine rein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.