Cum să efectuați actualizări de firmware fără a opri execuția acestuia

by donpedro

Aplicațiile IoT (Internet of Things – Internetul Lucrurilor) bazate pe senzori, se extind, la fel și dimensiunea și complexitatea firmware-ului microcontrolerului pentru nodurile terminale ale rețelei IoT. Pentru a accelera execuția, firmware-ul trebuie să devină mai eficient, motiv pentru care actualizările locale ale firmware-ului încărcat în memoria flash sunt o necesitate. Cu toate acestea, un update al firmware-ului într-o manieră securizată necesită, de obicei, oprirea executării firmware-ului în timp ce actualizarea este în curs. În funcție de arhitectură, de dimensiunea actualizării și de viteza rețelei, aceasta poate fi realizată rapid, într-un minut, dar poate dura chiar și o oră. Pentru aplicațiile critice, această întârziere nu poate fi acceptabilă.

Acest articol explică considerentele pentru actualizarea locală a firmware-ului bazat pe întreruperi și necesitatea menținerii executării firmware-ului aplicației în timp ce actualizarea are loc. Ulterior, articolul prezintă microcontrolerul PIC32MZ2048EFH144T-I / PH de la Microchip Technology și arată cum poate fi folosit pentru a rula firmware-ul existent în timp ce se permite actualizarea acestuia printr-o rețea.

Importanța actualizărilor firmware-ului

Firmware-ul este actualizat din patru motive principale: corectarea erorilor din program, adăugarea de noi funcții sau îmbunătățirea funcțiilor vechi, ajustarea securității sistemului și creșterea eficienței firmware-ului. Eficiența codului se calculează în funcție de numărul de cicluri de ceas necesare pentru a îndeplini o anumită sarcină sau a unui fir de execuție. Cu cât sunt necesare mai puține cicluri de ceas pentru a efectua o sarcină, cu atât este mai eficient programul, care crește viteza de execuție și reduce, de obicei, (nu întotdeauna) dimensiunea codului. Acest lucru este valabil mai ales pentru dispozitivele terminale din rețeaua IoT bazate pe senzori, deoarece aceste aplicații sunt bazate pe întreruperi și deci trebuie să schimbe rapid ordinea execuțiilor ori de câte ori un senzor sau un o componentă periferică generează o întrerupere.

Doi factori care afectează eficiența aplicațiilor IoT bazate pe întreruperi sunt eficiența arhitecturii și a codului. În timp ce modificarea arhitecturii unui microcontroler din teren nu este o soluție fezabilă, este normal și practic să se actualizeze firmware-ul microcontrolerului pentru îmbunătățirea eficienței.

Firmware-ul pentru aplicații cu senzori este aproape întotdeauna bazat prin întreruperi. Senzorii inteligenți conectați la un port serial al microcontrolerului pot genera o întrerupere la microcontroler pentru a opri execuția normală, astfel încât firmware-ul să poată executa o rutină de întrerupere pentru acel senzor. Acest lucru este mai eficient decât utilizarea senzorilor care au nevoie de interogare periodică pentru a determina dacă registrul de citire al acestora are date noi de transmis. Avantajul strategiei bazate pe întreruperi generate de senzori este că microcontrolerul folosește cicluri de ceas pentru citirea senzorului doar atunci când există date de primit. Interogarea risipește ciclurile de ceas atunci când firmware-ul trebuie să acceseze senzorul pentru a citi date care sunt deja descărcate, deoarece registrul de citire a senzorului nu a fost actualizat.

Cu cât sunt mai sunt mulți senzori și mai multe sarcini de executat, cu atât există și trebuie gestionate mai multe subrutine și rutine de întrerupere, crescând astfel dimensiunea codului. Programele complexe necesită o formă de sistem de operare în timp real (RTOS) pentru a gestiona toate aceste sarcini distincte. RTOS poate fi o aplicație firmware simplă, scrisă de inginerul software sau un produs al unei părți terțe. RTOS gestionează diferite sarcini de firmware pentru a se asigura că fiecare sarcină individuală începe și se termină în timp util pentru ca aplicația să funcționeze corect. Dacă mai multe sarcini trebuie gestionate de RTOS, este benefic ca aplicația să finalizeze aceste sarcini în cât mai puține cicluri de ceas. Acest lucru previne ca diverse sarcini să se întârzie reciproc.

