Existe-t-il un moyen d'exécuter du code binaire à partir de la RAM?

8

Je recherche un ordinateur monocarte peu coûteux que je pourrais programmer en langage assembleur, en utilisant des fonctionnalités limitées pour charger le code objet à partir d'un PC et de simples périphériques d'E / S.

Idéalement, j'aimerais pouvoir écrire moi-même dans un délai raisonnable tout le code sur la machine. Je ne veux pas d'un système d'exploitation, car je veux avoir un programme qui écrit dans la RAM du code puis des branches pour l'exécuter. Arduino serait probablement mon meilleur choix, en ce qui concerne la simplicité du système adapté à la programmation d'assemblage, mais il a une architecture Harvard et il ne me permettra pas d'exécuter à partir de la RAM.

Il y a des années, j'utilisais un processeur 8 bits d'architecture Von Neumann qui pouvait brancher l'exécution à n'importe quelle adresse, qu'elle soit mappée sur ROM, RAM ou autre. C'est ce que j'aimerais faire maintenant.

Je pourrais probablement écrire et charger dans la mémoire Flash un interpréteur de codes op écrits en RAM, mais c'est une solution très complexe et longue, à moins que des machines virtuelles de ce type n'existent déjà.

Des suggestions sur d'autres solutions de contournement avec Arduino ou d'autres micro-contrôleurs que je pourrais utiliser?

Merci!

Pierre

pierre
la source
3
Le PIC32 est une puce d'architecture Princeton (Von Neumann). Il s'agit d'un processeur MIPS, il est donc bien documenté et standardisé, bien qu'un peu plus complexe qu'un AVR modeste. Les cartes chipKIT peuvent être plus à votre goût.
Majenko
2
Bien qu'optimisée en tant qu'architecture Harvard, la série ARM Cortex-M peut s'exécuter à partir de la RAM avec une perte d'efficacité tolérable et serait toujours beaucoup plus rapide qu'un AVR. Au moins une demi-douzaine de sociétés de puces proposent des offres largement utilisées basées sur l'octroi de licences pour ce cœur, et bien que de nombreuses personnes utilisent des bibliothèques de fournisseurs et / ou semi-standard, il est tout à fait possible de tout faire vous-même sur la base des fiches techniques. J'ai d'abord utilisé STM32 car leurs cartes de découverte sont très bon marché, fonctionnent sur Linux / OSX avec des outils open source et peuvent programmer des puces sur des cartes personnalisées, mais ont également utilisé Kinetis.
Chris Stratton
La question principale est pourquoi? Pourquoi avez-vous besoin d'une exécution ASM à partir de la RAM? Et quel type d'assemblage souhaitez-vous utiliser? Puisque chaque architecture a son propre langage ... Le faites-vous à des fins d'apprentissage? Ou vous avez un objectif précis?
frarugi87
2
Je vous prie de différer, la raison pour laquelle je souhaitais le faire est sans rapport avec la question que j'ai posée à l'époque car il ne s'agit pas d'une solution de contournement à un autre problème. Par ailleurs, j'ai suivi les conseils de Majenko et j'ai actuellement un Uno32 plus des interfaces externes exécutant l'assembly (et appelant des fonctions C à partir de l'assembly), écrivant son propre code asm modifié dans la RAM et l'exécutant.
pierre
Voilà ce que vous cherchez :)
Mikael Patel

Réponses:

1

À mon avis, l'idée d'un interprète est beaucoup plus réalisable. La notion d'écrire, en assembleur, du code qui génère lui-même du code machine, en RAM, puis l'exécute, est elle-même incroyablement complexe.

Vous n'avez pas dit pourquoi vous voulez faire cela, c'est donc en quelque sorte un problème XY .

Je ne veux pas d'os sur le chemin ...

Les Arduinos normaux n'ont pas de système d'exploitation - fondamentalement, le code que vous écrivez est ce qui est chargé sur la puce.

Nick Gammon
la source
2
En un mot, non. L'incapacité d'exécuter de la mémoire modifiable est une limitation plutôt inhabituelle de nos jours, où la plupart des autres dispositifs d'architecture nominativement Harvard sont modifiés pour pouvoir éviter cette limitation. Écrire un interpréteur de logiciel va à la fois être beaucoup plus de travail et beaucoup moins efficace que de traiter avec l'une des nombreuses puces peu coûteuses, hautes performances et faciles à utiliser qui ont les connexions internes nécessaires pour exécuter simplement le code à partir de la RAM. Le fonctionnement du pipeline un peu moins efficace dans ce mode est encore loin, très en avance sur l'interprétation du logiciel.
Chris Stratton
1
Non . Si vous allez faire la modification du code d'exécution, il est de loin plus facile de générer directement le code de la machine que pour générer le code de haut niveau et également devoir créer un compilateur ou interprète dans votre recommandation. Il pourrait être utile de passer du temps à écrire des instructions à la main pour avoir une certaine perspective. Et non, «écrire tout le code sur la machine moi-même» ne fait pas référence à la génération de code de temps d'exécution pour commencer, mais plutôt simplement à la création d'un travail original par rapport à l'utilisation d'autres auteurs pour prendre en charge les composants.
Chris Stratton
1
Voici un simple shell de style quatrième pour l'Arduino qui exécute du code à partir de l'un des stockages de mémoire (SRAM, EEMEM, EEPROM). Ce n'est pas l'interprète le plus rapide, mais montre comment l'extraction d'instructions (accès à la mémoire) et le pointeur d'instructions (adresses d'appel / de retour) peuvent être extraits. github.com/mikaelpatel/Arduino-Shell
Mikael Patel
1
Je suis impressionné, Mikael. J'ai écrit un interprète Forth pour l'Apple II il y a des années. Je doute que je puisse même trouver le code ces jours-ci. Bon vieux Forth, toujours vivant et en plein essor! :)
Nick Gammon
1
@ NickGammon J'ai récemment écrit une quatrième machine virtuelle (fvm) plus traditionnelle pour l'Arduino. Il permet d'incorporer un interpréteur d'instructions d'octet dans un croquis Arduino car il est multitâche (permet le rendement du fvm). github.com/mikaelpatel/Arduino-FVM . Il y a un compilateur de jetons (fonctionne sur l'Arduino :) et un interprète interactif traditionnel. Veuillez consulter les exemples de croquis.
Mikael Patel