Go Down

Topic: bootloader x caricare sketch da SD? (Read 4 times) previous topic - next topic

niki77

Con lo sketch solo ci fai poco, è tutto l'insieme delle cose .
La cosa più complicata è stato fare l'upload del file da pagina web... sembrava banale invece è stato uno sbocco di sangue, però ora c'è e funziona bene, quindi sono soddisfatto.
Ora voglio vedere se riesco ad automatizzare anche il riavvio post upload direttamente da codice, senza utilizzare hardware aggiuntivo.
Se riesco a fare pure quello sono a cavallo.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

superlol


Con lo sketch solo ci fai poco, è tutto l'insieme delle cose .
La cosa più complicata è stato fare l'upload del file da pagina web... sembrava banale invece è stato uno sbocco di sangue, però ora c'è e funziona bene, quindi sono soddisfatto.
Ora voglio vedere se riesco ad automatizzare anche il riavvio post upload direttamente da codice, senza utilizzare hardware aggiuntivo.
Se riesco a fare pure quello sono a cavallo.

cito massimo banzi in un post di tempo fa:
Quote
4.  Raccomandato da Atmel. Attivare il "watchdog timer" e aspettare che si resetti.
Il "cane da guardia" è un timer che serve a resettare un processore che si sia incastrato per un problema software. Il timer, una volta attivato, resetta il processore a meno che non venga fatto ripartire... perciò in un'applicazione che deve mantenere un certo livello di affidabilità, il programma fa ripartire il timer regolarmente ... dovesse mai incepparsi allora dopo pochi millisecondi il processore si resetta. Aggiungi questo all'inizio tuo sketch Arduino
Code: [Select]

#include <avr/io.h>
#include <avr/wdt.h>

#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}




mentre nel punto dove vuoi resettare scrivi:
Code: [Select]

Reset_AVR();



Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

niki77

Grazie superlol ma ho già provato col cane da guardia!
Purtroppo si incarta, ovvero pare che si resetti, in realtà si pianta e non riparte.

Avevo pensato di provare qualcosa tipo asm volatile(" jmp 0xbladdress") per saltare direttamente al bootloader , ma poi ieri sera era tardi e non mi andava di fare il dump per capire a che indirizzo puntare...
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

superlol


Grazie superlol ma ho già provato col cane da guardia!
Purtroppo si incarta, ovvero pare che si resetti, in realtà si pianta e non riparte.

Avevo pensato di provare qualcosa tipo asm volatile(" jmp 0xbladdress") per saltare direttamente al bootloader , ma poi ieri sera era tardi e non mi andava di fare il dump per capire a che indirizzo puntare...


si un jump a 0x00 dovrebbe andare ma devi anche svuotare la ram e ripulire i timer..
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

niki77

Si ma non penso di dover saltare a 0x00, in questo caso riavvierei il programma senza passare dal bootloader , che non è proprio quello che voglio!
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

superlol


Si ma non penso di dover saltare a 0x00, in questo caso riavvierei il programma senza passare dal bootloader , che non è proprio quello che voglio!


beh 0x00 è da dove comincia tutto no?  :smiley-eek-blue:
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

niki77

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

lesto

#22
Aug 24, 2012, 12:18 am Last Edit: Aug 24, 2012, 12:22 am by lesto Reason: 1
a 0x00 dovrebbe esserci la prima istruzione del boot-loader, se non erro, non so se effettua anche tutti gli azzeramenti del caso, ma credo proprio di sì, altrimenti come fai ad essere sicuro dei dati che stai utilizzando? altrimenti si può fare a mano successivamente :)

edit: come non detto, ho controllato ed a 0 ci sta la prima istruzione del programma... l'unica pare essere il watchdog o un minimo di circuiteria, anche se un tizo dice che con un PWM a low sul reset riesce a fare un reset senza problemi: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1250663814/
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

niki77

#23
Aug 24, 2012, 01:00 am Last Edit: Aug 24, 2012, 01:33 am by niki77 Reason: 1
Sto provando proprio ora il jmp fatto all'indirizzo 0x7000 .
Secondo le impostazioni dei fuses ho un bootloader da 2000 word, che dovrebbe iniziare esattamente li.
Reebotare si reeebota ma se carichi il fw nuovo o meno questo ancora lo ignoro.
Non è facile da debuggare sta cosa!

Anche a me sarebbe piaciuto di più usare il watchdog, ma purtroppo quando tento di resettare con quel metodo la scheda si impalla e non riparte più nemmeno se premo il reset.
Devo staccare l'alimentazione per farla rinsavire.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

