Opsi 1: Bahasa yang Diartikan
Ini tidak langsung menjawab pertanyaan (yang merupakan pertanyaan luar biasa, BTW, dan saya berharap dapat belajar dari jawaban yang mengatasinya secara langsung), tetapi sangat umum ketika melakukan proyek yang dapat memuat program eksternal untuk menulis program eksternal dalam bahasa yang ditafsirkan. Jika sumber daya terbatas (yang akan berada pada prosesor ini, pernahkah Anda berpikir tentang menggunakan prosesor PIC32 atau ARM kecil untuk ini?), Itu umum untuk membatasi bahasa ke subset dari spesifikasi lengkap. Lebih jauh ke bawah rantai adalah bahasa-bahasa khusus domain yang hanya melakukan beberapa hal.
Sebagai contoh, proyek elua adalah contoh dari bahasa yang ditafsirkan dengan sumber daya rendah (64 kB RAM). Anda dapat menekan ini hingga 32k RAM jika Anda menghapus beberapa fitur (Catatan: Ini tidak akan bekerja pada prosesor Anda saat ini, yang merupakan arsitektur 8-bit. Menggunakan RAM eksternal mungkin akan terlalu lambat untuk grafis). Ini memberikan bahasa yang cepat dan fleksibel di mana pengguna baru dapat dengan mudah memprogram game jika Anda menyediakan API minimal. Ada banyak dokumentasi yang tersedia untuk bahasa online. Ada bahasa lain (seperti Forth dan Basic) yang dapat Anda gunakan dengan cara yang sama, tapi saya pikir Lua adalah pilihan terbaik saat ini.
Dengan nada yang sama, Anda dapat membuat bahasa khusus domain Anda sendiri. Anda harus menyediakan API dan dokumentasi eksternal yang lebih lengkap, tetapi jika semua gim serupa maka ini tidak akan terlalu sulit.
Bagaimanapun, PIC18 mungkin bukan prosesor yang saya gunakan untuk sesuatu yang melibatkan pemrograman kustom / scripting dan grafik. Anda mungkin akrab dengan kelas prosesor ini, tetapi saya menyarankan agar ini saat yang tepat untuk menggunakan sesuatu dengan driver layar dan lebih banyak memori.
Opsi 2: Hanya memprogram ulang semuanya
Namun, jika Anda sudah merencanakan pemrograman sendiri semua game di C, maka jangan repot-repot hanya memuat logika game dari kartu SD. Anda hanya memiliki 32kB Flash untuk memprogram ulang, dan dapat dengan mudah mendapatkan kartu microSD 4 GB untuk ini. (Catatan: kartu yang lebih besar biasanya SDHC, yang lebih sulit untuk dihubungkan). Dengan asumsi bahwa Anda menggunakan setiap byte terakhir dari 32 kB Anda, yang memberikan ruang pada kartu SD untuk 131.072 salinan firmware Anda dengan logika permainan apa pun yang Anda butuhkan.
Ada banyak catatan aplikasi untuk menulis bootloader untuk PIC, seperti AN851 . Anda harus merancang bootloader Anda untuk menempati wilayah memori tertentu (mungkin bagian atas wilayah memori, Anda akan menentukan ini di tautan), dan menentukan bahwa proyek firmware penuh tidak mencapai wilayah ini. Catatan appnote ini lebih terinci. Cukup ganti "Bagian boot dari PIC18F452" dengan "Bagian boot yang saya tentukan di tautan" dan semuanya akan masuk akal.
Kemudian, bootloader Anda hanya perlu memungkinkan pengguna untuk memilih program untuk dijalankan dari kartu SD, dan menyalin semuanya. UI bisa jadi bahwa pengguna harus menahan tombol untuk masuk ke mode pemilihan. Biasanya, bootloader hanya akan memeriksa status tombol ini saat reset, dan, jika tidak ditekan, boot ke dalam gim. Jika tertahan, pengguna harus memilih file pada kartu SD, menyalin program, dan melanjutkan boot ke gim [baru].
Ini rekomendasi saya saat ini.
Opsi 3: Sihir yang dalam melibatkan hanya menyimpan sebagian dari file hex
Masalah dengan mekanisme yang Anda bayangkan adalah bahwa prosesor tidak berurusan dengan API dan pemanggilan fungsi, ini berkaitan dengan angka - alamat yang dapat dilompati oleh penunjuk instruksi dan mengharapkan ada kode yang mengeksekusi pemanggilan fungsi sesuai dengan spesifikasi API. Jika Anda mencoba mengkompilasi hanya sebagian dari program, linker tidak akan tahu apa yang harus dilakukan ketika Anda menelepon check_button_status()
atau toggle_led()
. Anda mungkin tahu bahwa fungsi-fungsi itu ada di file hex pada prosesor, tetapi perlu tahu persis di mana mereka berada.
Linker telah memecah kode Anda menjadi beberapa bagian; Anda secara teoritis dapat memecah ini menjadi bagian tambahan dengan beberapa -section
dan #pragma
mantra. Saya belum pernah melakukan ini, dan tidak tahu caranya. Sampai kedua metode di atas gagal saya (atau seseorang memposting jawaban yang luar biasa di sini), saya mungkin tidak akan mempelajari mekanisme ini, jadi saya tidak bisa mengajarkannya kepada Anda.