Mengapa menjalankan kode dari RAM?

27

Saya baru saja menemukan beberapa makro untuk kompiler mikrokontroler saya untuk memaksa (atau menyarankan) suatu fungsi dijalankan dari RAM.

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x/

https://community.nxp.com/thread/389099

Dalam hal apa ini berharga? Mengapa saya tidak selalu mengeksekusi dari RAM jika manfaatnya hanya meningkatkan kecepatan? Apakah ini umumnya menyebabkan penarikan arus yang lebih tinggi?

tarabyte
sumber
13
Menjalankan kode dari RAM kurang menarik saat ini (saya tidak yakin apakah itu benar untuk semua CPU / SoCs). Saya pernah membuat proyek di mana kami menempatkan sebagian besar kode ke RAM karena itu adalah perangkat baterai dan kami ingin itu hidup selama mungkin. Jika Anda hanya dapat mengeksekusi kode dari RAM, Anda bahkan dapat mematikan blok flash pada beberapa SoC dan menghemat lebih banyak daya.
Al Bundy
4
@pipe - Saya membayangkan alasan untuk membuatnya sebagai komentar daripada jawaban adalah karena tidak menjawab pertanyaan yang sebenarnya, itulah sebabnya Anda tidak ingin selalu menggunakan RAM untuk mengeksekusi kode Anda.
Jules
1
@ Jules Ya, saya membayangkan ini dimaksudkan sebagai "anekdot yang membantu". Hal-hal Stack Exchange dirancang untuk mencegah, untuk alasan yang sangat bagus.
pipa
1
Karena Anda tidak memiliki cukup register untuk dieksekusi dari register. (Saya punya chip itu.)
Joshua
Selain segalanya: mengeksekusi kode dari RAM dinamis khusus dapat menjadi bagian dari peretasan perangkat lunak yang rumit untuk melakukan penyegaran DRAM. :)
Kaz

Jawaban:

32

Selain kecepatan & fitur lain yang telah disebutkan orang lain, mengeksekusi kode dari RAM dapat berguna dalam bootloader di mana Anda perlu memprogram ulang flash mikro Anda - Anda tidak dapat mengeksekusi kode dari flash yang sedang Anda hapus & pemrograman ulang.

brhans
sumber
4
tergantung pada berapa banyak blok flash yang Anda miliki dan yang mana bootloader Anda memungkinkan untuk dimodifikasi, berapa banyak ram yang tersisa untuk menampilkan data untuk blok berikutnya, dll. tetapi benar untuk trampolin dari flash sehingga Anda dapat memodifikasi ram flash adalah bagus untuk itu ...
old_timer
1
Ini sepertinya hanya menjawab setengah pertanyaan (bagian tituler). OP juga bertanya "Mengapa saya tidak akan selalu mengeksekusi dari RAM jika manfaatnya hanya meningkatkan kecepatan?", Dan jawaban ini tidak menjelaskan mengapa orang mungkin tidak ingin mengeksekusi dari RAM.
Doktor J
2
Sejauh ini bagus, tetapi apa yang terjadi jika Anda kehilangan daya (dan dengan demikian RAM) di tengah penulisan ulang flash? Ini bisa diselesaikan, tetapi sama seperti desain lain untuk bootloader, itu harus dipertimbangkan.
AaronD
19

Saya tidak melihat datasheet untuk mikro itu. Namun, sering kali dalam situasi ini mengambil dari RAM lebih cepat daripada mengambil dari flash dimana memori program diimplementasikan.

Keuntungan dari flash adalah jumlah yang besar bisa relatif murah. Oleh karena itu produsen mikrokontroler terkadang memasang banyak flash pada sebuah chip, kemudian memberikan ruang RAM yang lebih terbatas yang dapat dieksekusi oleh kode. Ini memungkinkan penyalinan rutin waktu-kritis ke dalam RAM, kemudian jalankan dari sana.

Switch kompiler yang Anda lihat mungkin berfungsi dengan linker dan menandai bagian flash yang akan disalin ke RAM oleh kode run-time kompiler yang berjalan dari reset. Implementasi yang berbeda akan bervariasi pada detailnya.

Olin Lathrop
sumber
17

Ketika Anda ingin mengeksekusi dalam RAM karena lebih cepat, biasanya karena RAM itu adalah SRAM on-chip. Ini adalah sumber daya yang langka, yang mungkin Anda inginkan untuk data yang memerlukan akses baca / tulis.

Menggunakannya untuk kode ketika Anda sudah memiliki kode dalam ROM / flash berarti bahwa Anda memerlukan jumlah X flash dan jumlah X tambahan RAM.

Ini juga membutuhkan tahap penyalinan tambahan saat boot atau ketika Anda ingin menjalankannya, meskipun sebagian besar tidak signifikan.

Secara tradisional ini diselesaikan dengan cache instruksi, tetapi dalam mikrokontroler mungkin lebih masuk akal untuk menjaga generik SRAM internal, karena Anda tidak menggunakan mikrokontroler karena Anda menginginkan kecepatan eksekusi tercepat.

Ada juga masalah keandalan - mengeksekusi kode dalam ROM yang sebenarnya sulit untuk dimodifikasi oleh kode buggy.

pipa
sumber
14

Selain semua jawaban yang baik:

Mengapa saya tidak selalu mengeksekusi dari RAM jika manfaatnya hanya meningkatkan kecepatan?

Karena dalam sistem tertanam, biasanya Anda tidak memiliki jumlah RAM yang diperlukan. Misalnya STM32 memiliki 32kB atau RAM dan 512kB EEPROM. Untuk dapat menjalankan seluruh program dalam RAM, Anda membutuhkan ukuran RAM yang lebih besar dari EEPROM.

