Id/lotto dispositivo incremento automatico di una variabile per ogni caricamento

Ciao a tutti,
ho sviluppato un firmware che dovrà essere caricato su qualche migliaio di schede.

Vorrei inserire una variabile con un numero identificativo di ogni scheda(tipo id e numero lotto) che viene registrata in eeprom e mai più modificata e vorrei che questa variabile non fosse da modificare prima di ogni caricamento sul firmware.

Avevo letto che ci sono delle variabili come l'ora e la data di caricamento del firmware e mi chiedevo se esiste, e qualcuno aveva mai usato, il numero di caricamento del firmware: tipo la prima scheda alla quale carico il firmware avrà l'ID: 1, la seconda il 2 e via via.
(chiaramente se esiste dovrò sottrarre il numero di caricamenti fatti fino al momento di inizio di programmazione del migliaio di schede)

Tutto questo in modo automatico.

PS:Solo per essere più chiari possibile non voglio aumentare una variabile che leggo dalla eeprom ad ogni riavvio o caricamento del firmware.

jonte987:
Vorrei inserire una variabile con un numero identificativo di ogni scheda(tipo id e numero lotto) che viene registrata in eeprom e mai più modificata e vorrei che questa variabile non fosse da modificare prima di ogni caricamento sul firmware.

Se registri qualcosa in EEPROM non devi fare più nulla, puoi caricare tutte le volte che vuoi il firmware ed il valore resta lo stesso.

Detto questo, resta solo da definire come caricare il valore in EEEPROM per "marcare" quello specifico device, e questo lo farai caricando "una tantum" un apposito sketch, che attende che tu da seriale gli mandi un identificativo numerico (o anche alfanumerico, non è rilevante) e lui lo scrive in EEPROM. Quindi colleghi un Arduino "vergine", carichi su questo quello sketch, e digiti sul monitor seriale il numero che vuoi assegnare a quell'Arduino, seguito da Invio. Fatto questo, e verificato che lo sketch ti abbia dato risposta positiva, puoi staccarlo e passare al successivo. Al termine della "marcatura" avrai il tuo set con identificativi univoci.

Dato che lo sketch riceve l'ID tramite USB ossia seriale, puoi anche mandare questo numero usando un qualsiasi tuo programma che, generando l'ID (sequenziale, casuale, numerico a esadecimale o quello che ti pare) lo manda sulla porta COM ed aspetta la risposta "OK" quindi ti propone di collegare il successivo magari dopo aver registrato su file o DB quell'ID.

"di più nin'zò" :smiley:

Non credo ci sia un contatore di installazioni, ma potrei essere smentito.
Non lo credo perchè sarebbe legato all'IDE da cui installi e ci sono mille modi per disallineare questo progressivo per cui sarebbe poco affidabile.

A te serve per forza che sia progressivo? oppure basta che ci sia un codice univoco?
Te lo devi registrare da qualche parte prima di distribuire i dispositivi oppure basta che sia univoco nel caso serva identificare il dispositivo successivamente? Ad es. per garanzia o assistenza...
Perchè inizializzando opportunamente il generatore di numeri casuali, potresti generarti al setup un numero casuale sufficientemente lungo per avere un'alta probabilità che sia univoco, ad es. a 4 byte.
Al setup verifichi se è già presente un valore diverso da zero e se assente lo generi e lo salvi. Agli avvii successivi non dovrebbe più modificarsi.
Per il lotto, dovresti gestire una costante sullo sketch che lo indichi. Sarebbe una sorta di versione del software.

Maurizio

Gcc prevede esplicitamente la macro COUNTER che serve esattamente a questo

Serve di dare una lettura alla documentazione...

E aggiungo:

Ovvio che serve di ricompilare ogni volta, ma piuttosto che trasmettere un programma che aspetta la trasmissione di un numero, per poi trasmettere il programma definitivo...

Pr il socio, invece,
Univoco ma non strettamente consecutivo, basta usare accoppiate delle due macro di data e ora

Standardoil:
Gcc prevede esplicitamente la macro COUNTER che serve esattamente a questo

Mmm ... la macro COUNTER parte da 1 e viene incrementata di 1 ogni volta che la inconta nello stesso sorgente ...

