RAMからバイナリコードを実行する方法はありますか?


8

PCからオブジェクトコードをロードするための限られた機能と単純なI / O周辺機器を使用して、アセンブリ言語でプログラムできる安価なシングルボードコンピューターを探しています。

理想的には、自分のマシン上のすべてのコードを妥当な時間内に記述できるようにしたいと考えています。OSを邪魔したくありません。RAMにコードを書き込んでから分岐して実行するプログラムが欲しいからです。Arduinoは、アセンブリプログラミングに適したシステムのシンプルさに関する限り、おそらく私の最良の選択ですが、ハーバードアーキテクチャがあり、RAMから実行することはできません。

数年前、私はVon Neumannアーキテクチャの8ビットCPUを使用していました。ROM、RAMなどにマップされているかどうかに関係なく、実行を任意のアドレスに分岐できます。これが今私がやりたいことです。

おそらく、RAMに書き込まれたオペコードのインタプリタをフラッシュメモリに書き込んでロードできますが、この種の仮想マシンがすでに存在しない限り、これは非常に複雑で時間のかかるソリューションです。

Arduinoを使用する他の回避策や、使用する可能性のある他のマイクロコントローラーについて何か提案はありますか?

ありがとう!

ピエール


3
PIC32はプリンストン(フォンノイマン)アーキテクチャチップです。それはMIPS CPUなので、十分に文書化され、標準化されていますが、低AVRよりも多少複雑です。chipKITボードはあなたの好みに合うかもしれません。
マジェンコ

2
ハーバードアーキテクチャとして最適化されていますが、ARM Cortex-MシリーズはRAMから許容可能な効率損失で実行でき、その場合もAVRよりもはるかに高速です。少なくとも半ダースのチップ企業がこのコアのライセンスに基づいて広く使用されている製品を製造しています。多くの人々がベンダーやセミスタンダードライブラリを使用していますが、データシートに基づいてすべて自分で行うことは完全に可能です。STM32を最初に使用したのは、彼らのディスカバリーボードが非常に安価で、オープンソースツールを使用してLinux / OSXで動作し、カスタムボードでチップをプログラミングできるためですが、現在はKinetisも使用しています。
Chris Stratton

主な質問はなぜですか?RAMからASMを実行する必要があるのはなぜですか?そして、どのようなアセンブリを使用したいですか?すべてのアーキテクチャには独自の言語があるため、学習目的でこれを行いますか?または、特定のターゲットがありますか?
frarugi87 2017年

2
私は、不賛成なぜ私は、これは他のいくつかの問題の回避策ではないとして、これは私が一度に尋ねた質問には無関係で行うことを望みました。ちなみに、私はMajenkoのアドバイスに従い、現在、アセンブリを実行している(そしてアセンブリからC関数を呼び出している)Uno32 plus外部インターフェイスを持ち、独自の変更されたasmコードをRAMに書き込んで実行しています。
ピエール2017年

フォースはあなたが探しているものです:)
ミカエルパテル2017

回答:


1

私の意見では、通訳のアイデアははるかに実行可能です。アセンブラーで、それ自体がマシンコードを生成し、RAMで実行するコードを記述するという概念は、それ自体が非常に複雑です。

なぜこれを実行する必要があるのか​​については説明していないため、これはXY問題の一部です。

邪魔になるOSは欲しくない...

通常のArduinoには邪魔なOSがありません-基本的に、あなたが書くコードはチップにロードされるものです。


2
つまり、いいえ。変更可能なメモリを実行できないことは、今日ではかなり珍しい制限であり、他のほとんどの名目上のハーバードアーキテクチャデバイスは、その制限を回避できるように変更されています。ソフトウェアインタープリターを作成することは、RAMからコードを実行するために必要な内部接続を備えた安価で高性能で使いやすいチップの1つを扱うよりも、はるかに多くの作業であり、はるかに効率が悪くなります。そのモードでの効率がやや劣るパイプライン操作は、ソフトウェアの解釈をはるかに上回っています。
Chris Stratton、2015

1
あなたは、ランタイム・コードの変更を行うことを予定している場合いいえ、はるかに高いレベルのコードを生成し、するよりも、直接マシンコードを生成する方が簡単ですまた、あなたの推薦のように、コンパイラやインタプリタを作成する必要があります。ある程度の視点を得るために、時間をかけて手書きの説明をする価値があるかもしれません。いいえ、「自分でマシン上のすべてのコードを書く」とは、最初からランタイムコードの生成を指すのではなく、コンポーネントをサポートするために他の作成者に依存するのではなく、単にオリジナルの作品を作成することを指します。
Chris Stratton、2015

1
これは、任意のメモリストレージ(SRAM、EEMEM、EEPROM)からコードを実行するArduinoのシンプルな4番目のスタイルのシェルです。最速のインタプリタではありませんが、命令フェッチ(メモリアクセス)と命令ポインタ(呼び出し/戻りアドレス)を抽象化する方法を示しています。github.com/mikaelpatel/Arduino-Shell
Mikael Patel

1
感動しました、ミカエル。私は数年前にApple IIのForthインタプリタを書きました。最近、コードを見つけることさえできないと思います。古き良きフォース、まだ生きていて蹴っている!:)
ニックギャモン

1
@NickGammon私は最近、Arduino用のより伝統的な4番目の仮想マシン(fvm)を書きました。マルチタスクであるため、Arduinoスケッチにバイト命令インタープリターを埋め込むことができます(fvmの生成を可能にします)。github.com/mikaelpatel/Arduino-FVM。トークンコンパイラ(Arduino上で実行されます)と従来の4番目の対話型インタープリタがあります。スケッチ例をご覧ください。
ミカエルパテル2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.