leo72

Al reset, il microcontrollore imposta il PC (Program Counter) in base alle impostazioni dei fuse Boot Reset Vector.
Se questi fuse sono disattivati, il micro carica $0000 ed esegue il programma da lì, altrimenti carica il valore impostato tramite fuse ed esegue un salto al bootloader. Tale valore varia in base alla dimensione della memoria del microcontrollore nonché alla memoria riservat al bootloader stesso.
Ad esempio, per il 328, che ha 32 kB di Flash ed un'area per il bootloader che può essere di 512/1024/2048/4096 byte, l'indirizzo di salto può essere rispettivamente: $3F00, $3E00, $3C000 e $3800.
Il bootloader dell'Arduino, se non deve flashare la memoria, termina con un JMP $0000 per avviare il programma dell'utente.

leo72


edit: come non detto, ho controllato ed a 0 ci sta la prima istruzione del programma... l'unica pare essere il watchdog o un minimo di circuiteria, anche se un tizo dice che con un PWM a low sul reset riesce a fare un reset senza problemi: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1250663814/

L'auto-reset è stato detto più volte che può non funzionare correttamente, il segnale di reset deve essere tenuto basso per un certo periodo altrimenti il reset non funziona correttamente. Nel momento in cui arriva il segnale low sul pin di reset parte il reset ma ciò interrompe il segnale Pwm. Atmel suggerisce sempre di usare un circuito esterno per il reset. Anche nel link da te citato viene riferito questo.

niki77

#26
Aug 24, 2012, 10:12 am Last Edit: Aug 24, 2012, 10:17 am by niki77 Reason: 1
I fuses sono impostati correttamente perchè se il reset lo faccio da pulsante il bootloader parte, fa il suo dovere e passa al programma principale.
Anche io ho letto questi valori $3F00, $3E00, $3C000 e $3800 ,sta scritto pure sul datasheet, ma non sono riuscito a 'spiegarmeli' , ovvero non sò a cosa facciano riferimento.
Io mi sono regolato vedendo da dove cominciava a scrivere il bootloader nel file HEX.
Comunque mi sarebbe piaciuto indagare sul perchè la tecnica wathcdog  (che mi ha già salvato le ciapp ai tempi dei pic dove in un progetto m'ero finito tuttti i pin ) mi fà impallare la scheda...
Penso che a seguito di un reset del WD sia tutto più pulito e stabile rispetto al JMP.

Il reset HW coi controcatsi è l'ultima spiaggia, tanto quello sono sicuro che funziona di certo, una circuiteria decente si riesce a farla(Qualche schema?)  o ancor meglio al limite posso recuperare un chip dedicato.


P.S

@Legacy

nella toolchain viene passato 0x7000  in -section-start

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

leo72

Quei valori sono l'indirizzo da cui il microcontrollore crea l'area riservata al bootloader, rappresentano ovviamente anche l'indirizzo di salto a cui va il micro all'avvio. Il valore è dato dalla differenza tra la memoria totale e lo spazio riservato. Ricordati però che la memoria dei micro è organizzata a 16 bit, quindi quelli sono indirizzi in word.
Se riservo 512 byte su un 328, come nel caso dell'Arduino UNO, l'indirizzo di inizio del bootloader è $3F00.

niki77

Ok, esattamente quindi nel mio caso il bootloader è stato riservato da 2k word, quindi il suo address è $3800 che equivale esattamente a 0x7000 hex (in byte)
Ora c'è da capire se ASM VOLATILE (" JMP 0x7000") effettua effettivamente un salto alla locazione 0x7000(in byte) o se tenta di cercarla a 0x7000 word ( :smiley-eek-blue:) e non trovandola punta a 0x00;
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

niki77


giusto per ridurre l'entropia
io farei una function softreset con dentro la prepare_for_softreset
dove ti crei il contesto sotto controllo

magari il codice prima ha fatto porcate varie e farcite, e valle a trovare
col rischio che aggiustandole propaghi problemi altrove =P

Code: [Select]

void softreset(uint32_t time)
{
   prepare_for_softreset();
   wdt_enable(time)
       {
       /* waiting for wdt event  */;
       }
}




Si mi sembra la cosa giusta, ed è quello a cui avevo pensato anche io, ma cosa fare dentro prepare_for_softreset()??
Magari chiudere la connessione ethernet e seriale (ma si può???) un clear interrupt ... ma poi cos'altro?
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Go Up