Konsol game stm32

Beberapa penembak untuk stm32; bagaimana, mengapa, apa yang terjadi.



Kata pengantar


Menjadi penggemar sekolah penembak "tua" di satu sisi dan pengembang-tersemat di sisi lain, saya selalu bertanya-tanya bagaimana dan mengapa para penulis zaman itu berhasil menerapkan genre baru yang membutuhkan pendekatan baru sepenuhnya pada perangkat keras yang sangat "sederhana". Dan saya memutuskan untuk mencoba meluncurkan sesuatu menggunakan solusi serupa berdasarkan pada MK modern - di sini ada sumber daya sederhana dan sederhana serta alat debugging yang agak kuat (stm32, IMHO). Jadi, pilihan saya jatuh pada papan pengembangan penemuan stm32f769i.

Catatan


Saat ini, perakitan hanya dimungkinkan dari lingkungan Keil MDK (bootloader, game) atau menggunakan arm-gcc + make (hanya bootloader). Port yang tersedia saat ini untuk - Gempa I (+ mod), Doom (+ mod), Duke Nukem (+ mod), Hexen, Heretic. Dengan semua modifikasi, daftar dapat diperluas secara signifikan.

Ayo mulai


Pada artikel ini saya akan mencoba menguraikan secara singkat ide-ide utama dan prinsip-prinsip implementasi mereka dalam cara membuat konsol game khususnya untuk penemuan stm32f769i. Juga, saya akan mencoba untuk menghindari detail teknis yang rinci, saya lebih suka mengejar tujuan memperkenalkan pembaca ke opsi lain untuk menggunakan MK modern. Dengan "konsol game" - maksud saya perangkat independen dengan kemampuan menjalankan aplikasi "pengguna" tanpa memperbarui perangkat lunak utama.

Arsitektur


Karena implementasi akhir membutuhkan kemampuan untuk menjalankan berbagai game secara independen tanpa memperbarui firmware MK, kebutuhan untuk beberapa versi "bootloader", jadi:

  1. Pemuat; bekerja dengan memori - "instalasi" aplikasi (game), luncurkan.
  2. Sopir; Tingkat layanan sistem HAL dan fungsi terkait, transfer API ke aplikasi.
  3. Aplikasi; Program terakhir tidak mengembalikan kontrol ke bootloader.

1. Bootloader


Ini didasarkan pada model IAP (In-Application-Programming) - driver menggunakan contoh dari ST-microelectronics.

Keunikan dari pendekatan ini adalah bahwa tidak perlu mengubah konfigurasi boot
MK.Seluruh "tubuh" dari bootloader ada di memori utama, dan ini pada gilirannya memungkinkan penggunaan penemuan stm32f769i "out of the box".

Fungsi utama level ini adalah membaca file .bin, menulis kontennya ke memori MK dan mentransfer kontrol. Pada tahap ini, titik kuncinya adalah membaca alamat dari titik masuk dan alamat penunjuk tumpukan, yang kedua tidak diperlukan, karena aplikasi tidak mengembalikan kontrol -
stack dibagikan dan tidak perlu menulis ulang pointer. Panggilan juga dapat dilakukan melalui pointer ke suatu fungsi. Dengan demikian, hasilnya akan menjadi loader "hybrid" - bagian "driver" -nya terus melayani aplikasi, sementara sumber daya loader itu sendiri diturunkan.

2. Pengemudi


Driver dibuat dalam bentuk "pembungkus" di atas tingkat HAL, menyediakan akses ke sumber daya yang diperlukan - sistem file, display \ monitor, suara, game controller \ display sensor. Untuk penggunaan lebih lanjut, API driver ditransmisikan dalam bentuk struktur penunjuk melalui "memori bersama" - sepotong memori yang disediakan untuk bootloader dan sisi kembalinya. Manipulasi seperti itu membutuhkan biaya memori, dan mungkin solusi terbaik adalah menggunakan SWI (soft-interrupt, panggilan svc), tetapi untuk ini, pada gilirannya, Anda harus dapat mengubah konteks - karena tidak semua panggilan dapat ditangani dalam interupsi. Juga, memori "dibagi" digunakan untuk meneruskan argumen pengguna (misalnya, melalui konsol), prasyarat adalah menambahkan atribut no-init untuk bagian ini,ini akan menghindari menimpanya dengan runtime-library pada saat inisialisasi aplikasi pengguna.