COUNTER evaluates to an integer literal whose value is increased by one every time it is found in a source code text.

... non so se fa al caso suo ... ::slight_smile:

Guglielmo

Non so se con l’optiboot in mezzo si riesca ma usando avrdude con il parametro -Ueeprom:w:eepromfile.hex puoi scrivere direttamente la EEPROM, se l’optiboot da fastidio non ti resterebbe altro che programmare le schede eliminando il bootloader usando un programmatore ISP e poi con il comando sopra indicato fai il resto

>jonte987: di che MCU parlimo? Cose prodotte da Microchip? (AVR, SAM, PIC ...)?

Perché, visto il quantitativo, con una modica spesa quello è un servizio che offre Microchip per le sue MCU e ti caricano anche loro il firmware ... ::slight_smile:

Guglielmo

Edit: Prova a guardare QUI ... :slight_smile:

Grazie per le celerissime risposte!!!

A parte pagare che in buona approssimazione semplifica sempre.

Credo che se a questo punto non esiste un contatore di caricamenti firmware ripiegherò con il random e numero di lotto, come ha suggerito Maurizio! Anche con 8 byte per non avere doppioni.
Poi alla prima connessione all'app faccio partire la garanzia e registro l'id.

esp32, e neanche su espressiff esiste.

Ma a te serve necessariamnete un "progressivo" o ti va bene un "identificativo univoco" per ogni scheda? ... perché con ESP8266 e ESP32 ... come Id univoco tipicamente si usa il MAC address che tutte hanno :wink:

Guglielmo

P.S.: Prova difatti a copiare il firmware di un SONOFF su un altro ESP8266 per fartelo in casa ... :smiley: :smiley: :smiley:

E allora ritiro tutto

Se c’è un dispositivo di rete, allora ha ragione Guglielmo con il MAC address che è già univoco di suo.

Maurizio

Però trovato lo stesso

Basta scriptare il tutto

E lanciate gcc con opzione -D
La opzione D permette di definire una macro esterna al codice sorgente, definita a riga di comando

Una buona scriptata (neologismo pefindicare un bel lavoro di script di shell)

E il lavoro è fatto

In effetti al mac non avevo pensato che uso il bt.

Il mac mi permette di avere un codice univoco, ma non di saperlo durante la programmazione o pre-vendita.

Qualcuno è a conoscenza se nelle Rell/nastri/rotoli di componenti sono incrementali i codici mac?
nel caso basterebbe conoscere il primo di ogni lotto.
Altrimenti evito di implementare qualche funzione per attivare la wifi, conoscere il mac, e riabilitare il bt, e poi abilitare solo il Bt, ma uso il random come suggeriva Maurizio.

Per quanto riguarda la opzione -D..
Se Standardoil ha voglia di essere più chiaro possibile, anche con qualche link preciso in modo che chiunque possa un giorno ritrovarsi a risolvere il problema o qualche problematica simile avremo un buon grow, perché io mi sono già un po' perso a cercare documentazione ben frammentata e disordinata su questa -D .. :wink:

Nel dettaglio:
come lanciare il gcc con -D
come definire una macro esterna al codice sorgente
ùcome scrivere una macro
come definirla a riga di comando

No, grazie
per varie ragioni

1 oggi devo andare a ritirare la guasta auto a varese, con un collega, che poi riporto a Busto e poi ritorno a varese, quindi il tempo non lo ho

2 gcc -DNumero=0001 non è difficile da scrivere

  1. non so che sistema operativo hai per scriverti io uno script di shell

4 con tutti gli anni di ingegneria, robotica, master e frittura mista che hai alle spalle sono sicuro che ci metti meno di me

jonte987:
Altrimenti evito di implementare qualche funzione per attivare la wifi, conoscere il mac, e riabilitare il bt, e poi abilitare solo il Bt, ma uso il random come suggeriva Maurizio.

