Lecții de programare arduino

Lecții de programare arduino

Lecția descrie modul de lucru cu EEPROM-ul intern al plăcii Arduino, despre controlul integrității datelor în timpul stocării și transmisiei.

EEPROM intern în sistemul Arduino.







EEPROM este o memorie nevolatilă. Este descifrat ca memorie programabilă pentru citire electrică. Este folosit pentru a stoca date care trebuie să fie stocate atunci când alimentarea este oprită.

Cardurile Arduino au EEPROM de volume diferite în funcție de tipul de microcontroler utilizat.

Volumul EEPROM-ului intern

Această cantitate de memorie este suficientă pentru a stoca modurile, parametrii procesului, coeficienții etc.

  • Principiul EEPROM se bazează pe crearea unei sarcini electrice în dielectricul unei structuri semiconductoare. Taxele nu sunt întotdeauna depozitate, dar dezvoltatorii garantează 20 de ani.
  • EEPROM are un număr limitat de cicluri de înregistrare, de obicei cel puțin 100.000.
  • Pentru a înregistra informații în EEPROM este nevoie de un timp destul de lung, de aproximativ 3 ms.
  • EEPROM-ul de citire are loc fără întârziere, iar resursele de memorie nu scad.

Pentru a lucra cu memorie nevolatilă în Arduino există o bibliotecă EEPROM. Are două funcții pentru scrierea și citirea unui octet în EEPROM.

octet citit (adresa int)

void write (adresa int, valoarea byte)

Programul verifică înregistrarea în EEPROM.

Să scriem un program simplu pentru a verifica funcționarea EEPROM. Programul trebuie să înregistreze până la 16 simboluri primite de la portul serial și în ieșirea ciclului 16 simboluri citite de pe EEPROM. Folosind monitorul portului IDE Arduino, putem scrie date pe EEPROM și monitoriza conținutul de memorie nevolatilă.

// verificați funcționarea EEPROM
#include
int i, d;

void setup ()
Serial.begin (9600); // inițializați portul, viteza 9600
>

buclă voidă ()
// citiți datele EEPROM și ieșiți 16 la portul serial
Serial.println ();
Serial.print ("EEPROM =");
i = 0; în timp ce (i <16)
Serial.print ((caractere) EEPROM.read (i));
i ++;
>

// verificați dacă există date de scris
dacă (Serial.available ()! = 0)
întârziere (50); // așteptarea sfârșitului primirii datelor

Încărcăm programul în placa Arduino, verificăm. Deschideți portul monitorului, trimiteți date la bord: "Verificați EEPROM."

Lecții de programare arduino
Datele sunt scrise pe EEPROM și sunt afișate acum în fereastra monitorului. Dacă deconectăm cardul de la calculator și apoi reconectăm, datele vor continua să fie trimise la computer. Ele sunt stocate în memorie nevolatilă și nu se schimbă atunci când alimentarea este oprită.

Controlul integrității datelor.

EEPROM stochează de obicei date absolut necesare pentru ca programul să funcționeze. De exemplu, dacă faceți un controler de temperatură, atunci poate fi. temperatura setată, coeficienții de reglare, parametrii funcției de protecție și altele asemenea. Imaginați-vă că acești parametri vor fi corupți, iar controlerul va continua să funcționeze. Acesta poate activa elementul de încălzire la putere maximă și poate seta o temperatură inacceptabil de ridicată. Dacă coeficienții sunt incorecți, controlerul poate "intra în cârpe". Funcțiile de protecție vor înceta să funcționeze. Problemele vor fi minunate.

Dar situația în care EEPROM-ul ar putea fi date inexacte este destul de reală.

  • Când porniți dispozitivul pentru prima dată, datele din EEPROM sunt nevalide. Pur și simplu nu au fost întrebați încă.
  • La momentul scrierii datelor către EEPROM, puterea bordului poate fi întreruptă și apoi unele date vor fi înregistrate, iar altele nu vor fi în timp.
  • EEPROM are un număr limitat de cicluri de scriere și această proprietate poate duce de asemenea la coruperea datelor din această memorie.

Prin urmare, este extrem de important să fiți sigur că EEPROM stochează date fiabile. În cazul în care acestea sunt greșite, programul trebuie să întreprindă anumite acțiuni. Poate fi:

  • utilizați o copie a datelor din EEPROM;
  • utilizați date special create pentru modul de urgență;
  • Deconectați dispozitivul;
  • semnalează o eroare;
  • și multe alte opțiuni.






Integritatea datelor este un indicator că datele nu au fost modificate în timpul stocării, transmisiei, afișării și așa mai departe. Integritatea datelor poate fi verificată în orice situație care este potențial periculoasă pentru coruperea datelor. De obicei, controlul fiabilității datelor generează:

  • În memoria nevolatilă (EEPROM, FLASH, HDD ...).
  • Atunci când se transferă date (interfețe seriale, WiFi, GSM, TCP / IP ...).
  • În memorie pentru date deosebit de importante.
  • Unele componente (de exemplu, senzorul DS18B20) au un protocol de comunicație cu control al integrității.

Pentru a monitoriza integritatea, se adaugă un cod de control în blocul de date. Acest cod este calculat de un anumit algoritm la scrierea datelor. La verificarea datelor, codul este recalculat și comparat cu codul generat în timpul înregistrării. Dacă codurile nu se potrivesc, datele sunt incorecte.

