Jalankan instruksi dari RAM dalam mikrokontroler hobi-ramah

12

Salah satu proyek saya akan sangat diuntungkan karena dapat menjalankan program yang tidak disimpan dalam mikrokontroler (tetapi malah disimpan dalam kartu SD).

Jadi, saya mencari perangkat yang memungkinkan saya memuat kode dari kartu SD ke RAM dan kemudian mengeksekusi kode dari RAM. Saat ini, saya hanya memiliki programmer yang datang dengan PicKit2, jadi saya lebih suka tinggal dengan PICs.

Apakah ada yang tahu yang, jika ada, PIC dapat melakukan ini? Jika tidak ada PIC yang mampu melakukan ini, lalu apa saja pengontrol mikro yang akan bekerja untuk ini? Lebih disukai yang tersedia dalam paket kompatibel papan tempat memotong roti.

Ponkadoodle
sumber
2
huh? ... Untuk apa tepatnya Anda perlu mengeksekusi ram? dan apa yang kamu maksud dengan 'statis'? Anda tidak benar-benar mencoba untuk menulis kode modifikasi diri kan Apakah Anda berbicara tentang kurangnya alokasi memori dinamis? alias tidak ada malloc?
Tandai
2
@ Mark Saya ingin dapat memuat program dari perangkat eksternal, seperti kartu SD, dan menjalankannya. Saya akan mencoba menjelaskan dengan lebih baik di posting saya.
Ponkadoodle
2
Gotcha, satu-satunya PIC yang saya tahu yang akan memungkinkan ini adalah PIC32. Kecuali Anda melakukan sesuatu yang gila seperti menyalinnya dari kartu SD ke flash, yang akan memakan siklus flash cukup cepat jika Anda sering berpindah program. Kebanyakan 8 / 16bit kecil UC sangat tersegmentasi antara data (ram) dan ruang program (flash) dan tidak memungkinkan program counter untuk mengatasi ram (arsitektur Harvard, tidak ada perlindungan memori, dll).
Tandai

Jawaban:

5

Ada beberapa PIC yang memungkinkan Anda untuk menambahkan memori program eksternal. Saya belum pernah melakukan ini tetapi Aplikasi Catatan AN869 dan AN778 memiliki informasi lebih lanjut tentang cara menerapkan memori eksternal.

Daniel Grillo
sumber
11

Pilihan lain untuk dipertimbangkan adalah menggunakan bahasa yang ditafsirkan untuk program Anda yang disimpan pada kartu SD. Dengan cara ini, prosesor tidak mengeksekusi kode mesin yang dibaca dari kartu, itu hanya memperlakukannya sebagai data.

Pendekatan ini memberi Anda fleksibilitas dengan biaya kecepatan.

Ada banyak pilihan untuk dipilih: Survei Penerjemah / Penyusun Bahasa Tingkat Tinggi untuk Mikrokontroler

Toby Jaffey
sumber
1
Gulung DSL Anda sendiri. Opsi ini paling menarik bagi saya dari semua solusi yang disarankan.
Amos
6

Seperti yang telah dikatakan, PIC (selain PIC32) tidak dapat melakukan ini. Anda mungkin harus pergi ke prosesor yang lebih besar di keluarga mana saja atau ke prosesor dengan bus memori eksternal karena sebagian besar mikrokontroler memiliki sumber daya RAM yang sangat terbatas.

Prosesor MSP430 dapat menjalankan kode dari ruang RAM mereka, tetapi Anda akan membutuhkan sesuatu seperti F5438 dengan ruang RAM 16k - menjalankan kode dalam 128 byte bukanlah pilihan!

Jika sebuah prosesor memiliki bus eksternal maka Anda dapat memasukkan RAM ke dalam ruang kode. Anda mungkin harus menambahkan beberapa logika tambahan untuk memetakan RAM ke dalam dua wilayah memori jika arsitektur prosesor tidak memungkinkan data untuk ditulis ke dalam memori eksekusi.

