Unterschied zw. 2 Codeteilen
-
Guten Morgen zusammen!
Ich habe nur eine kleine Frage; bitte ned vor dem Code erschrecken

Um auf den Flash eines uC zu schreiben, hab ich die obere Funktion, die auch super funktioniert.
Die Funktion arbeitet mit Strukturen, welche folgendermaßen definiert sind:typedef struct { char bez[4]; // 5 uint8_t test[20] ; // 20 Bytes }test_s; test_s testarr[REGISTER_SET_SIZE];Jetzt habe ich eine zweite geschrieben, die allerdings anstatt einer Struktur ein zweidimensionales Array schreiben soll.
**Ich habe den Codeteil, der dies ausführt fett markiert.
Meine Frage dazu:
Was ist der Unterschied zwischen den beiden???
Ist da vielleicht nur ein kleiner Denkfehler?Im Prinzip muss ich ja nur Flash_ptr++ immer erhöhen und neue Werte in den Speicher schreiben.*
/* Diese Funktion ist ok */ void write_page( uint8_t* buffer, int length, int address){ int i = 0; uint8_t* Flash_ptr = (uint8_t*) address; __disable_interrupt(); FCTL3 = FWKEY; //Clear LOK Bit FCTL1 = FWKEY + ERASE; // Set Erase bit *Flash_ptr = 0; // lösche Inhalt der ganzen Seite while(FCTL3 & BUSY); FCTL1 = FWKEY + WRT; //Set WRT bit for write operation [b]for(i = 0; i < length; i++){ *Flash_ptr++ = *buffer++; while(FCTL3 & BUSY); }[/b] FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; //LOCK }/* Diese Funktion ist NICHT ok */ void write_ktxa_calibration(uint8_t byte_array[8][4], int length, int address){ int calib_ctr = 0; int calib_ctr_sub = 0; uint8_t* Flash_ptr = (uint8_t*) address; __disable_interrupt(); FCTL3 = FWKEY; //Clear LOK Bit FCTL1 = FWKEY + ERASE; // Set Erase bit *Flash_ptr = 0; // lösche Inhalt der ganzen Seite while(FCTL3 & BUSY); FCTL1 = FWKEY + WRT; //Set WRT bit for write operation [b]for(calib_ctr = 0; calib_ctr <=7; calib_ctr++){ for(calib_ctr_sub = 0; calib_ctr_sub <= 3; calib_ctr_sub++){ *Flash_ptr++ = byte_array[calib_ctr][calib_ctr_sub]; while(FCTL3 & BUSY); }[/b] FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; //LOCK }
-
Ich hab's jetzt mehrmals durchgelesen, ich habe immer noch keine Ahnung, was du überhaupt wissen möchtest. Hast du irgendeinen Fehler oder so? Und was hat die Struktur vom Anfang mit all dem zu tun?
-
Ich habe es wohl zu undeutlich beschrieben.
Also nur zwischen diesen beiden Zeilen (siehe Code) kann auf *Flash_ptr (= startadresse der memory-map) geschrieben werden.
Nachdem ein uint8_t auf geschrieben wurde, soll Flash_ptr erhöht werden, um den nächsten
8-Bit-Wert zu schreiben. Dies muss immer zwischen den beiden unteren Zeilen passieren.Die erste Funktion schreibt die Strukturen richtig in den Flash.
Die zweite, die ich geschrieben habe lässt sich zwar ausführen, doch
wenn ich mir im Anschluss den Inhalt des Flash ansehe, wurde falsch beschrieben.
(was genau falsch lief kann ich nicht sehen, weil im Fehlerfall der Flashbereich
einfach komplett auf true gesetzt wird.)Irgendwie schreibt die zweite Funktion nicht Stück für Stück die Daten auf den zugewiesenen
Speicherbereich.FCTL1 = FWKEY + WRT; //Set WRT bit for write operation // schreibe... FCTL1 = FWKEY; // Clear WRT bit
-
Hmm, sieht eigentlich richtig aus, zumindest der fett geschriebene Teil. Hast du schon einmal geprüft, ob in dem Array was du da schreibst, überhaupt das richtige drin steht? Falls bei beiden Varianten das gleiche geschrieben werden soll, kannst du dir ja mal zur Kontrolle in der Schleife das Geschriebene auch noch einmal auf die Konsole ausgeben lassen.
-
Katastrophaler Code.
Deine Veranstaltung zum Schreiben von 24 Bytes in einen Speicherbereich ist unportabel, auch ist das Schreiben von 1x24 Bytes etwas anderes als das Schreiben von 8x4 Bytes wie du gemerkt hast.
-
Bin dann ja schon froh, dass ich da keinen Denkfehler drinnen habe.

Werd das jetzt alles nochmal überprüfen.
Als Java-Programmierer die 3te Woche embedded zu programmieren, hat seine Tücken. :p
-
Wutz schrieb:
Deine Veranstaltung zum Schreiben von 24 Bytes in einen Speicherbereich ist unportabel
Schau dir den Code nochmal an und sag mir dann welche Rolle Portabilität hier spielt. Absolut keine. Setzen 6.
-
Also zuerst muss ich sagen, dass ich froh bin, hier Ansprechpartner für das ein oder andere Problem zu finden!
Bin aber niemand, der das ausnutzen will!!
Aber sehr dankbar, Hilfe zu bekommen!!
Einfach weil in der Firma Urlaubszeit ist, und ich mich ganz allein durchkämpfen muss und mir die Routine in der C-Programmierung fehlt.Ja, der Teil wird sowieso hardcodiert. Das war auch gar nicht meine Frage.
-
Du hast keine Ahnung oder kannst nicht lesen.
z.B. ist ein Cast von int auf Zeiger unportabel,
z.B. ist hier das Ignorieren des Strukturalignments unportabel,
-
Tim schrieb:
Schau dir den Code nochmal an und sag mir dann welche Rolle Portabilität hier spielt. Absolut keine. Setzen 6.