Atunci când se primește o întrerupere, timpul necesar pentru a finaliza rutina de tratare a întreruperii este o combinație de trei factori:

  1. Ciclurile de ceas necesare pentru a recunoaște întreruperea și pentru a trece direct la rutina de tratare a întreruperii. Dacă sarcina are prioritate mai mică decât cea care se execută, aceasta va fi întârziată până la finalizarea activității curente. Acest lucru depinde de aplicație.
  2. Ciclurile de ceas necesare pentru a salva modul de stare a unității centrale (CPU) și trecerea la rutina de tratare a întreruperii. Acest lucru depinde de arhitectură și nu este sub controlul inginerului software.
  3. Ciclurile de ceas necesare pentru a executa rutina de tratare a întreruperii. Acest lucru depinde atât de complexitatea, cât și de eficiența codului scris de inginerul de software.

Cu cât firmware-ul este mai eficient, cu atât este mai puțin probabil să apară un conflict între sarcinile care trebuie finalizate într-o anumită perioadă de timp.

Cerințe de memorie flash pentru actualizarea firmware-ului

Sistemele din teren care trebuie actualizate în mod fiabil necesită de două ori memoria flash de program necesară aplicației. Acest lucru se întâmplă deoarece memoria flash trebuie să fie suficient de mare pentru a conține atât firmware-ul existent, cât și firmware-ul actualizat. Cu toate acestea, pentru sistemele mici, care rulează programul numai din memoria flash internă, este uzual să se oprească executarea programului în timp ce actualizarea firmware-ului este primită prin rețea. Acest lucru nu poate fi acceptabil pentru aplicațiile cu obiective critice și este contrar ideologiei unui firmware eficient – de exemplu, atunci când codul este oprit, eficiența aplicației este de zero la sută!

Executarea firmware-ului în timpul actualizării memoriei flash

Figura 1: Microcontrolerul PIC32MZ2048EFH144T-I/PH de la Microchip Technology de 252 MHz se bazează pe o arhitectură MIPS32 M-Class și dispune de o gamă largă de porturi seriale pentru interfațarea cu senzorii externi. (Sursa imaginii: Microchip Technology)

Un microcontroler de înaltă performanță, care poate executa firmware-ul în timp ce actualizează memoria flash integrată este microcontrolerul PIC32MZ2048EFH144T-I/PH de la Microchip Technology (Figura 1). PIC32MZ2048EFH144T-I/PH se bazează pe o arhitectură cu nucleu MIPS32 M-Class cu o unitate în virgulă mobilă (FPU), care urmărește dispozitive terminale complexe din rețeaua IoT, bazate pe întreruperi. Acesta are 2 megabaiți (Mbytes) de memorie flash de program și 512 kilobaiți (Kbytes) de memorie SRAM. De asemenea, are 160 Kbytes de memorie flash pentru pornirea dispozitivului (boot). Nucleul microcontrolerului PIC32MZ2048EFH144T-I/PH poate opera la 252 MHz, într-un domeniu de temperatură de la -40°C până la +85°C, și la 180 MHz, în intervalul de temperatură -40°C … + 125°C. Tensiunea de operare este de la 2.1 volți până la 3.6 volți.

Pentru a susține complexitatea firmware-ului, precum și pentru a măsura semnalele externe, acesta dispune de nouă timere capture/compare pe 32-biți.

Porturile seriale externe includ nouă porturi UART și cinci porturi I2C. Există șase porturi SPI care suportă și interfața audio I2S. Un convertor analogic-digital pe 12-biți (ADC) cu 48 de intrări poate măsura tensiuni de la senzori analogici de precizie. Cu aceste numeroase porturi seriale și intrări ADC, PIC32MZ2048EFH144T-I/PH se poate interfața cu mulți senzori externi, ceea ce îl recomandă pentru dispozitive terminale IoT complexe bazate pe senzori. Două porturi CAN 2.0b permit microcontrolerului să comunice cu rețele industriale și auto, care utilizează protocolul comun CAN.

