Externt eeprom och skriv-/läs-säkerhet
-
- Inlägg: 38
- Blev medlem: 29 januari 2004, 14:47:18
- Ort: Trollhättan
Externt eeprom och skriv-/läs-säkerhet
Hej
Jag bygger en logger som sparar data i ett externt eeprom. Efter en viss tid
ska datat hämtas, adderas med ett, och sedan sparas tillbaka. Det är
alltså mycket viktigt att den sparade och hämtade informationen är
korrekt.
Allt fungerar bra, men jag undrar nu hur ni brukar lösa det med
säkerheten? Hur vet ni att det värde ni läser är det som ni verkligen
sparade förra gången. Man skulle ju kunna tänka sig att datorn får någon
form av störning och startar om efter att halva värdet har skrivits till
eepromet. Då får man fel värde i eepromet och kommer att hämta fel
värde nästa gång. Hur brukar ni lösa sådana problem?
/Mattias
Jag bygger en logger som sparar data i ett externt eeprom. Efter en viss tid
ska datat hämtas, adderas med ett, och sedan sparas tillbaka. Det är
alltså mycket viktigt att den sparade och hämtade informationen är
korrekt.
Allt fungerar bra, men jag undrar nu hur ni brukar lösa det med
säkerheten? Hur vet ni att det värde ni läser är det som ni verkligen
sparade förra gången. Man skulle ju kunna tänka sig att datorn får någon
form av störning och startar om efter att halva värdet har skrivits till
eepromet. Då får man fel värde i eepromet och kommer att hämta fel
värde nästa gång. Hur brukar ni lösa sådana problem?
/Mattias
Det vanligaste sättet att öka säkerheten är att skriva värdet till flera olika
adresser i EEPROM'et. Antingen 3 gånger (och ta 2-av-3 som rätt värde)
eller 5 gånger (och ta minst 3-av-5 som rätt värde).
När det gäller störningar så får man nog helt enkelt se till att de inte
kan inträffa under skrivningen. T.ex att man kan tappa matningen
under de 5-10 ms skrivningen tar (stora kondensatorer) o.s.v.
Sedan, om du ofta skriver om samma position, måste du även ta
hänsyn till "endurance" och eventuellt "refresh", men det har du
kanske redan kontroll över.
Om du måste/vill skriva *väldigt* många gånger (och väldigt snabbt),
så kan du titta på FRAM-EEPROM från www.ramtron.com.
adresser i EEPROM'et. Antingen 3 gånger (och ta 2-av-3 som rätt värde)
eller 5 gånger (och ta minst 3-av-5 som rätt värde).
När det gäller störningar så får man nog helt enkelt se till att de inte
kan inträffa under skrivningen. T.ex att man kan tappa matningen
under de 5-10 ms skrivningen tar (stora kondensatorer) o.s.v.
Sedan, om du ofta skriver om samma position, måste du även ta
hänsyn till "endurance" och eventuellt "refresh", men det har du
kanske redan kontroll över.
Om du måste/vill skriva *väldigt* många gånger (och väldigt snabbt),
så kan du titta på FRAM-EEPROM från www.ramtron.com.
-
- Inlägg: 38
- Blev medlem: 29 januari 2004, 14:47:18
- Ort: Trollhättan
Tack för ditt svar. Jag har hittills tänkt mig den lösning du föreslog, alltså
att spara data på flera ställen.
Om du med endurance menar antal skrivningar man kan göra så har jag
nog koll på det. Man får väl anta att databladets siffror om 100000
Erase/Write cykler stämmer? Jag kommer maximalt att använda 25000 av
dessa.
Jag känner däremot inte till begreppet "refresh" i samband med eeprom.
Vad menar man med det?
/Mattias
att spara data på flera ställen.
Om du med endurance menar antal skrivningar man kan göra så har jag
nog koll på det. Man får väl anta att databladets siffror om 100000
Erase/Write cykler stämmer? Jag kommer maximalt att använda 25000 av
dessa.
Jag känner däremot inte till begreppet "refresh" i samband med eeprom.
Vad menar man med det?
/Mattias
Mitt sätt:
Grundläggande är att man läser det man precis skrivit för att se att det blev rätt.
Man kan även räkna ihop en kontrollsumma som man också lagrar till varje minnesplats, och på så vis se om datan är korrekt, dubbletter eller mer av all viktig data.
Ett sätt att mjukvarumässigt skydda sig mot strömavbrott mitt under skrivning
kan vara att man alltid på ett speciellt ställe i minnet först skriver datan och tillhörande adress, (självklart med kontrollsumma för adress och data.)
Vid varje uppstart så låter man gå igenom alla minnesplatser och kontrollera alla kontrollsummor, och rätta de som går att rätta.
Och kolla speciallstället för att se om senaste skrivningen lyckades.
Grundläggande är att man läser det man precis skrivit för att se att det blev rätt.
Man kan även räkna ihop en kontrollsumma som man också lagrar till varje minnesplats, och på så vis se om datan är korrekt, dubbletter eller mer av all viktig data.
Ett sätt att mjukvarumässigt skydda sig mot strömavbrott mitt under skrivning
kan vara att man alltid på ett speciellt ställe i minnet först skriver datan och tillhörande adress, (självklart med kontrollsumma för adress och data.)
Vid varje uppstart så låter man gå igenom alla minnesplatser och kontrollera alla kontrollsummor, och rätta de som går att rätta.
Och kolla speciallstället för att se om senaste skrivningen lyckades.
Angående "refresh".
Ofta är det så att en skrivning till en viss adress ger en liten "urladdning"
av *andra* adresser. Så om dessa andra adresser inte skrivs om de
också, så kommer man till en punkt då alla adresser som inte har
skrivits om, behöver en "refresh".
Detta kan naturligtsvis variera mellan olika fabrikat o.s.v.
T.ex det interna EEPROM minnet i PIC processorer har en "refresh"
parameter i databladet som man ska/bör ta hänsyn till.
Ofta är det så att en skrivning till en viss adress ger en liten "urladdning"
av *andra* adresser. Så om dessa andra adresser inte skrivs om de
också, så kommer man till en punkt då alla adresser som inte har
skrivits om, behöver en "refresh".
Detta kan naturligtsvis variera mellan olika fabrikat o.s.v.
T.ex det interna EEPROM minnet i PIC processorer har en "refresh"
parameter i databladet som man ska/bör ta hänsyn till.
Nu vet jag inte hur datan du loggar ser ut eller så, men jag skulle förmodligen göra något i den här stilen:
För varje data "entry", lagra själva datan + en giltighetsflagga + en checksumma av något slag. Reservera två platser i eepromet istället för bara en.
Läs in den gamla datan, modifiera den, och skriv det nya värdet på den lediga platsen i eeprom (giltighetsflaggan ska inte vara satt på den platsen). Läs ut det nya värdet och verifiera att det är korrekt. Nu kan du sätta flaggan på den nya platsen, beräkna och skriva checksumman, och sist ta bort flaggan på den gamla platsen.
Lita bara på datan om flaggan är satt och checksumman är korrekt...
För varje data "entry", lagra själva datan + en giltighetsflagga + en checksumma av något slag. Reservera två platser i eepromet istället för bara en.
Läs in den gamla datan, modifiera den, och skriv det nya värdet på den lediga platsen i eeprom (giltighetsflaggan ska inte vara satt på den platsen). Läs ut det nya värdet och verifiera att det är korrekt. Nu kan du sätta flaggan på den nya platsen, beräkna och skriva checksumman, och sist ta bort flaggan på den gamla platsen.
Lita bara på datan om flaggan är satt och checksumman är korrekt...
-
- Inlägg: 38
- Blev medlem: 29 januari 2004, 14:47:18
- Ort: Trollhättan
Tack för era förslag, dom låter intressanta.
För att reda ut vad det är jag sparar så tänkte jag kort förklara det. I
princip är det bara ett tal som växer från 1 till 25000 som skall sparas.
Första gången sparar jag 1, nästa gång 2, osv. EEPROMET skall bara användas
för att spara detta tal och säkerställa att det finns kvar efter ett
strömavbrott/störning. Det är egentligen inget komplicera, d.v.s. om inte
det inte fanns störningar...
Jag ska jobba vidare på en lösning.
/Mattias
För att reda ut vad det är jag sparar så tänkte jag kort förklara det. I
princip är det bara ett tal som växer från 1 till 25000 som skall sparas.
Första gången sparar jag 1, nästa gång 2, osv. EEPROMET skall bara användas
för att spara detta tal och säkerställa att det finns kvar efter ett
strömavbrott/störning. Det är egentligen inget komplicera, d.v.s. om inte
det inte fanns störningar...
Jag ska jobba vidare på en lösning.
/Mattias