Marko Buršič
sumber
5
"Karena dalam sistem embedded, biasanya Anda tidak memiliki jumlah yang diperlukan RAM." - dan karena jika Anda melakukan memiliki RAM yang cukup untuk melakukan hal ini, Anda hampir pasti dapat mengurangi biaya dengan beralih ke MCU murah dengan RAM kurang. Karena jika Anda mengajukan pertanyaan, selalu ada MCU yang lebih murah dengan RAM lebih sedikit (MCU terkecil dan termurah menggunakan arsitektur Harvard sehingga tidak dapat dijalankan dari RAM)
Jules
13

Jawaban lain tampaknya tidak terlalu banyak membahas konsumsi daya, yang secara khusus Anda tanyakan.

Jawabannya adalah itu agak tergantung pada mikrokontroler, tetapi seringkali eksekusi dari RAM dapat mengurangi konsumsi daya karena memerlukan lebih sedikit energi untuk membaca instruksi dari RAM daripada dari memori flash.

Penggunaan tipikal adalah menjalankan fungsi "tidur" berdaya rendah dari RAM, dengan memori flash dimatikan. Tidak hanya konsumsi daya yang berkurang, tetapi jika mikrokontroler perlu bangun dengan cepat (misalnya sebagai respons terhadap interupsi eksternal) tidak ada penundaan saat memori flash dinyalakan kembali.

Beberapa bagian, seperti beberapa kisaran Atmel SAM, memiliki RAM daya ekstra rendah khusus yang dapat digunakan untuk tujuan ini. Ini memungkinkan sejumlah kecil kode untuk dimuat ke RAM khusus, sementara sebagian besar RAM yang tersedia dan semua memori lainnya dimatikan dan mikrokontroler memasuki mode tidur nyenyak.

pengguna
sumber
7

Selain manfaat kecepatan potensial yang disebutkan oleh orang lain, kode RAM juga dinamis dan dapat dimodifikasi dengan cepat dengan beberapa kode khusus dalam FLASH sesuai kebutuhan.

Ini bisa sesederhana mengubah beberapa parameter atau bisa menjadi seluruh rutinitas pawang yang diunggah dari jarak jauh.

Trevor_G
sumber
Atau kode dalam RAM dapat diambil dari disk (mis. SD) atau jaringan
teambob
4

Menjalankan kode dari RAM secara signifikan lebih cepat daripada mengeksekusi dari memori flash. Sebagian besar CPU sangat dioptimalkan untuk akses RAM tercepat yang mungkin, dan bahkan memori flash tercepat hanya mencapai sebagian kecil dari kecepatan RAM.

Namun perlu diingat bahwa memindahkan kode dari flash ke RAM juga membutuhkan waktu. Jika kode dieksekusi hanya sekali, Anda hanya perlu membacanya sekali, dan karena itu Anda sebenarnya akan kehilangan waktu untuk menyalinnya ke dalam RAM terlebih dahulu alih-alih mengeksekusi secara langsung. Jika kode dieksekusi sesekali (jadi menyalinnya ke dalam RAM akan meningkatkan eksekusi pada kali kedua dipanggil), tetapi sistem ini umumnya menganggur, maka Anda akan mengeksekusi kode itu lebih cepat dengan menyalinnya ke dalam RAM, tetapi tidak ada yang peduli, karena sistem memiliki cukup waktu untuk dihabiskan.

Jadi optimasi seperti itu hanya sepadan dengan usaha, jika kode dieksekusi sering, dan Anda telah mengukurnya menjadi titik tersedak sistem.

Di sisi lain RAM perlu secara aktif menyimpan data yang tersimpan, sedangkan memori flash tidak, sehingga konsumsi daya total meningkat, jika RAM perlu tetap aktif. Namun ini hanya relevan, jika RAM tidak digunakan sama sekali, tetapi sebagian besar sistem modern akan - dengan satu atau lain cara - menggunakan RAM yang tersedia dan karenanya tetap aktif.

Dua
sumber
4

Ada dua alasan yang sangat umum untuk mengeksekusi kode dari RAM:

  1. Beberapa mikroprosesor tidak dapat mengeksekusi dari flash selama pemrograman flash - meskipun banyak yang bisa melakukan ini selama kode berada di blok yang berbeda dari flash yang sedang ditulis. Menulis Flash mungkin memprogram ulang aplikasi (boot-loader case), atau ketika flash digunakan untuk menyimpan info program yang tidak mudah menguap (konfigurasi, kalibrasi, dll.)

  2. Pada banyak mikroprosesor, RAM jauh lebih cepat daripada flash. Untuk perangkat ini, rutin kecil kecepatan kritis dapat dijalankan dari RAM, meskipun biasanya pasokan RAM jauh lebih singkat daripada flash.

Dave Nadler
sumber
2

Penggunaan lain untuk RAM hanya mengeksekusi keamanan terhadap bitflip acak. Kami menggunakan model ini pada cubesat kecil kami karena papan komputer utama memiliki ram ECC yang mentoleransi bitflip karena radiasi. Seluruh OS dimuat ke ram sebagai ramdisk pada startup berjalan sepenuhnya dalam lingkungan ECC.

Flash tidak dilindungi ECC (standar dari kartu micro SD), namun kami memiliki metode lain untuk memeriksa kerusakan (beberapa gambar, checksum, dll.)

Tejas Kale
sumber
Saya akan berasumsi bahwa sesuatu seperti EEPROM atau lampu kilat akan jauh "lebih sulit" untuk dikalahkan oleh radiasi, yaitu, membutuhkan lebih banyak energi.
pipa
Memang begitu, tetapi karena kami hanya menggunakan flash standar tanpa fitur ECC khusus, menggunakan ram jauh lebih baik untuk tujuan ini.
Tejas Kale