Apakah ada cara untuk menjalankan kode biner dari RAM?

8

Saya mencari komputer papan tunggal murah yang dapat saya program dalam bahasa assembly, menggunakan fasilitas terbatas untuk memuat kode objek dari PC dan perangkat I / O sederhana.

Idealnya saya ingin dapat menulis dalam waktu yang wajar semua kode pada mesin sendiri. Saya tidak ingin OS menghalangi, karena saya ingin memiliki program yang menulis dalam RAM beberapa kode dan kemudian cabang untuk menjalankannya. Arduino mungkin akan menjadi pilihan terbaik saya, sejauh kesederhanaan sistem yang cocok untuk pemrograman perakitan berjalan, tetapi memiliki arsitektur Harvard dan tidak akan memungkinkan saya untuk mengeksekusi dari RAM.

Bertahun-tahun yang lalu saya menggunakan arsitektur Von Neumann 8-bit CPU yang dapat melakukan eksekusi cabang ke alamat mana pun, tidak peduli apakah itu dipetakan ke ROM, RAM atau apa pun. Inilah yang ingin saya lakukan sekarang.

Saya mungkin bisa menulis dan memuat dalam memori Flash sebagai juru kode op yang ditulis dalam RAM, tetapi ini adalah solusi yang sangat kompleks dan memakan waktu, kecuali mesin virtual semacam ini sudah ada.

Adakah saran tentang solusi lain dengan Arduino atau pengontrol mikro lainnya yang mungkin saya gunakan?

Terima kasih!

Pierre

pierre
sumber
3
PIC32 adalah chip arsitektur Princeton (Von Neumann). Ini adalah CPU MIPS sehingga terdokumentasi dengan baik dan terstandarisasi, meskipun agak lebih kompleks daripada AVR rendah. Papan chipKIT mungkin lebih sesuai dengan keinginan Anda.
Majenko
2
Meskipun dioptimalkan sebagai Arsitektur Harvard, seri ARM Cortex-M dapat mengeksekusi dari RAM dengan kehilangan efisiensi yang dapat ditoleransi dan masih akan jauh lebih cepat daripada AVR saat melakukannya. Setidaknya setengah lusin perusahaan chip memberikan penawaran yang banyak digunakan berdasarkan lisensi pada inti ini, dan sementara banyak orang menggunakan vendor dan / atau perpustakaan semi-standar, sangat mungkin untuk melakukannya sendiri berdasarkan lembar data. Saya menggunakan STM32 terlebih dahulu karena papan penemuan mereka sangat murah, bekerja di Linux / OSX dengan alat open source, dan dapat memprogram chip pada papan kustom, tetapi sekarang telah menggunakan Kinetis juga.
Chris Stratton
Pertanyaan utamanya adalah Mengapa? Mengapa Anda memerlukan eksekusi ASM dari RAM? Dan jenis perakitan apa yang ingin Anda gunakan? Karena setiap arsitektur memiliki bahasanya sendiri ... Apakah Anda melakukan ini untuk tujuan belajar? Atau Anda punya target spesifik?
frarugi87
2
Saya mohon berbeda, mengapa saya ingin melakukan ini tidak relevan dengan pertanyaan yang saya ajukan pada saat itu karena ini bukan solusi untuk masalah lain. Kebetulan, saya mengikuti saran Majenko dan saat ini saya memiliki antarmuka eksternal Uno32 plus yang menjalankan perakitan (dan memanggil fungsi C dari perakitan), menulis kode asm yang dimodifikasi sendiri dalam RAM dan menjalankannya.
pierre
Keempat adalah apa yang Anda cari :)
Mikael Patel

Jawaban:

1

Menurut saya ide penerjemah jauh lebih layak. Gagasan menulis, dalam assembler, kode yang dengan sendirinya menghasilkan kode mesin, dalam RAM, dan kemudian mengeksekusinya, itu sendiri sangat kompleks.

Anda belum mengatakan mengapa Anda ingin melakukan ini, jadi ini merupakan masalah XY .

Saya tidak ingin os di jalan ...

Arduinos normal tidak memiliki OS di jalan - pada dasarnya kode yang Anda tulis adalah apa yang dimuat ke dalam chip.

Nick Gammon
sumber
2
Singkatnya, tidak. Ketidakmampuan untuk mengeksekusi memori yang dapat dimodifikasi adalah batasan yang agak tidak biasa di zaman sekarang ini, di mana sebagian besar perangkat arsitektur Harvard yang lain dimodifikasi untuk dapat menghindari batasan itu. Menulis interpreter perangkat lunak keduanya akan menjadi lebih banyak pekerjaan, dan jauh lebih efisien, daripada berurusan dengan salah satu dari banyak chip murah, berkinerja tinggi, dan mudah digunakan yang memiliki koneksi internal yang diperlukan untuk hanya menjalankan kode dari RAM. Operasi pipa yang sedikit kurang efisien dalam mode itu masih jauh, jauh di depan interpretasi perangkat lunak.
Chris Stratton
1
Tidak. Jika Anda akan melakukan modifikasi kode runtime, jauh lebih mudah untuk langsung menghasilkan kode mesin daripada menghasilkan kode tingkat tinggi dan juga harus membuat kompiler atau juru bahasa seperti yang Anda rekomendasikan. Mungkin perlu menghabiskan beberapa waktu instruksi tulisan tangan untuk mendapatkan beberapa perspektif. Dan tidak, "tulis semua kode pada mesin sendiri" tidak merujuk untuk menjalankan pembuatan kode waktu untuk memulai, tetapi lebih pada sekadar menciptakan karya asli vs. mengandalkan penulis lain untuk komponen pendukung.
Chris Stratton
1
Berikut ini adalah shell gaya sederhana untuk Arduino yang mengeksekusi kode dari penyimpanan memori mana pun (SRAM, EEMEM, EEPROM). Bukan penerjemah tercepat tetapi menunjukkan bagaimana instruksi mengambil (akses memori) dan penunjuk instruksi (panggilan / alamat kembali) dapat diabstraksikan. github.com/mikaelpatel/Arduino-Shell
Mikael Patel
1
Saya terkesan, Mikael. Saya menulis interpreter Forth untuk Apple II tahun yang lalu. Saya ragu saya bahkan dapat menemukan kode hari ini. Selamat tua, masih hidup dan menendang! :)
Nick Gammon
1
@NickGammon Saya baru-baru ini menulis mesin virtual sebagainya yang lebih tradisional (fvm) untuk Arduino. Hal ini memungkinkan penanaman interpreter instruksi byte dalam sketsa Arduino karena multi-tasking (memungkinkan hasil dari fvm). github.com/mikaelpatel/Arduino-FVM . Ada kompiler token (berjalan di Arduino :) dan juru bahasa interaktif maju tradisional. Silakan lihat sketsa contoh.
Mikael Patel