NXP ARM7 CRC-Berechnung; C-Problem?

Hallo zusammen,

ben=F6tige wieder mal die Hilfe eines ARM7 bzw. C-Experten: Ich arbeite mit dem Keil Evakuation-Board mit dem 2368 von NXP und der Keil MDK Version 4.03. In meiner Software habe ich die Wahl, aus Kompatibilit=E4tsgr=FCnden = Daten =FCber den=20 I2C-Bus in ein externes RAM oder in den FLASH des Controllers zu = schreiben. Das Schreiben und Lesen ins RAM funktioniert einwandfrei, der CRC wird richtig = berechnet.

Das Speichern und Auslesen ins und aus dem FLASH funktioniert = anscheinend ebenfalls einwandfrei, nur bei der Berechnung des CRC nach dem Auslesen erhalte = ich ein falsches Ergebnis und wei=DF=20 nicht, weshalb. Die Daten werden richtig geschrieben und auch wieder = ausgelesen (jedenfalls lt. Debugger).

Wenn ich den CRC (ohne erneutes Schreiben oder Auslesen der Daten) 5 mal = berechnen lasse, erhalte ich 3 unterschiedliche Ergebnisse. Ich benutze haargenau die gleiche Routine und die gleichen Buffer wie = bei der Berechnung =FCber I2C.

Es werden im Flash keine Daten versehentlich =FCberschrieben oder = gel=F6scht. Auch stehen sie im Memory-Bereich an der richtigen Adresse. (Sie werden ja richtig ausgelesen.)

Wo ist der sch... Fehler?

Hat jemand eine Idee? Bin f=FCr jeden Hinweis oder Tip dankbar!

Freundlicher Gru=DF

Roland Kuhn

Hier mein Code (Ausz=FCge):

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=

>>>

#define START_ADRESS_DATA 0x00010000 // Startadresse Flashdaten

#define numFlash 512 // Blockgr=F6=DFe, Anzahl Bytes zum Schreiben

int i;

unsigned char rec_buf[numFlash]; unsigned char send_buf[numFlash]; long crc, crc_read;

for (i=3D0;i> 24)& 0xFF); // CRC anh=E4ngen send_buf[238]=3D(char)((crc >> 16)& 0xFF); // statt char > unsigned = char einstellen bringt nichts send_buf[239]=3D(char)((crc >> 8)& 0xFF); send_buf[240]=3D(char)(crc & 0xFF);

// hier die Daten =FCber den I2C-Bus ins RAM schreiben, funktioniert = einwandfrei send_to_ram(send_buf); // Daten ins RAM schreiben read_from_ram (rec_buf); // Daten aus RAM in rec_buf schreiben

crc=3Dcrc32i(&rec_buf[1],236); // CRC vom 1. Wert (nicht vom 0ten!) = =FCber 235 Bytes // berechnen crc_read=3D rec_buf[237]; crc_read=3D(crc_read>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=

>>>>>>>>>>>>>>
Reply to
Roland Kuhn
Loading thread data ...

Roland Kuhnschrieb: "

Schreiben

ebenfalls

falsches Ergebnis und weiß

(jedenfalls lt. Debugger).

berechnen lasse, erhalte ich 3 unterschiedliche Ergebnisse.

Berechnung über I2C.

[...]

Ich hab das besagte Board nicht und kann deshalb den Code so auch nicht nachvollziehen.

Warum machst du nicht mal beides parallel?

  1. Daten ins Flash und ins RAM schreiben.
  2. Ein Byte aus dem Flash lesen und mit crc() brerechnen.
  3. Ein Byte von I2C lesen und mit crc1() (wie crc() ) berechen.
  4. Die Ergebnisse von crc() und crc1() vergleichen und bei Ungleichheit abbrechen. Weiter mit 6.
  5. Weiter mit 2.
  6. Debuggen.

Dirk

Reply to
Dirk Ruth

Am Fri, 30 Apr 2010 20:06:24 +0200 schrieb "Roland Kuhn" :

Also konkrete Hinweise zur L=C3=B6sung kann ich nicht beitragen. Was ich tun w=C3=BCrde, w=C3=A4re mal in den vom Compiler erzeugten Assembler zu schaue= n, in welchen Registern der die CRC32 macht. Am Code selber k=C3=B6nnte man auch noch schrauben, damit's sch=C3=B6ner aussieht und man sofort sieht, was er tut. Ist aber rein kosmetisch.

unsigned long crc32i(unsigned char *txt,int l) { int i,j;

/* Die Variablen hbit und bit k=C3=B6nnte man genauso gut * im for-Block platzieren, allerdings braucht's die * eigentlich nicht */

- int hbit,bit;

/* so bekommt man zuverl=C3=A4ssig alle Bits 1,=20 * selbst wenn man mal den Typ =C3=A4ndert. */ unsigned long crc32 =3D 0; crc32 =3D ~crc32;

for (i=3D0;i> 1) ^ ( (( txt[i] >> j) ^ crc32) & 0x01 ? 0 : CRC32POLY ); }

- return (crc32^0xffffffff);

+ return ~crc32; }

Gr=C3=BC=C3=9Fe

Wolfgang

Reply to
Wolfgang Draxinger

Hi!

// Und jetzt kommts!

crc=crc32i(&rec[1],236); // Hier wird der CRC falsch berechnet!!!!!!!!!!

// Wenn ich den CRC 5 mal berechnen lasse, erhalte ich 3 unterschiedliche Werte

crc_read= rec_buf[237]; // Werte im Buffer sind in Ordnung!!!

--------------------------------------------- Also, berechnen in &rec[1] oder in &rec_buf[1]?

Igor.

Reply to
Igor "Knight" Ivanov

Hallo Igor,

Igor "Knight" Ivanov schrieb:

ohne mich mit dem Programm selbst beschäftigt zu haben, rec[] ist nirgends deklariert, wird da vielleicht was anderes überschrieben? &rec[1] muß doch auf den Anfang eines freien Speicherblocks zeigen, den sieht man hier nicht.

mfg. Winfried

Reply to
Winfried Salomon

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.