Un port Ethernet suportă conectivitate 10/100Base-T. Un controler USB 2.0 de viteză mare suportă o interfață externă pentru periferice suplimentare sau pentru depanare și suportă, de asemenea, USB On-The-Go (OTG).

Fiecare dintre aceste periferice poate genera una sau mai multe întreruperi. Având atât de mulți senzori și surse de întrerupere, menținerea eficienței codului la un anumit nivel devine o necesitate.

Pentru a îmbunătăți eficiența, nucleul MIPS32 M-Class CPU dispune de 32 de regiștri de uz general (GPRsGeneral Purpose Registers) pe 32-biți. Acest lucru crește randamentul prin reducerea accesărilor memoriei externe. Pe lângă setul obișnuit de biți și instrucțiunile clare, M-Class suportă și instrucțiuni ‚bit invert’ într-un singur ciclu de ceas. Acest lucru îmbunătățește randamentul RTOS prin creșterea eficienței prioritizărilor. Nucleul are, de asemenea, o metodă de execuție a instrucțiunilor ‘pipeline’ în cinci etape, care îmbunătățește eficiența prin reducerea conflictelor de acces la memorie, conducând la mai multe instrucțiuni executate într-un singur ciclu.

MIPS32 M-Class dispune și de șapte seturi de regiștri ‘shadow’de scop general (n.red.: un ‘shadow register’ este un registru creat în interiorul microcontrolerului cu scopul de a reține anumite date care vor fi folosite ulterior. Numele “shadow” implică duplicarea unei anumite valori și utilizarea ei ulterioară). Acest lucru îmbunătățește semnificativ performanța întreruperilor și comutarea rutinelor de execuție, prin eliminarea multor cicluri de ceas necesare pentru salvarea datelor din regiștrii de scop general pe stivă. Cu șapte seturi de regiștri ‘shadow’, nucleul poate păstra câte șapte întreruperi și comutări de context, înainte de a trebui să utilizeze cicluri de ceas pentru salvarea pe stivă a datelor regiștrilor de scop general.

PIC32MZ2048EFH144T-I/PH are două bank-uri de memorie flash de program (PFMProgram Flash Memory) de 1 Mbyte, desemnate PFM Bank 1 și PFM Bank 2. Fiecare PFM are propria sa memorie de pornire dedicată (BFMBoot Flash Memory), desemnate BFM Bank 1 și BFM Bank 2. BFM nu trebuie să fie actualizată în timpul unei actualizări PFM. Existența separată a acestor două unități de memorie aduce multiple avantaje. De exemplu, microcontrolerul suportă pornire duală, deci, la inițializare, poate fi configurat pentru a porni de pe oricare unitate de memorie flash. Acest lucru permite microcontrolerului să suporte două configurații diferite ale dispozitivului.

Figura 2: Microcontrolerul PIC32MZ2048EFH144T-I/PH are două unități independente de PFM (Program Flash Memory). Dacă SWAP = 1, firmware-ul poate rula pe PFM Bank 1 în timp ce pe PFM Bank 2 este actualizat. Ștergerea bitului SWAP = 0 permite microcontrolerului să boot-eze pe PFM Bank 2. (Sursa imaginii: Microchip Technology)

Cele două bank-uri de memorie flash oferă și avantajul suplimentar de a permite executarea firmware-ului de pe una dintre ele, în timp ce pe cealaltă unitate flash se actualizează firmware-ul. Microchip numește această metodă Live-Update, cunoscută și ca auto-programare în timpul rulării (RTSPRun-Time Self-Programming). Când RTSP este inițiat într-un dispozitiv terminal IoT activ, ce execută firmware-ul din PFM Bank 1, firmware-ul este primit prin rețea în blocuri. Metoda recomandată pentru gestionarea actualizărilor firmware-ului într-o rețea este stocarea blocului firmware-ului nou în SRAM. După primirea unui bloc complet, firmware-ul care se execută din PFM Bank 1 poate iniția o secvență de programare a datelor SRAM în PFM Bank 2. În timp ce acest firmware este programat, execuția firmware-ului din PFM Bank 1 poate continua.

