Forum: Mikrocontroller und Digitale Elektronik Ram Test mit komischem Ergebnis


von Paule_ (Gast)


Lesenswert?

Hallo,

vor kurzem hatte ich Probleme mit meinem ext. RAM (32kx8). Daher wollte 
ich ein kleines Testprogramm schreiben, welches mir mal mitteilt, wann 
ein Schreib-/Lesefehler auftritt.
Dazu reserviere ich Speicherblöcke der Größe sizeof(char)*x mittels 
malloc(). Danach schreibe ich Werte hinein, lese diese wieder und schaue 
ob da was im Argen lag. Der Block wird wieder frei gegeben, x wird 
inkrementiert und das ganze beginnt wieder von vorn. Ist nicht besonders 
schön, aber einfach :)
Nun kam bei der Sache herraus, dass nach 10238 reserveirten Bytes ein 
Fehler auftrat. Komisch finde ich bei dieser Zahl nur, dass das ziemlich 
die Hälfte meines reservierten Heaps darstellt:
--defsym=__heap_start=0x804000,--defsym=__heap_end=0x808fff
Außerdem war es ein Schreib-/Lesefehler und kein Fehler bei der 
Reservierung des Speicherblocks.

Mein Verdacht viel auf eine weiter kalte Lötstelle bei einem Adresspin. 
Falls ich also zu heap_start die 10238 Byte hinzurechne komme ich auf 
die Adresse 0x806801, welche keinen signifikaten Sprung in der binären 
Adresse aufweißt. Ich bin mir aber auch nicht sicher, ob man das so 
rechnen darf. Ich lasse mir von meinem Testprog auch die Adresse des 
reservierten Speicherblockes zurückgeben, welche beim Abbruch dez 10238 
ist. Aber was zeigt mir diese Adresse? Einen Ort nach heap_start, also 
10238 + 0x804000?

Generell frage ich mich, ob dieses Verhalten noch normal ist, oder ob da 
wirklich noch wo der Wurm drin ist?


PS: mein anderer Beitrag 
Beitrag "SRAM liefert flasche Werte zurück"

von Paule_ (Gast)


Lesenswert?

sry

die ausgegebene Adresse ist 26625 und nicht 10238!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ist es nicht einfacher, alle Lötstellen zu überprüfen? Neue SRAMs sind 
in aller Regel zu 100% in Ordnung. Bei ausgelöteten oder sehr alten 
SRAMs kann es schon mal zu Merkwürdigkeiten kommen. Wichtig ist 
außerdem, daß die Betriebsspannung des SRAMs innerhalb der 
Spezifikationen liegt und das Schnittstellen-Timing genau eingehalten 
wird.

von oszi40 (Gast)


Lesenswert?

Auch wenn alle RAMs vom Werk aus "in Ordung" sind, könnte z.B. noch eine 
Zinnperle auf der Schaltung liegen.

Speicherfehler sind zwar selten geworden, aber gerade in den ersten 
Tagen nach der Montage kann man Frühausfälle häufiger beobachten. 
Deshalb ist ein kleiner Test nach der Bestückung immer lobenswert.

von Sepp (Gast)


Lesenswert?

Also diesen blöden Riegel hab ich jetzt schon 2 oder drei mal 
nachgelötet und des öfteren dessen Anschlüsse geprüft. Aber der Fehler 
bleibt.

Also nach mehreren Testläufen ist immer der Fehler bei 10238 Byts 
Blöckgröße aufgetreten. Da ich sonst keinen malloc Befehl ausführe, gehe 
ich davon aus, dass der Heap soweit leer ist. Also geht irgendwas bei 
der Speicheradresse von 0x8038FE schief.
Rein binär sollte bei der Adresse kein Bit gesetzt worden sein, welches 
vorher nicht auch schon mal gesetzt war und zu keinem Fehler geführt 
hat. Daher würde ich schon mal die Adressleitungen ausschließen. Die 
Datenleitungen könnens aber auch nicht sein, da ja bis dahin immer alles 
passte.
-> bin ratlos

Jetzt löte ich nochmal alles nach....

von Sepp (Gast)


Lesenswert?

Ach ja: Sepp = Paule_ ;)

von Paule_ (Gast)


Lesenswert?

Alles nachgelötet, aber keine Verbesserung/Änderung.

von Paule_ (Gast)


Lesenswert?

Hier mal mein Testprogramm. Evtl ist ja da der Wurm drin:
1
int main(void)
2
{
3
  init_hardware();
4
  uart1_init();
5
  char *pHeap;
6
  char *zeichen = "X";
7
  unsigned int size = 1;
8
  unsigned int isize = 0;
9
  rs232_puts("Initialisierung des Boards erfolgreich.");
10
  LED_RT(0);
11
  LED_GE(0);
12
  LED_GN(1);
13
14
  rs232_puts("Schreibe Werte in Heap. Bitte warten...");
15
16
  while(1)
17
  {
18
    //gelbe und rote LEDs blinken
19
    static uint16_t ledcnt,t;
20
    ledcnt++;
21
    if(ledcnt%100 == 0)
22
    {
23
      t=!t;
24
      LED_GE(t);
25
      LED_RT(t);
26
      
27
    }
28
    
29
                //Speicher reservieren
30
    pHeap = malloc(size);
31
    if(pHeap == 0){
32
      rs232_puts("malloc = 0");
33
      goto end;
34
    }
35
    
36
                //Beschreiben
37
    while(size!=isize){
38
      memcpy(pHeap+isize,zeichen,1);
39
      isize++;
40
    }
41
    isize=0;
42
    
43
                //Lesen
44
    while(size!=isize){
45
      if(memcmp(pHeap+isize,zeichen,1)!= 0){
46
        rs232_puts("ungleich");
47
        rs232_puts("Inhalt:");
48
        rs232_putcn(pHeap,isize+10); //evtl gibts ja noch was zu sehen
49
        goto end;
50
      }
51
      isize++;
52
    }
53
    isize=0;
54
      
55
    size++;
56
    free(pHeap);
57
  }
58
  end:
59
  rs232_puts("Abgebrochen bei einer Blockgroesse von:");
60
  rs232_puti((int)size);
61
  rs232_puts("Adresse:");
62
  rs232_puti((int)pHeap);
63
64
  return 0;
65
}

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.