Saya telah menjalankan kode dari RAM dalam sistem berbasis 8.051 tetapi itu berarti bahwa RAM harus dipetakan ke dalam ruang memori EKSTERNAL untuk pemrograman dan kemudian kembali ke ruang CODE untuk dieksekusi. Program pemuat / pemantau menangani pemindahan dan pemuatan bank memori. Tolong jangan minta kode - saya melakukan ini sekitar 30 tahun yang lalu dan sudah lama hilang (dan ditulis dalam PL / M-51)

kamu
sumber
5

Tak satu pun dari jangkauan rendah dan menengah PIC dapat dieksekusi dari RAM karena arsitektur memori mereka.

CPU berbasis ARM apa pun harus dijalankan dari RAM. Meskipun mereka cenderung berada dalam paket smd, ada beberapa modul ukuran 'DIP' yang memiliki mikrokontroler sudah dimuat. Lihat di tempat tidur atau LPCXpresso misalnya. Keduanya datang dengan bootloader atau, dalam kasus LPCXpresso, antarmuka debug bersama dengan kompiler gratis.

Jika Anda lebih suka tinggal dengan mikro 8 bit sederhana, mungkin pertimbangkan sesuatu dari HCS08 Family freescale. Ini dapat dijalankan dari RAM dan ada versi kode terbatas dari IDE codewarrior dan kompiler C yang tersedia secara gratis.

Saya cukup yakin MPS430 juga harus bisa melakukan ini, tapi saya belum pernah melakukannya sendiri.

Clint Lawrence
sumber
Mbed sebenarnya menerima binari dengan cara disalin ke flash drive inbuilt dan kemudian disetel ulang. Itu muncul sebagai flash drive ketika terhubung ke port USB komputer. Jika Anda dapat menemukan metode untuk menggunakan flash drive alih-alih kartu SD, atau mengaturnya sehingga biner dari kartu SD disalin secara otomatis ke flash drive dan reset dilakukan maka Anda mungkin beruntung. Tempat tidur tidak memerlukan pemrogram perangkat keras.
Amos
3

Saya ingat pernah membaca tentang bootloader untuk AVR yang akan mem-flash chip dengan file .hex (mungkin) dari kartu SD. Saya tidak dapat menemukan sumber aslinya, tetapi pencarian Google ini menghasilkan beberapa klik menarik. Ya, saya tahu ini AVR dan bukan PIC, tetapi Anda mungkin merasa berguna jika masalah PIC tidak berhasil.

blalor
sumber
+1 untuk bootloader PIC .
davidcary
3

Seperti yang telah dicatat oleh poster lain, Anda tidak dapat mengeksekusi dari RAM pada 8 atau 16-bit PIC, karena mereka menggunakan arsitektur Harvard (kode terpisah dan ruang data). Apakah praktis memuat program dari kartu SD dan mem-flashnya ke memori kode tergantung pada seberapa sering Anda akan melakukan ini.

Jika Anda mencoba membuat lingkungan yang dinamis seperti OS yang terus-menerus menampilkan program, maka tidak. Tetapi dalam kasus saya, saya memiliki program yang memuat driver sesuai kebutuhan dari kartu SD 2 GB. PIC24FJ256GB110 memiliki minimum 10.000 siklus hapus / tulis. Bahkan jika ini dilakukan lima kali per hari, flash akan bertahan minimal 5 1/2 tahun.

(Catatan: angka 10.000 adalah minimum. Daya tahan siklus tulis / tulis khas mungkin lima kali lipat - jadi jika Anda melakukan pengembangan, Anda mungkin dapat mem-flash prosesor 140 kali sehari - setiap 3 1/2 menit selama delapan jam - dan itu mungkin masih berlangsung setahun.)

tcrosley
sumber
2