Când programarea blocului este finalizată, firmware-ul poate solicita din rețea următorul bloc de program și secvența se repetă. Aceasta continuă până când blocul de program din PFM Bank 2 este finalizat. După finalizarea programării, firmware-ul poate configura PIC32MZ2048EFH144T-I/PH ca la următoarea reinițializare să pornească din BFM Bank 2 și astfel să se execute noul firmware în PFM Bank 2, ștergând bitul SWAP din registrul de configurare NVMCON (Figura 2). Dacă firmware-ul PIC32MZ2048EFH144T-I/PH trebuie actualizat din nou în timp ce SWAP = 0, firmware-ul se poate executa din PFM Bank 2 în timp ce noul firmware se va actualiza concomitent în PFM Bank 1.

Starea bitului SWAP poate fi modificată fie din BFM, fie din PFM, în funcție de nevoile firmware-ului.

Figura 3: Kitul compact de start Microchip Technology DM320007 acceptă dezvoltarea și testarea aplicațiilor USB și Ethernet cu ajutorul microcontrolerului PIC32MZ2048EFH144T-I/PH. Acesta include conectori pentru USB OTG, USB Host, 10/100 Ethernet și UART/I2C. (Sursa imaginii: Microchip Technology)

Dezvoltarea firmware-ului dual-boot’

Pentru dezvoltarea de aplicații cu microcontrolerul PIC32MZ2048EFH144T-I/PH, Microchip Technology pune la dispoziție kitul de start DM320007 PIC32MZ (figura 3). Această placă acceptă mai multe porturi seriale folosind conectori dedicați, precum și conectori simpli. Un port USB Host este utilizat pentru depanare, în timp ce un port USB OTG poate fi utilizat pentru aplicație. Atunci când este conectat la un port USB de pe un PC, un conector USB-to-UART/I2C, creează un port COM virtual pe PC-ul gazdă la care este conectat. Acest lucru permite PC-ului gazdă să comunice cu portul I2C de pe PIC32MZ.

Conectorul de extensie cu 40 de pini permite accesul la porturi suplimentare I2C, SPI și UART, precum și la pini I/O de uz general (GPIO) de pe PIC32MZ EF. Există trei butoane și trei LED-uri care pot fi configurate prin firmware.

Concluzie

Dispozitivele terminale IoT bazate pe senzori existente în aplicații critice au cerințe de memorie mai mari datorită complexității crescute a codului. Cu cât codul este mai complex, cu atât este necesară creșterea eficienței firmware-ului pentru a îmbunătăți timpii de răspuns la comutarea de context din firmware. Prin selectarea unui microcontroler ce poate rula eficient un cod bazat pe întreruperi și care poate prelua și actualiza simultan firmware-ul, dezvoltatorii pot îmbunătăți fiabilitatea aplicațiilor IoT critice din punct de vedere al timpului, fără a sacrifica performanța.

 

Autor: Rolf Horn  – Inginer de aplicații

Rolf Horn face parte din grupul European de Asistență Tehnică din 2014, având responsabilitatea principală de a răspunde la întrebările venite din partea clienților finali din EMEA referitoare la Dezvoltare și Inginerie, precum și la scrierea și corectarea articolelor și postărilor de pe platformele TechForum și maker.io ale firmei Digi-Key pentru cititorii din Germania. Înainte de Digi-Key, acesta a lucrat la mai mulți producători din zona semiconductorilor, cu accent pe sistemele embedded ce conțin FPGA-uri, microcontrolere și procesoare pentru aplicații industriale și auto. Rolf este licențiat în inginerie electrică și electronică la Universitatea de Științe Aplicate din Munchen, Bavaria. Și-a început cariera profesională la un distribuitor local de produse electronice în calitate de Arhitect pentru Soluții de Sistem pentru a-și împărtăși expertiza și cunoștințele în calitate de consilier de încredere.

Hobby-uri: petrecerea timpului cu familia + prietenii, călătoriile (cu rulota familiei VW-California) și motociclismul (pe un BMW GS din 1988).

Digi-Key Electronics   |   https://www.digikey.ro

 

S-ar putea să vă placă și