Esegui le istruzioni dalla RAM in un microcontrollore adatto agli hobbisti


12

Uno dei miei progetti trarrebbe grande vantaggio dalla possibilità di eseguire un programma che non è memorizzato nel microcontrollore (ma è invece archiviato in una scheda SD).

Quindi, sto cercando un dispositivo che mi permetta di caricare il codice dalla scheda SD nella RAM e quindi eseguire il codice dalla RAM. Al momento, ho solo il programmatore fornito con PicKit2, quindi preferirei rimanere con i PIC.

Qualcuno sa quali, eventualmente, i PIC possono farlo? Se nessun PIC è in grado di farlo, quali sono alcuni microcontroller diversi che potrebbero funzionare per questo? Preferibilmente quelli disponibili in un pacchetto compatibile con breadboard.


2
eh? ... Di cosa hai bisogno esattamente per eseguire da ram? e cosa intendi con "statico"? non stai davvero cercando di scrivere codice auto-modificante, vero? Stai parlando della mancanza di allocazione dinamica della memoria? aka no malloc?
Segna il

2
@Mark Voglio essere in grado di caricare un programma da un dispositivo esterno, come una scheda SD, ed eseguirlo. Proverò a spiegare meglio nel mio post.
Ponkadoodle,

2
gotcha, l'unico PIC che conosco che consentirebbe questo è un PIC32. A meno che tu non faccia qualcosa di folle come copiarlo dalla scheda SD al flash, che consumerà i cicli del flash abbastanza velocemente se i tuoi programmi cambiano spesso. La maggior parte dei piccoli uC a 8/16 bit sono fortemente segmentati tra spazio dati (ram) e programma (flash) e non consentono al contatore del programma di indirizzare ram (architettura di Harvard, nessuna protezione della memoria, ecc.).
Segna il

Risposte:


5

Esistono alcuni PIC che consentono di aggiungere memoria di programma esterna. Non l'ho mai fatto, ma le Note applicative AN869 e AN778 contengono ulteriori informazioni su come implementare la memoria esterna.


11

Un'altra opzione da considerare è l'uso di un linguaggio interpretato per i programmi memorizzati sulla scheda SD. In questo modo, il processore non sta eseguendo il codice macchina letto dalla scheda, lo sta solo trattando come dati.

Questo approccio offre flessibilità a costo della velocità.

Ci sono molte opzioni tra cui scegliere: Sondaggio di interpreti / compilatori di lingua di alto livello per microcontrollori


1
Crea il tuo DSL. Questa opzione mi fa appello soprattutto alle soluzioni suggerite.
Amos,

6

Come è già stato detto, i PIC (diversi da PIC32) non possono farlo. Probabilmente dovrai andare ai processori più grandi di qualsiasi famiglia o a un processore con un bus di memoria esterno poiché la maggior parte dei microcontrollori ha risorse RAM molto limitate.

I processori MSP430 possono eseguire il codice dal loro spazio RAM, ma avrai bisogno di qualcosa come F5438 con 16k di spazio RAM: eseguire il codice a 128 byte non è davvero un'opzione!

Se un processore ha un bus esterno, è possibile inserire la RAM nello spazio del codice. Potrebbe essere necessario aggiungere una logica aggiuntiva per mappare la RAM in due aree di memoria se l'architettura del processore non consente la scrittura dei dati nella memoria di esecuzione.

Ho eseguito il codice dalla RAM in un sistema basato su 8051, ma ciò significava che la RAM doveva essere mappata nello spazio di memoria EXTERN per la programmazione e quindi di nuovo nello spazio CODICE per l'esecuzione. Il programma caricatore / monitor ha gestito la commutazione e il caricamento del banco di memoria. Per favore non chiedere il codice - l'ho fatto circa 30 anni fa ed è da tempo perso (e scritto in PL / M-51)


5

Nessuno dei PIC di fascia bassa e media può essere eseguito dalla RAM a causa della loro architettura di memoria.

Qualsiasi CPU basata su ARM dovrebbe essere eseguita dalla RAM. Sebbene tendano ad essere in pacchetti smd, ci sono alcuni moduli di dimensioni 'DIP' che hanno già caricato il microcontrollore. Dai un'occhiata al mbed o LPCXpresso per esempio. Entrambi vengono forniti con un bootloader o, nel caso di LPCXpresso, un'interfaccia di debug con compilatori gratuiti.

Se preferisci rimanere con semplici micro a 8 bit, forse prendi in considerazione qualcosa della famiglia HCS08 freescale. Questi possono essere eseguiti dalla RAM e c'è una versione limitata del codice del compilatore IDE e C codewarrior disponibile gratuitamente.

Sono abbastanza sicuro che anche l'MPS430 dovrebbe essere in grado di farlo, ma non l'ho mai fatto da solo.


Il mbed riceve effettivamente i binari facendoli copiare sull'unità flash integrata e quindi reimpostati. Si presenta come un'unità flash quando è collegato alla porta USB di un computer. Se riesci a elaborare un metodo per utilizzare l'unità flash anziché la scheda SD o configurarlo in modo che un binario dalla scheda SD venga copiato automagicamente sull'unità flash e venga eseguito un ripristino, potresti essere fortunato. Il mbed non richiede un programmatore hardware.
Amos,


