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
Ontbreken van geheugen chips oSommige 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 geheugenadres1 Lees waarde van geheugenadres1 2.Schrijf waarde naar geheugenadres2 Lees 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 geheugenadres1 2.Schrijf waarde2 naar geheugenadres2 3.Lees waarde1 naar geheugenadres1 4.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 offsetBinary valueInverted value 00h h h h …….. ……. 0FEh FFh
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:
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.
Cyclic Redundancy checke Is een speciaal soort checksum test Werkt met een stream van bits die door een polynoom van k termen gedeeld wordt. De rest wordt ervan afgehaald. v.b. polynoom: X 16 +X 15 +X 2 +1
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 D7D7 D6D6 D1D1 D0D0
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 2 n 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 Schrijf de eerste waarde naar het geheugen Controleer de waarde door het terug te lezen Schrijf de tweede waarde Etc.
/******************************************************** * *Function: memTestDataBus() * *Decription: Test the data bus wiring in a memory region by * performing a walking 1’s test at a fixed address * within that region. The address (and hence the * memory region) is selected by the caller. * * Returns: 0 if the test succeeds * A nonzero result is the first pattern that failed * *********************************************************/
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;