Есть ли способ запустить двоичный код из оперативной памяти?

8

Я ищу недорогой одноплатный компьютер, который я мог бы программировать на ассемблере, используя ограниченные возможности для загрузки объектного кода с ПК и простых периферийных устройств ввода / вывода.

В идеале я хотел бы иметь возможность написать за разумное время весь код на машине сам. Мне не нужна ОС, потому что я хочу иметь программу, которая записывает в ОЗУ некоторый код, а затем разветвляет его для выполнения. Arduino, вероятно, был бы моим лучшим выбором, насколько проста система, подходящая для программирования на ассемблере, но она имеет архитектуру Гарварда и не позволяет мне выполнять из ОЗУ.

Несколько лет назад я использовал 8-разрядный процессор с архитектурой фон Неймана, который мог выполнять выполнение по любому адресу, независимо от того, был ли он сопоставлен с ПЗУ, ОЗУ или чем-то еще. Это то, что я хотел бы сделать сейчас.

Я, вероятно, мог бы написать и загрузить во флэш-память интерпретатор кодов операций, написанных в ОЗУ, но это очень сложное и трудоемкое решение, если виртуальные машины такого типа уже не существуют.

Какие-нибудь предложения относительно других обходных путей с Arduino или другими микроконтроллерами, которые я мог бы использовать?

Спасибо!

пьер

пьер
источник
3
PIC32 - это чип архитектуры Принстона (фон Неймана). Это процессор MIPS, поэтому он хорошо документирован и стандартизирован, хотя и несколько сложнее, чем простой AVR. Платы chipKIT могут вам понравиться.
Маженко
2
Несмотря на то, что серия ARM Cortex-M, оптимизированная под архитектуру Гарварда, может работать из ОЗУ с приемлемой потерей эффективности, она при этом будет намного быстрее, чем AVR. По крайней мере, полдюжины компаний, выпускающих чипы, делают широко используемые предложения, основанные на лицензировании этого ядра, и, хотя многие люди используют библиотеки поставщиков и / или полустандартные, вполне возможно сделать все это самостоятельно, основываясь на листах данных. Сначала я остановился на STM32, поскольку их платы обнаружения очень дешевы, работают на Linux / OSX с инструментами с открытым исходным кодом и могут программировать микросхемы на пользовательских платах, но теперь также используют Kinetis.
Крис Страттон,
Главный вопрос почему? Почему вам требуется выполнение ASM из ОЗУ? А какую сборку вы хотите использовать? Поскольку каждая архитектура имеет свой собственный язык ... Вы делаете это в учебных целях? Или у вас есть конкретная цель?
frarugi87
2
Я позволю себе не согласиться, почему я хотел сделать это, не имеет отношения к вопросу, который я задавал в то время, поскольку это не обходной путь для какой-то другой проблемы. Между прочим, я последовал совету Majenko, и в настоящее время у меня есть внешние интерфейсы Uno32 плюс, выполняющие сборку (и вызывающие функции C из сборки), пишущие собственный модифицированный asm-код в RAM и выполняющие его.
Клееный
Четвертое - это то, что вы ищете :)
Микаэль Патель

Ответы:

1

На мой взгляд, идея интерпретатора гораздо более осуществима. Понятие написания на ассемблере кода, который сам генерирует машинный код в ОЗУ, а затем выполняет его, сам по себе невероятно сложен.

Вы не сказали, почему вы хотите это сделать, так что это отчасти проблема XY .

Я не хочу ос в пути ...

Обычные Arduinos не имеют операционной системы - в основном код, который вы пишете, загружается в чип.

Ник Гаммон
источник
2
Одним словом, нет. Неспособность выполнить модифицируемую память является довольно необычным ограничением в наше время, когда большинство других устройств с номинальной архитектурой Гарварда модифицированы, чтобы избежать этого ограничения. Написание программного интерпретатора будет гораздо более трудоемким и гораздо менее эффективным, чем работа с одним из множества недорогих, высокопроизводительных и простых в использовании микросхем, которые имеют необходимые внутренние соединения для простого выполнения кода из ОЗУ. Немного менее эффективная работа конвейера в этом режиме все еще намного опережает интерпретацию программного обеспечения.
Крис Страттон
1
Нет. Если вы собираетесь модифицировать код во время выполнения, гораздо проще напрямую генерировать машинный код, чем генерировать код высокого уровня, а также создавать компилятор или интерпретатор, как в вашей рекомендации. Возможно, стоило бы потратить некоторое время на написание инструкций, чтобы получить некоторую перспективу. И нет, «сам писать весь код на машине» для начала относится не к генерации временного кода, а скорее к созданию оригинальной работы, а не к поддержке других компонентов другими авторами.
Крис Страттон
1
Вот простая оболочка четвертого стиля для Arduino, которая выполняет код из любого хранилища памяти (SRAM, EEMEM, EEPROM). Не самый быстрый интерпретатор, но показывает, как выборка инструкции (доступ к памяти) и указатель инструкции (адреса вызова / возврата) могут быть абстрагированы. github.com/mikaelpatel/Arduino-Shell
Микаэль Патель
1
Я впечатлен, Микаэль. Я написал интерпретатор Forth для Apple II несколько лет назад. Я сомневаюсь, что смогу найти код в эти дни. Старый добрый Форт, все еще жив и здоров! :)
Ник Гэммон
1
@NickGammon Недавно я написал более традиционную четвертую виртуальную машину (fvm) для Arduino. Это позволяет встраивать интерпретатор байтовых инструкций в эскиз Arduino, поскольку он является многозадачным (позволяет получить fvm). github.com/mikaelpatel/Arduino-FVM . Есть компилятор токенов (работает на Arduino :) и традиционный четвертый интерактивный интерпретатор. Пожалуйста, смотрите примеры эскизов.
Микаэль Патель