Si ma non capisco perché complicarsi le cose, a me sembra molto più semplice scrivere un programmino che faccia tutto automaticamente ossia generi un ID (bastano 6-8 cifre hex ossia 3 o 4 byte) che sia o pseudo-random o sequenziale (conoscendo l’ultimo numero assegnato), coadiuvato da un “database” che può anche esssere solo un semplice file di testo: se l’ID è sequenziale conterrà il solo ultimo ID generato, altrimenti può avere la lista degli ID già assegnati. Ossia dopo aver uploadato lo stesso sketch iniziale “di programmazione” in tutti i device da programmare basta:

  1. collegare via USB un Arduino
  2. il programma attende che sulla seriale si “presenti” un Arduino (nel setup manderà una stringa prefissata, che so, “HELLO”)
  3. genera quindi un identificativo univoco (se non sequenziale controlla che non sia stato già assegnato) e lo manda ad Arduino
  4. Se arduino risponde “OK” seguito dal suo ID, l’operazione è confermata e conclusa, quindi registra l’ID generato e si torna al punto 1

Finito di “marcare” i device, sono pronti per ricevere il firmware definitivo, che leggerà dai byte della EEPROM il proprio ID.

docdoc:
Finito di "marcare" i device, sono pronti per ricevere il firmware definitivo, che leggerà dai byte della EEPROM il proprio ID.

... ti rammneto che stiamo parlando di ESP32 che, notoriamente, NON ha EEPROM, ma la simula nella ... Flash :smiley:

Direi che la strada suggerita da Standardoil attraverso il l'opzione -D è la più semplice ...
... del resto è la stessa che usa l'IDE di Arduino per passare una serie di parametri quando compila, esempio:

-DARDUINO=10809 -DARDUINO_ARCH_AVR -flto -fuse-linker-plugin -ffunction-sections -fdata-sections -MMD -DF_CPU=16000000L

... passa il parametro ARDUINO con valore 10809, il parametro ARDUINO_ARCH_AVR ed il parametro F_CPU con valore 16000000 :wink:

Guglielmo

gpb01:
... ti rammneto che stiamo parlando di ESP32 che, notoriamente, NON ha EEPROM, ma la simula nella ... Flash :smiley:

Oops, mi è sfuggito qualcosa, evidentemente, perché non ho visto dove l'OP ha scritto esplicitamente che sta usando un ESP32.

PS: ma l'ultima riga del post #7 era la risposta a "di che MCU parliamo"? Perché io non l'avevo intesa così, non essendoci un "quote"... :wink:

Ma gli esp32 hanno un mac

Mi era sfuggito che fossero esp32

https://www.esp32.com/viewtopic.php?t=1694

jonte987:
esp32, e neanche su espressiff esiste.

... distratti, lo ha detto alcuni post fa :smiley:

Il MAC è già stato suggerito, ma ... richiede la lettura di esso e ... voleva evitare anche questa seccatura, quindi ...
... la strada più semplice è uno script che lancia la copilazione passando al compilatore un qualche cosa del tipo:

-DSERIALNO=nnnnn

... che lui recupera poi nel codice sorgente.

Guglielmo

docdoc capisco quello che dici, era per evitarlo,
pensa a quella operazione per più di 1000 volte,
tra aprire e chiudere la seriale per programmare la nuova scheda e lanciare il programmino su seriale,
aspettare che si presenti o perdere il momento che si presenti e farla ripresentare con un cmd,
poi riprogrammare tutte le schede di nuovo,
non credo che sia più semplice che cambiare via via una variabile prima della programmazione che era la cosa iniziale che avrei voluto evitare.
Poi sarebbe interessante saperlo anche nel caso di un accordo monetario per ogni scheda programmata.
In ogni caso grazie per il tuo tempo.

Standardoil ho sempre sostenuto che l'esperienza valga più di qualsiasi foglio di carta anche se ho avuto la fortuna di studiare come hai potuto verificare.
Uso sia linux che wn, ma per l'ultizzo combinato di altri programmi sopratutto win ultimamente.
Se potessi farmi un esempio con calma te ne sarei grato e te ne saremo grati tutti probabilmente.
Un saluto

ah mi sono perso qualche post dove viene spiegato, molto più veloci di qualche anno fa!
Ok ho capito, ma da quello che ho capito il valore -DSERIALINO=nnnnn devo scriverlo io ogni volta, oppure se metto un ++ lo incremento ad ogni caricamento?