Esiste un modo per eseguire il codice binario dalla RAM?


8

Sto cercando un computer economico a scheda singola che potrei programmare in linguaggio assembly, utilizzando strutture limitate per caricare il codice oggetto da un PC e semplici periferiche I / O.

Idealmente, vorrei essere in grado di scrivere tutto il codice sulla macchina in un tempo ragionevole. Non voglio un sistema operativo in questo modo, poiché voglio avere un programma che scriva un po 'di codice nella RAM e quindi i rami per eseguirlo. Arduino sarebbe probabilmente la mia scelta migliore, per quanto riguarda la semplicità del sistema adatta alla programmazione di assiemi, ma ha un'architettura Harvard e non mi permetterà di eseguire dalla RAM.

Anni fa stavo usando una CPU a 8 bit di architettura Von Neumann che poteva eseguire il branch di esecuzione su qualsiasi indirizzo, indipendentemente dal fatto che fosse mappato su ROM, RAM o altro. Questo è quello che vorrei fare ora.

Probabilmente potrei scrivere e caricare nella memoria Flash un interprete di codici operativi scritti nella RAM, ma è una soluzione molto complessa e che richiede tempo, a meno che non esistano già macchine virtuali di questo tipo.

Qualche suggerimento su altre soluzioni alternative con Arduino o di altri microcontroller che potrei usare?

Grazie!

Pierre


3
PIC32 è un chip di architettura Princeton (Von Neumann). È una CPU MIPS, quindi è ben documentata e standardizzata, sebbene un po 'più complessa di un modesto AVR. Le schede chipKIT potrebbero essere più di tuo gradimento.
Majenko

2
Sebbene ottimizzata come Harvard Architecture, la serie ARM Cortex-M può essere eseguita da RAM con una perdita di efficienza tollerabile e sarebbe comunque molto più veloce di un AVR. Almeno una mezza dozzina di aziende produttrici di chip offrono offerte ampiamente utilizzate basate sulla licenza di questo core e, sebbene molte persone utilizzino librerie di fornitori e / o semi-standard, è del tutto possibile fare tutto da soli sulla base delle schede tecniche. Sono andato prima con STM32 poiché le loro schede di scoperta sono molto economiche, funzionano su Linux / OSX con strumenti open source e possono programmare chip su schede personalizzate, ma ora hanno usato anche Kinetis.
Chris Stratton,

La domanda principale è: perché? Perché è richiesta l'esecuzione ASM dalla RAM? E che tipo di assemblaggio vuoi usare? Dal momento che ogni architettura ha il suo linguaggio ... Lo fai per scopi di apprendimento? O hai un obiettivo specifico?
frarugi87,

2
Mi permetto di dissentire, il motivo per cui ho voluto farlo è irrilevante per la domanda che mi ponevo in quel momento in quanto non si tratta di una soluzione alternativa ad altri problemi. Per inciso, ho seguito il consiglio di Majenko e attualmente ho Uno32 più interfacce esterne che eseguono assembly (e chiamano funzioni C dall'assembly), scrivendo il proprio codice asm modificato nella RAM ed eseguendolo.
pierre,

Forth è quello che stai cercando :)
Mikael Patel

Risposte:


1

Secondo me l'idea dell'interprete è molto più fattibile. L'idea di scrivere, in assemblatore, il codice che genera esso stesso il codice macchina, nella RAM, e quindi lo esegue, è incredibilmente complesso.

Non hai detto perché vuoi farlo, quindi questo è un po 'un problema XY .

Non voglio un sistema operativo nel modo ...

I normali Arduinos non hanno un sistema operativo in mezzo - in pratica il codice che scrivi è ciò che viene caricato sul chip.


2
In una parola, no. L'incapacità di eseguire memoria modificabile è una limitazione piuttosto insolita ai giorni nostri, in cui la maggior parte degli altri dispositivi di architettura nominalmente Harvard sono modificati per essere in grado di evitare tale limitazione. Scrivere un interprete software sarà sia molto più lavoro, sia molto meno efficiente, rispetto a uno dei tanti chip economici, ad alte prestazioni e facili da usare che ha le connessioni interne necessarie per eseguire semplicemente il codice dalla RAM. Il funzionamento della pipeline leggermente meno efficiente in quella modalità è ancora molto, molto più avanti dell'interpretazione del software.
Chris Stratton,

1
No. Se hai intenzione di apportare modifiche al codice di runtime, è di gran lunga più semplice generare direttamente il codice macchina che generare codice di alto livello e devi anche creare un compilatore o un interprete come da tua raccomandazione. Potrebbe valere la pena dedicare un po 'di tempo a scrivere istruzioni a mano per avere una prospettiva. E no, "scrivere tutto il codice sulla macchina da solo" non si riferisce alla generazione del codice temporale di esecuzione all'inizio, ma piuttosto semplicemente alla creazione di lavoro originale rispetto al fatto di fare affidamento su altri autori per i componenti di supporto.
Chris Stratton,

1
Ecco una semplice shell di stile per Arduino che esegue il codice da qualsiasi memoria (SRAM, EEMEM, EEPROM). Non l'interprete più veloce ma mostra come estrarre l'istruzione (accesso alla memoria) e il puntatore dell'istruzione (indirizzi di chiamata / ritorno). github.com/mikaelpatel/Arduino-Shell
Mikael Patel

1
Sono impressionato, Mikael. Ho scritto un interprete Forth per Apple II anni fa. Dubito di riuscire a trovare il codice in questi giorni. Buon vecchio Forth, ancora vivo e vegeto! :)
Nick Gammon

1
@NickGammon Di recente ho scritto una quarta macchina virtuale (fvm) più tradizionale per Arduino. Permette di incorporare un interprete di istruzioni byte in uno sketch di Arduino in quanto è multi-tasking (consente la resa del fvm). github.com/mikaelpatel/Arduino-FVM . C'è un compilatore di token (funziona su Arduino :) e un tradizionale interprete interattivo. Vedi gli schizzi di esempio.
Mikael Patel
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.