Ripristino di un Pic18 da C
Domanda
Qual è il modo migliore per ripristinare un Pic18 usando il codice C. Con il compilatore HiTech Pic18 C
Modifica:
Sto utilizzando ora
void reset()
{
#asm
reset
#endasm
}
ma deve esserci un modo migliore
Soluzione
C'è una FAQ qui .
D: Come posso resettare il micro?
Un modo è reimpostare tutte le variabili su i loro valori predefiniti, come elencato nel PIC Manuale. Quindi, utilizzare il linguaggio assembly per passare alla posizione 0x0000 in micro.
#asm ljmp 0x0000
#endasm
Questo è abbastanza sicuro da usare, anche quando chiamato all'interno di interrupt o procedure. I micro serie PIC 16x avere 8 livelli di stack. Ogni volta a viene chiamata procedura, un livello di stack è utilizzato per l'indirizzo di ritorno. esso è un buffer circolare, quindi anche se micro è profondo 7 livelli di procedura e in un interrupt quando è un reset chiamato, questo è il nuovo inizio di stack buffer e micro volontà continuare come di consueto.
Un altro modo è di impostare il watchdog timer quando il chip è programmato e utilizzare le istruzioni CLRWDT () per tutto il codice. Quando vuoi il micro reimpostare, interrompere la cancellazione del bit del watchdog e il micro si ripristinerà dopo circa 18ms a 2 secondi a seconda del prescaler.
Altri suggerimenti
I compilatori di solito hanno la loro funzione reset () incorporata, ma fa esattamente quello che fa la tua funzione e il nome effettivo può variare da compilatore a compilatore.
Lo stai già facendo nel modo migliore.
La tua risposta è il modo migliore che io conosca. La chiave è che hai un'istruzione assembly all'interno di una chiamata di funzione, tutto da solo. Il compilatore non ottimizzerà una funzione che ha inline assembly in esso, quindi se si include l'istruzione reset inline a una funzione molto grande, il compilatore non ottimizzerà alcun codice in quella funzione. Lo hai evitato mettendo Reset nella sua propria funzione. Il codice in questa funzione non sarà ottimizzato, ma chi se ne frega, dal momento che è una funzione così piccola.
A meno che non ci sia una funzione di libreria definita dalla libreria di runtime del produttore del compilatore (se tale lib esiste anche nel mondo dei microcontrollori ... ma dovrebbe), allora no. C stesso certamente non ti aiuterà, facendo "un reset" è di gran lunga un problema specifico della piattaforma per C per coprirlo.
Uso il compilatore ccsinfo.com, che ha una chiamata API simile per ripristinare il PIC, ma penso che la soluzione del compilatore farebbe la cosa giusta.