Existe alguma maneira de executar o código binário da RAM?

8

Estou procurando um computador de placa única barato que eu possa programar em linguagem assembly, usando recursos limitados para carregar o código de objeto de um PC e periféricos de E / S simples.

Idealmente, eu gostaria de poder escrever em um tempo razoável todo o código da máquina. Não quero um sistema operacional no caminho, pois quero ter um programa que escreva na RAM algum código e depois se ramifique para executá-lo. O Arduino provavelmente seria minha melhor escolha, no que diz respeito à simplicidade do sistema adequada à programação de montagem, mas possui uma arquitetura de Harvard e não me permite executar a partir da RAM.

Anos atrás, eu estava usando uma CPU de 8 bits da arquitetura Von Neumann que poderia ramificar a execução em qualquer endereço, independentemente de ter sido mapeado para ROM, RAM ou qualquer outra coisa. É isso que eu gostaria de fazer agora.

Provavelmente eu poderia escrever e carregar na memória Flash um intérprete de códigos operacionais escritos na RAM, mas é uma solução muito complexa e demorada, a menos que já existam máquinas virtuais desse tipo.

Alguma sugestão sobre outras soluções alternativas com o Arduino ou com outros microcontroladores que eu possa usar?

Obrigado!

Pierre

Pierre
fonte
3
O PIC32 é um chip de arquitetura de Princeton (Von Neumann). É uma CPU MIPS, por isso é bem documentada e padronizada, embora um pouco mais complexa do que um AVR humilde. As placas chipKIT podem ser mais do seu agrado.
Majenko
2
Embora otimizada como uma arquitetura de Harvard, a série ARM Cortex-M pode ser executada a partir da RAM com uma perda de eficiência tolerável e ainda assim seria muito mais rápida que um AVR ao fazê-lo. Pelo menos meia dúzia de empresas de chips fazem ofertas amplamente usadas com base no licenciamento desse núcleo e, embora muitas pessoas usem bibliotecas de fornecedores e / ou semi-padrão, é inteiramente possível fazer tudo sozinho com base nas folhas de dados. Fui primeiro ao STM32, pois seus painéis de descoberta são muito baratos, funcionam no Linux / OSX com ferramentas de código aberto e podem programar chips em painéis personalizados, mas agora também usam o Kinetis.
22615 Chris Stratton
A principal questão é por quê? Por que você exige a execução do ASM a partir da RAM? E que tipo de montagem você deseja usar? Como toda arquitetura tem seu próprio idioma ... Você faz isso para fins de aprendizado? Ou você tem um alvo específico?
precisa saber é o seguinte
2
Eu imploro para diferir, por que eu desejei fazer isso é irrelevante para a pergunta que fiz na época, pois essa não é uma solução alternativa para outra questão. Aliás, segui o conselho de Majenko e atualmente tenho uma interface externa Uno32 plus executando assembly (e chamando funções C do assembly), escrevendo seu próprio código ASM modificado na RAM e executando-o.
pierre
Forth é o que você está procurando :)
Mikael Patel

Respostas:

1

Na minha opinião, a ideia do intérprete é muito mais viável. A noção de escrever, no assembler, o código que gera o código da máquina na RAM e depois o executa, é incrivelmente complexo.

Você não disse por que deseja fazer isso, portanto esse é um problema XY .

Eu não quero um sistema operacional no caminho ...

Os Arduinos normais não têm um sistema operacional no caminho - basicamente, o código que você escreve é ​​o que é carregado no chip.

Nick Gammon
fonte
2
Em uma palavra, não. A incapacidade de executar memória modificável é uma limitação bastante incomum atualmente, onde a maioria dos outros dispositivos de arquitetura nominalmente de Harvard são modificados para evitar essa limitação. Escrever um intérprete de software será muito mais trabalhoso e muito menos eficiente do que lidar com um dos muitos chips baratos, de alto desempenho e fáceis de usar, com as conexões internas necessárias para simplesmente executar o código da RAM. A operação de pipeline um pouco menos eficiente nesse modo ainda está muito, muito à frente da interpretação do software.
Chris Stratton
11
Não. Se você deseja modificar o código de tempo de execução, é muito mais fácil gerar código de máquina diretamente do que gerar código de alto nível e também precisa criar um compilador ou intérprete, como na sua recomendação. Pode valer a pena gastar algum tempo escrevendo instruções à mão para ter alguma perspectiva. E não, "escrever todo o código na máquina" não se refere à geração de código de tempo de execução, para começar, mas apenas à criação de um trabalho original, em vez de contar com outros autores para dar suporte aos componentes.
Chris Stratton
11
Aqui está um simples estilo de shell para o Arduino que executa código de qualquer armazenamento de memória (SRAM, EEMEM, EEPROM). Não é o intérprete mais rápido, mas mostra como a busca de instruções (acesso à memória) e o ponteiro de instruções (endereços de chamada / retorno) podem ser abstraídos. github.com/mikaelpatel/Arduino-Shell
Mikael Patel
11
Estou impressionado, Mikael. Escrevi um quarto intérprete para o Apple II anos atrás. Duvido que consiga encontrar o código atualmente. Bom e velho Forth, ainda vivo e chutando! :)
Nick Gammon
11
@NickGammon Recentemente, escrevi uma quarta máquina virtual (fvm) mais tradicional para o Arduino. Permite incorporar um intérprete de instrução de bytes em um esboço do Arduino, pois é multitarefa (permite o rendimento do fvm). github.com/mikaelpatel/Arduino-FVM . Há um compilador de token (executado no Arduino :) e um quarto intérprete interativo tradicional. Por favor, veja os esboços de exemplo.
Mikael Patel