3

Ricordo di aver letto di un bootloader per AVR che avrebbe ri-flash il chip con un file .hex (presumibilmente) da una scheda SD. Non riesco a trovare la fonte originale, ma questa ricerca su Google mostra un paio di hit interessanti. Sì, so che questo è AVR e non PIC, ma potresti trovarlo utile se la cosa PIC non funziona.



3

Come hanno notato altri poster, non è possibile eseguire dalla RAM su un PIC a 8 o 16 bit, poiché utilizzano un'architettura Harvard (spazi di codice e dati separati). Se è pratico caricare o meno un programma da una scheda SD e salvarlo nella memoria del codice dipende dalla frequenza con cui lo farai.

Se stai cercando di creare un ambiente dinamico come un sistema operativo che sovrappone costantemente i programmi, allora no. Ma nel mio caso, ho un programma che carica i driver quando necessario da una scheda SD da 2 GB. PIC24FJ256GB110 ha un minimo di 10.000 cicli di cancellazione / scrittura. Anche se ciò fosse fatto cinque volte al giorno, il flash durerebbe almeno 5 anni e mezzo.

(Nota: la cifra di 10.000 è un minimo. La durata tipica dei cicli di cancellazione / scrittura potrebbe essere cinque volte superiore, quindi se si sta sviluppando, è possibile ripetere il flashing di un processore 140 volte al giorno - ogni 3 1/2 minuti per otto ore - e potrebbe durare ancora un anno.)


2

Nella mia scuola abbiamo usato processori HC11 o HC12 con RAM esterna per caricare ed eseguire programmi su ... ma ho dimenticato il nome delle schede / kit :( In ogni caso, le MCU Freescale HC (S) -line indirizzano identicamente RAM e ROM , quindi puoi caricare il codice nella RAM ed eseguirlo.

Prendendo una coda da blalor, la soluzione migliore potrebbe essere quella di aggiungere semplicemente un pulsante sulla scheda che può riflettere il PIC dai dati memorizzati su una scheda SD che si inserisce con un bootloader. Non riesco a immaginare quale tipo di codice non si adatterebbe ai PIC più grandi; se si dispone di alcuni dati statici (grafica, testo, suono), conservarli su memoria esterna.


1

Probabilmente non puoi allocare dalla RAM, ma per la tua applicazione potresti avere un piccolo caricatore in flash che può quindi leggere i dati della scheda SD nel resto del flash. Ho usato questo approccio con un chip flash controllato da SPI per consentire al firmware di essere caricato da un collegamento wireless e quindi installato una volta ricevuto completamente; Non riesco a pensare a nessuna ragione particolare per cui non funzionerebbe con una scheda SD, anche se un bootloader compatibile con SD potrebbe occupare un po 'di spazio.


Ho fatto qualcosa di simile per un dispositivo che aveva alcuni firmware e scopi leggermente diversi: scrivere tutti i file su flash SPI esterno (che è disponibile in dimensioni molto più grandi della maggior parte dei microcontrollori) e ricollegare il controller con una delle immagini con il bootloader se si tiene premuto un pulsante durante il ripristino.
Kevin Vermeer,

0

Molti microcontrollori ti permetteranno di farlo, sembra che non sia la foto. quello che vorresti fare è avere un bootloader che usa spi per leggere dalla scheda sd, copiare il programma, che probabilmente vuole essere un nome di file conosciuto o hardcoded, probabilmente nella directory principale, analizzare quel file in ram poi diramare su il programma in ram. I controller basati su ARM ti consentiranno sicuramente di fare qualcosa del genere.

Un'alternativa sarebbe quella di far leggere al bootloader la scheda SD su spi e invece di copiarla su ram e la ramificazione brucia su una porzione del flash. Probabilmente vuoi avere un pulsante se il pulsante viene premuto all'accensione o al ripristino, quindi carica un nuovo programma dalla scheda SD, altrimenti se la firma o il checksum sembrano corretti su quella parte caricabile del flash, quindi sul ramo di avvio a quella parte del flash. O forse se la scheda SD è presente, caricala da essa altrimenti si dirama verso la parte caricabile del flash. Posso usare questo metodo con arm based e avr based, possibilmente anche con foto ma la mia esperienza con foto è datata. msp430 Suppongo anche io. Fondamentalmente se è possibile riprogrammare parti del flash da cui si esegue, dal processore del microcontrollore stesso,


Hmmm, in realtà non ho programmato un avr da avr, mi dispiace che sia stato via seriale da un host. Mostra una terza soluzione che vedi fare un sacco di schede per hobby economiche ... usa due microcontrollori. In questo caso uno terrà l'altro in reset, leggerà la scheda SD, programmerà l'altro micro, via seriale o altro, quindi rilascerà il reset sull'altro micro. Le schede hobby / eval hanno spesso un micro per l'interfaccia USB e di solito si sposta sull'altro.
old_timer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.