Upload
saskia-dijkstra
View
220
Download
0
Tags:
Embed Size (px)
Citation preview
Een print
Hardware testen
door middel van software
Geheugen testen
Hoofdstuk 14,
Programming embedded systems
With C and GNU Development tools
Michael Barr& Antony Massa
O’Reilly
Ontbreken van geheugen chips
Databus
Adresbus
CPU
MEMORY
MEMORY
Ontbreken van geheugen chips
o Sommige geheugen testen:schrijven en lezen onmiddelijk daarna.
• Een ontbrekende geheugen chip hoeft niet altijd geselecteerd te worden
Door de capacitaire werking kan het zijn dat de waarde van het schrijfen nog op de lijn aanwezig is wanneer er gelezen wordt.
Ontbreken van geheugen chips
1.Schrijf waarde naar geheugenadres1Lees waarde van geheugenadres1
2.Schrijf waarde naar geheugenadres2Lees waarde van geheugenadres2
Geheugentest zou er als volgt uitkunnen zien
• Niet aangesloten geheugen chip 2
• de ingelezen waarde is gelijk aan geschreven waarde
Ontbreken van geheugen chips
1.Schrijf waarde1 naar geheugenadres12.Schrijf waarde2 naar geheugenadres23.Lees waarde1 naar geheugenadres14.Lees waarde2 naar geheugenadres2
Geheugentest zou er als volgt uitkunnen zien
• Niet aangesloten geheugen chip 2 de gelezen waarde van chip 2 is waarde 1
Geheugenchips die fout ingeprikt zijn
Systeem zal zich gedragen alsof er een probleem is met de data en adres bus of dat een geheugenchip er niet erin zit
Een test van de data en adres lijnen en een test voor het ontbreken van geheugenchips komt het probleem vanzelf naar boven
Ontwerpen van een test strategie
• Wees voorzichtig met het selecteren van de test data.
• Wees voorzichtig met de volgorde van de adressen.
• Deel het geheugen op in kleine testbare delen.
o Hoge test efficientie
o Hoge leesbare code
• Hoe specifieker de test des te meer informatie verkregen wordt.
Ontwerpen van een test strategie
• Wees voorzichtig met het selecteren van de test data.
• Wees voorzichtig met de volgorde van de adressen.
• Deel het geheugen op in kleine testbare delen.
o Hoge test efficientie
o Hoge leesbare code
• Hoe specifieker de test des te meer informatie verkregen wordt.
Ontwerpen van een test strategie
3 individuele testen
1. Device test
2. Databus test
Device test
Test van de geheugen chip.
• Test of elke bit binnen de chip op 1 of 0 gezet kan worden.
• Makkelijk te implementeren maar moeilijk uit te voeren.
• Moet naar elke locatie geschreven en hierop gecontroleerd worden.
• Elke waarde voor de eerste helft, de geinverteerde voor de 2e helft.
Device test
1. Doe een increment test
2. Doe een decrement test
Incrementele data patroon is adequaat en eenvoudig te berekenen
Voorbeeld:
• Breedte databus is 8 bits
• 64 kbyte testen
Meest 16 rechtse bits
Device test
Memory offset Binary value Inverted value
00h 00000001 11111110
001h 00000010 11111101
002h 00000011 11111100
003h 00000100 11111011
…….. …….. …….
0FEh 11111111 00000000
0FFh 00000000 11111111
memTestDevice(volatile datum * baseAddress, unsigned long nBytes){ unsigned long offset; unsigned long nWords = nBytes / sizeof(datum); datum pattern; datum antipattern; /*Fill memory with a known pattern.*/ for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) { baseAddress[offset] = pattern; }/*Check each location and invert it for the second pass. */ for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) { if (baseAddress[offset] != pattern) { return ((datum *) &baseAddress[offset]); }
antipattern = ~pattern; baseAddress[offset] = antipattern; }
/*Check each location for the inverted pattern and zero it. */ for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) { antipattern = ~pattern; if (baseAddress[offset] != antipattern) { return ((datum *) &baseAddress[offset]); } }
return (NULL);
} /* memTestDevice() */
Beschrijving zie: http://www.esacademy.com/faq/docs/memtest/index.htm
Valideren van geheugen inhoud
Het maken van een geheugentest heeft niet veel zin bij ROM of hybride geheugens.
Hoewel sommige geheugens problemen kunnen optreden.
- Verkeert invoeren
Een bevestigingtest nodig
Bevestiging (confirmation) technieken
Valideren van geheugen inhoud
- Checksum- Cyclic redundancy checks (CRC)
Checksum
Is een manier om te bepalen of een programma goed in een non-volatile geheugen is opgeslagen.
Bereken de checksum voordat het in een geheugen gezet wordt.
Zet het programma of data in het geheugen.
Bereken opnieuw de checksum van het programma of data die opgeslagen is
Checksum
Het berekenen van de checksum.
Eenvoudigste manier: Tel alle bytes op, negeer de carry.
Nadeel:
- Optelling van 00 bij elkaar blijft 0
- Werkt alleen wanneer 1 bit fout is.
Checksum
Waar op te slaan:
- In routine die het geheugen checked
Nadeel:
Bij updates, checksum moet ook overschreven worden.
Oplossing: Zet checksum op een vaste plaats in het geheugen.
Werking van flash geheugen
Lezen geen probleem.
Schrijven naar flash een aantal problemen
• Elke geheugenlocatie moet eerst ge-erased worden voordat deze herschreven kan worden.
• Oude data niet erased => het resultaat van een schrijf operatie is combinatie van oude en nieuwe waarden.
• Alleen een sector of block van een device kan per keer ge-erased worden.
• Er kan niet per byte ge-erased worden.• Het erase van oude data en het schrijven van nieuwe data is niet
uniform maar kan fabriek afhankelijk zijn.
De databus (voorbeeld 8 bits)
Databus
Adresbus
CPU
Controle lijnen
MEMORY
MEMORY
D7
D6
D1
D0
Foute verbindingen
Dataline problemen
• Bits zouden stuk kunnen zijn.
• Twee of meer bits bevatten dezelfde waarde, ongeacht de gegevens worden overgedragen.
• Bit kan altijd 0 zijn.
• Bit kan altijd 1 zijn.
Bovenstaande problemen kunnen gedetecteerd worden, door de data-pinnen onafhankelijk van elkaar een 1 of een 0 te maken.
Databus test
• Controleer of de waarde die op de bus gezet is door het geheugen goed ontvangen is.
• Test bit voot bit.
• Doe een “wandelende 1” test.
• Reduceer het aantal testpatronen van 2n naar n.
• Omdat het een databus test is, hoeft er maar naar 1 adres geschreven te worden
• Wanneer de databus gesplitst wordt zal naar elke uiteinde geschreven moeten worden
Databus test
• 00000001• 00000010• 00000100• 00001000• 00010000• 00100000• 01000000• 10000000
Schrijf de eerste waarde naar het geheugen
Controleer de waarde door het terug te lezen
Schrijf de tweede waarde
Etc.
datum memTestDataBus(volatile datum * address){ datum pattern;/** perform a walking 1’s test at the given address*/ for (pattern = 1; pattern != 0; pattern <<= 1) { /* write the test pattern */ *address = pattern;
/* read it back (immediately is ok for this test) */
if (*address != pattern) { return pattern; } } return 0;}
typedef unsigned char datum;