Di sekolah saya, kami menggunakan prosesor HC11 atau HC12 dengan RAM eksternal untuk memuat dan menjalankan program di ... tapi saya lupa nama board / kit :( Dalam hal apa pun, Freescale HC (S) -garis MCU alamat RAM dan ROM identik , sehingga Anda dapat memuat kode ke dalam RAM dan menjalankannya.

Mengambil antrian dari blalor, solusi terbaik mungkin hanya dengan menambahkan tombol di papan Anda yang dapat reflash PIC dari data yang disimpan pada kartu SD yang Anda masukkan dengan bootloader. Saya tidak bisa membayangkan kode apa yang tidak cocok dengan PIC yang lebih besar; jika Anda memiliki beberapa data statis (grafik, teks, suara), simpan itu di penyimpanan eksternal.

Nick T
sumber
1

Anda mungkin tidak dapat mengalokasikan dari RAM, tetapi untuk aplikasi Anda, Anda mungkin dapat memiliki loader kecil di flash yang kemudian dapat membaca data kartu SD ke sisa flash. Saya telah menggunakan pendekatan ini dengan chip flash yang dikendalikan SPI untuk memungkinkan firmware dimuat dari tautan nirkabel dan kemudian diinstal setelah diterima sepenuhnya; Saya tidak dapat memikirkan alasan tertentu mengapa itu tidak akan bekerja dengan kartu SD, meskipun bootloader yang kompatibel dengan SD mungkin membutuhkan ruang.

supercat
sumber
Saya telah melakukan sesuatu yang serupa untuk perangkat yang memiliki beberapa firmware dan tujuan yang sedikit berbeda: Tulis semua file ke flash SPI eksternal (yang tersedia dalam ukuran yang jauh lebih besar daripada kebanyakan mikrokontroler), dan reflash controller dengan salah satu gambar dengan bootloader jika tombol ditekan selama reset.
Kevin Vermeer
0

Cukup banyak mikrokontroler akan membiarkan Anda melakukan ini, sepertinya bukan pic. apa yang ingin Anda lakukan adalah memiliki bootloader yang menggunakan spi untuk membaca dari kartu sd, menyalin program, yang mungkin ingin menjadi nama file yang dikenal atau hardcoded, mungkin di direktori root, parsing file itu ke ram lalu cabang ke program dalam ram. Pengontrol berbasis ARM pasti akan membiarkan Anda melakukan sesuatu seperti ini.

Alternatifnya adalah membuat bootloader membaca kartu sd lebih dari spi dan bukannya menyalin ke ram dan membakar cabang ke sebagian dari flash. Mungkin ingin memiliki tombol jika tombol ditekan pada power up atau reset kemudian memuat program baru dari kartu sd, sebaliknya jika tanda tangan atau checksum terlihat bagus pada bagian flash yang dapat dimuat kemudian pada cabang boot ke bagian flash tersebut. Atau mungkin jika kartu sd ada maka muat dari itu jika tidak cabang ke bagian flash yang dapat dimuat. Dapat menggunakan metode ini dengan berbasis lengan dan berbasis avr, bahkan mungkin berbasis pic tapi pengalaman pic saya sudah usang. msp430 saya akan menganggap juga. Pada dasarnya jika Anda dapat memprogram ulang bagian flash yang Anda jalankan, dari prosesor mikrokontroler itu sendiri,

old_timer
sumber
Hmmm, sebenarnya saya belum memprogram avr dari avr, maaf sudah over serial dari host. Membawa solusi ketiga yang Anda lihat banyak dilakukan papan hobi murah ... gunakan dua mikrokontroler. Dalam hal ini yang satu akan menahan yang lain di reset, membaca kartu sd, memprogram mikro lainnya, melalui serial atau lainnya, kemudian lepaskan reset pada mikro lainnya. Papan hobi / eval sering memiliki satu mikro untuk antarmuka usb dan biasanya jtag ke yang lain.
old_timer