3. Aplikasi


Akibatnya, satu-satunya hal yang perlu Anda ketahui pada saat membangun aplikasi adalah arsitektur inti prosesor, tidak ada dependensi dari HAL, juga tidak ada tabel vektor interupsi, semua interupsi diproses oleh loader. Aplikasi sebagai akibatnya menggunakan ruang yang jauh lebih sedikit dalam memori program - karena sebagian fungsionalitasnya "dilindungi" bersama dengan bootloader / driver, yang memungkinkan Anda untuk menginstalnya di area data SRAM (RAM internal). Ini pada gilirannya dapat secara signifikan mengurangi jumlah siklus tulis memori Flash dan juga mempercepat proses debugging dan eksekusi secara umum. Dari minus - pada saat debugging, dimungkinkan untuk memanggil aplikasi hanya dari luar, misalnya, menggunakan perintah dari konsol (COM port over ST-Link, VCOM), untuk ini versi yang sangat sederhana dari baris perintah digunakan.

Sumber:

Loader , hal , Pengemudi

Fitur Pengembangan


Penyimpanan


Hal pertama yang harus saya tangani adalah masalah mengalokasikan sumber daya memori eksternal (SDRAM). Ini disebabkan oleh kenyataan bahwa beberapa gim memerlukan lebih banyak memori untuk bagian .bss (duke nukem ~ 5.5mbytes). Untuk menempatkan volume seperti itu hanya mungkin di sdram, tetapi karena memori yang sama digunakan oleh bootloader untuk menyimpan data sementara - gambar, suara, isi file, dll .., diperlukan hanya sebelum aplikasi dimulai - diputuskan untuk membagi manajemen bagian memori ini - di setiap sisi ada malloc sendiri / gratis. Setelah memulai - driver menggunakan pointer ke fungsi malloc \ free, yang, jika perlu, diteruskan sebagai parameter ke fungsi panggilan. Artinya, setelah memulai permainan, pengemudi tidak dapat langsung melakukan alokasi dari sdram.Fakta menarik tentang D-Cache dan I-Cache - karena kekhasan menangani memori eksternal - Anda harus mematikan kedua baris sebelum memulai, karena sdram diinisialisasi ulang, semuanya akan baik-baik saja, tetapi ada satu "tetapi" - Anda harus selalu membatalkan cache, jika tidak, secara default akan mempertahankan status yang valid dari semua baris, sementara mereka ditimpa dalam interval ketika cache dimatikan.
Fitur lain - semua data bootloader ditempatkan di bagian DTCM, ini memungkinkan untuk tidak menggunakan cache ketika mengakses memori (MPU memungkinkan hal yang sama) dan sebagai hasilnya - masalah koherensi diselesaikan ketika bekerja dengan DMA;
Dalam hubungannya - CPU -> D-Cache -> Memori <- DMA

Seni grafis


Untuk sebagian besar, ini adalah beberapa fungsi penskalaan gambar (2x2, 3x3),
fungsi inisialisasi dan pemuatan palet. Poin kuncinya adalah indikasi yang benar dari atribut memori frame (dilakukan melalui konfigurasi MPU) - untuk bootloader ini akan menjadi "Write-back, no write alokasikan", untuk menghilangkan efek flicker, seperti mode single-buffer digunakan, sementara aplikasi menggunakan "Write through, no write dialokasikan", yang mencapai FPS tertinggi (Doom ~ 28-40).

Semua port game yang ada beroperasi dengan grafis 8-bit, tetapi juga dimungkinkan untuk beralih ke mode true-color 16-bit (memerlukan modifikasi dari sisi permainan).
Dimungkinkan untuk skala gambar 8-bit menggunakan DMA2D, tetapi pendekatan ini belum terbayar - biayanya ~ 1000 gangguan yang diperlukan untuk memproses gambar dengan resolusi akhir 640x480 piksel, itu juga menghasilkan banyak artefak dalam permainan - gambar individu (sprite, poligon) tidak akan sepenuhnya diterjemahkan, karena dalam hal ini, seluruh proses rendering dalam game akan terjadi secara paralel dengan sketsa layar.

Suara


Bagian ini dibuat dalam bentuk perangkat lunak sederhana 16-bit, mixer 16-saluran berdasarkan contoh dari ST-microelectronics, pengontrol I2S juga digunakan. Saat ini, tidak ada cara untuk mengkonversi format audio di antara mereka sendiri - bagian ini diimplementasikan di tingkat permainan tergantung pada persyaratan. Duke Nukem, menurut saya, memiliki seperangkat utilitas terkaya untuk bekerja dengan suara, termasuk dan reverb.

Memasukkan


Driver joystick juga dibuat menggunakan kelas usb-hid (pada kenyataannya, gamepad akan didefinisikan sebagai mouse komputer ..). Sensor tampilan - seperti gamepad, menggunakan saluran yang sama untuk mengirimkan peristiwa, dan itu merupakan hal yang sangat tidak nyaman.

permainan


Malapetaka


Port stm32doom diambil sebagai dasar ,
menambahkan dukungan suara, ditambal dengan perubahan malapetaka cokelat terbaru , beberapa koreksi karena Killough, dari prBoom, ditambahkan. Permainan ini memungkinkan Anda untuk menggunakan semua modifikasi dan peta yang tersedia untuk malapetaka cokelat, termasuk Menambahkan pemandangan dan suara dari versi 3DO dan PS1 game. Optimalisasi grafis telah ditambahkan - resolusi rendering tekstur tergantung pada jarak, solusinya begitu-begitu, di lokasi yang berbeda - keuntungan + 3-7 frame per detik. tersedia. Versi terbaru juga menambahkan dukungan untuk sprite "transparan" - semuanya didasarkan pada tabel kombinasi elemen palet yang dihasilkan - sesuatu yang serupa digunakan di Quake II dan game berbasis engine Build. Game termasuk modifikasi dapat diselesaikan sepenuhnya.

Sumber:

stm32doom , malapetaka 3DO , malapetaka coklat , Versi Saat Ini

Duke nukem


Berdasarkan port adipati cokelat . Tidak ada waktu untuk sepenuhnya memahami kode sumber permainan, jadi semuanya tetap "sebagaimana adanya", hanya cacat kecil yang diperbaiki. Port ini juga memungkinkan Anda untuk menjalankan modifikasi resmi dan tidak cukup - Edisi atom, Musim dingin nuklir, dll ...
Catatan - saat ini, tidak ada episode permainan yang dapat sepenuhnya diselesaikan karena cacat yang ada.

Sumber:

duke cokelat , Versi Saat Ini

Gempa saya


Sayangnya, tautan ke repositori asli tidak terpelihara dan saya tidak dapat menemukannya,
port tersebut dieksekusi dengan nama sdl gempa. Dari fitur-fiturnya, perlu diperhatikan keberadaan arsitektur client-server, tumpukan yang sangat β€œrakus” (~ 700kb) karena banyak situasi menarik muncul untuk pertama kalinya (armcc tidak benar-benar memantau penggunaannya), masalah yang tersebar luas dengan penyelarasan - mungkin masalah yang meluas dengan penyelarasan - mungkin masalah ini terkait hanya armcc dari kompiler, tetapi hampir di mana-mana di mana ada banding ke elemen struktur yang lebih besar dari satu byte dalam ukuran - Anda perlu menggunakan fungsi wrapper untuk membaca / menulis byte sebaliknya - pengecualian hard-kesalahan. Game ini cukup bagus "going", dengan rata-rata fps ~ 15. Beberapa episode juga dapat diselesaikan, lebih atau kurang nyaman hanya pada tingkat kesulitan pertama :)

Sumber:

Versi saat ini

Hexen, Bidat


Untuk sebagian besar, mereka mewarisi mesin Doom, jadi dari sudut pandang porting, mereka hampir identik (IMHO). Dalam hexen menambahkan kemampuan untuk memulai permainan di lokasi yang dipilih, game tidak dapat diselesaikan sepenuhnya.

Sumber:

hexen stm32 , sesat stm32

Hasil


Doom , Duke Nukem , Gempa

Terima kasih atas perhatian Anda.

All Articles