Algoritmul de calcul al codului de control determină probabilitatea de a determina eroarea de date. Există un număr mare de algoritmi pentru generarea de coduri de control: coduri ciclice, diferite funcții de hash. Dar modul cel mai simplu de a calcula codul de control este suma de control.

Efectuați pur și simplu suma matematică a tuturor octelor din blocul de date. Un astfel de algoritm necesită un minim de resurse pentru implementare și, în același timp, permite o probabilitate destul de mare de a determina date eronate în cazul cantităților mici de informații. Suma de control poate fi de diferite cifre. În versiunea minimă, acesta este un octet. În acest caz, rezultatul depășirii sumei, ceea ce reduce probabilitatea de detectare a erorilor.

Aplic întotdeauna operația exclusiv-OR la ​​suma de control calculată cu cod ca E5h. Aceasta vă permite să excludeți o situație foarte probabilă când toate datele sunt 0. Suma 0 este 0. Prin urmare, dacă blocul de date este eronat zero (și acest lucru se întâmplă), atunci suma simplă nu calculează această eroare. Și când suma de control pentru toate 0 este egală cu E5h, eroarea va fi detectată.

Să adăugăm controlul integrității datelor la programul anterior.

// verificați funcționarea EEPROM
#include
int i, d;
suma de octeți; // suma de control

void setup ()
Serial.begin (9600); // inițializați portul, viteza 9600
>

buclă voidă ()
// calculul sumelor de control
suma = 0;
i = 0; în timp ce (i <16)
sumă + = EEPROM.read (i);
i ++;
>
Sumă de control sumă de control
dacă ((suma ^ 0xe5) == EEPROM.read (i))
// suma de control este corectă

// citiți datele EEPROM și ieșiți 16 la portul serial
Serial.println ();
Serial.print ("EEPROM =");
i = 0; în timp ce (i <16)
Serial.print ((caractere) EEPROM.read (i));
i ++;
>
>
altfel
// suma de control este incorectă
Serial.println ();
Serial.print ("EEPROM = eroare de date");
>

// verificați dacă există date de scris
dacă (Serial.available ()! = 0)
întârziere (50); // așteptarea sfârșitului primirii datelor

// scrieți la EEPROM
suma = 0;
i = 0; în timp ce (i <16)
d = Serial.read ();
dacă (d == -1) d = "; // dacă caracterele sunt terminate, spațiile goale
EEPROM.write (i, (octet) d); // Intrare EEPROM
suma + = (byte) d; // calculul sumelor de control
i ++;
>
EEPROM.write (i, suma ^ 0xe5); // scrie suma de control
>
întârziere (500);
>

Am notat doar că programul nu ia 16, dar 14 caractere, pentru că monitorul portului adaugă simbolurile liniei \ r și \ n fiecărui rând.

Descărcați programul și rulați monitorul.

Lecții de programare arduino

Mesajele de eroare de date se execută în fereastră. Nu am încărcat încă date în EEPROM, iar algoritmul recunoaște această situație. Trimitem o linie, de exemplu, "verificați". Acum, fereastra afișează date din EEPROM.

Lecții de programare arduino

În același mod, puteți proteja integritatea datelor de pe portul serial. Orice zgomot de impuls poate distorsiona semnalul din cablul de comunicație și poate provoca o eroare de date. Desigur, programul pentru primirea datelor pe computer trebuie să susțină un protocol cu ​​o sumă de control. Monitorul portului IDE Arduino nu are această funcție.

În următoarea lecție vom afla ce indicatori din C sunt pentru Arduino, vom învăța cum să scriem în EEPROM date de diferite tipuri (int, float ...).

E5h nu este o comandă de asamblare. Acesta este pur și simplu un număr care este adăugat la suma de control pentru a exclude situația atunci când toate datele sunt 0 și suma de control este 0.
Citez din lecție:
"Întotdeauna aplic operația exclusiv-OR la ​​suma de control calculată cu cod ca E5h. Aceasta vă permite să excludeți o situație foarte probabilă când toate datele sunt 0. Suma 0 este 0. Prin urmare, dacă blocul de date este eronat zero (și acest lucru se întâmplă), atunci suma simplă nu calculează această eroare. Și când suma de control pentru toate 0 este egală cu E5h, eroarea va fi detectată. "

O cale bună, dar există un dezavantaj.
Dacă programul are permisiunea de a schimba setările, nu toate datele, ci doar o parte și acestea vor fi salvate atunci când ieșiți din meniu. Și, de exemplu, există o mulțime de date. Aceasta va trebui să recalculeze de fiecare dată suma de control pentru toate datele.

Spuneți-mi, vă rog, înțeleg corect:
- Prin adăugarea tuturor octeților de conținut EEPROM la o sumă de octet, vom depăși în mod regulat acest octet, și
- la un moment dat, dar precis, suma trece prin 0
- informațiile despre termenii anteriori sunt aproape complet pierdute
- și dacă schimbăm două octeți în secțiunea secvență între tranziții prin 0, atunci
- cecul nostru nu dezvăluie nimic suspicios

este o vulnerabilitate? lasa probabilitatea unui astfel de eveniment si tinde la zero ...

Bine ai venit!
Dacă octetul este plin, informațiile nu sunt complet pierdute. Byte nu este resetat, dar restul de suma rămâne în ea. Deși, într-adevăr, suma nu este cea mai bună modalitate de a genera un cod de control. Acesta este cel mai simplu mod. Este mult mai eficient să se utilizeze codurile ciclice. În lecția 56, mă refer la acest subiect.







Articole similare

Trimiteți-le prietenilor: