Embox RTOS di Raspberry Pi

gambarHalo!

Kita sering ditanya apakah Embox mendukung Raspberry Pi. Ya ada. Deskripsi cara menjalankan sekarang di sini . Pada artikel ini saya ingin berbicara lebih banyak tentang ini.

Kami telah membeli papan Raspberry Pi Model B rev 2.0 untuk waktu yang lama (ini adalah Rpi 1 pertama) dan bahkan mengambil langkah pertama dalam porting: UART, interrupt controller, timer, dan bahkan framebuffer diimplementasikan dalam beberapa bentuk. Tetapi data tentang bagaimana memulainya hilang, jadi saya harus mengingat / memahaminya lagi.

Pertama, mereka meluncurkan emulator QEMU. QEMU reguler memiliki dukungan mesin raspi2, tetapi tidak ada raspi. Tetapi ketika ada proses porting, hanya dukungan raspi ditambahkan. Kami masih memiliki versi dalam repositori kami, meskipun kami harus menyusun komitmen untuk mengkompilasinya ke lingkungan modern, tetapi pada akhirnya kami mendapatkan versi emulator QEMU yang memiliki dukungan rpi1 - mesin "-M raspi" (Anda dapat melihat cara menjalankannya di wiki kami) Hasilnya, Embox diluncurkan di sana dan menghasilkan gradien dalam memori video.

Ada pertanyaan tentang memulai dari besi. Cara mem-boot tidak jelas pada awalnya, jadi kami memutuskan untuk mencoba Raspbian standar. 2020-02-13-raspbian-buster-lite.img diunduh dari situs resmi . Semua unduhan terjadi dari kartu microSD, jadi kami menyiapkannya - salin gambar yang dihasilkan
dd bs=4M if=2020-02-13-raspbian-buster-lite.img of=/dev/sdb conv=fsync
di mana "/ dev / sdb" adalah kartu SD.

Jika Anda melihat lsblk sekarang, akan ada sesuatu seperti ini:


sdb      8:16   1  14,6G  0 disk 
β”œβ”€sdb1   8:17   1   256M  0 part 
└─sdb2   8:18   1  14,3G  0 part

Mari kita me-mount sdb1 dan melihat apa yang ada di sana:


$ sudo mount /dev/sdb1 /mnt
$ ls /mnt/
bcm2708-rpi-b.dtb       bcm2710-rpi-3-b.dtb       COPYING.linux  fixup_db.dat      start_db.elf
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-3-b-plus.dtb  fixup4cd.dat   fixup_x.dat       start.elf
bcm2708-rpi-cm.dtb      bcm2710-rpi-cm3.dtb       fixup4.dat     issue.txt         start_x.elf
bcm2708-rpi-zero.dtb    bcm2711-rpi-4-b.dtb       fixup4db.dat   kernel.img
bcm2708-rpi-zero-w.dtb  bootcode.bin              fixup4x.dat    LICENCE.broadcom
bcm2709-rpi-2-b.dtb     cmdline.txt               fixup_cd.dat   overlays
bcm2710-rpi-2-b.dtb     config.txt                fixup.dat      start_cd.elf

Seperti yang Anda lihat, ada satu set * .dtb untuk semua kesempatan - untuk versi Raspberry yang berbeda. Kami juga melihat bootloader - bootcode.bin, dan kernel.img adalah Linux.

Kami menghubungkan monitor melalui HDMI ke papan, boot, melihat Raspbian, semuanya baik-baik saja. Selanjutnya, kita perlu menyalin biner kita dengan Embox ke kernel.img sehingga bootloader memuatnya.
Membangun embox:


make confload-arm/rpi1-model-b
make

Salin biner yang dihasilkan:


cp build/base/bin/embox.bin /mnt/kernel.img

Kami memasukkan kartu SD kembali ke Rpi dan menyalakan daya - pada monitor, kotak yang seharusnya ditarik oleh Embox tidak muncul. Baiklah, mari kita coba sambungkan melalui port serial dan debug biner kita. Untuk melakukan ini, gunakan adaptor RDC1-USB-UART. Kami menghubungkannya ke papan sebagai berikut:


RDC1      Rapi

GND <---> GND
5V  <---> 5V
RX  <---> TXD0/GPIO14
TX  <---> RXD0/GPIO15

Di sini Anda dapat melihat pinout pada gambar sehingga dimaafkan. Sekarang ternyata daya ke adaptor USB berasal dari hub USB PC, dan daya ke Rpi, pada gilirannya, dipasok dari adaptor USB.



Nyalakan. Terhubung melalui minicom:


sudo minicom -d /dev/ttyUSB0

Tidak ada kesimpulan yang terlihat. Pasti ada semacam masalah dengan driver port serial. Kami mencoba menonaktifkan inisialisasi register, dan menggunakan apa yang dikonfigurasikan oleh bootloader, isi gambar baru pada kartu SD - output telah muncul. Semuanya jelas, artinya terhubung dengan benar, tetapi driver port serial tidak dapat diprogram dengan benar. Saya tidak akan berbicara tentang bagaimana kami memperbaiki driver port serial PL011, tetapi saya akan mencatat beberapa poin yang mungkin berguna ketika mengembangkan untuk platform ini. Pertama, alamat dasar pada Rpi dikomputasi entah bagaimana membingungkan, mereka tidak dapat ditemukan langsung dalam dokumentasi, jadi cara yang baik untuk memeriksa alamat dasar register adalah dengan melihatnya di Linux:


pi@raspberrypi:~$ ls /sys/bus/amba/devices/20201000.serial

Kami melihat bahwa alamatnya 0x20201000.

Poin kedua adalah ada modifikasi Linux untuk Rpi, yang dapat dirakit dan disalin ke kernel.img - www.raspberrypi.org/documentation/linux/kernel/building.md

Dalam kasus port serial, sangat membantu untuk memahami frekuensi input UARTCLK, diperlukan untuk pemrograman baud rate - cukup masukkan printk () di tempat yang tepat di driver / tty / serial / amba-pl011.c.

Hasilnya, tanpa perubahan signifikan, kami berhasil meluncurkan gambar yang sama seperti untuk QEMU pada besi.

Itu mungkin saja, karena tidak masuk akal untuk membongkar sumber driver, karena Anda bisa mempelajarinya di repositori kami. Secara umum, tampaknya di bawah Raspberry ada sangat sedikit port dari OS non-Linux lainnya. Sebagai contoh, saya tidak menemukan FreeRTOS (ternyata semacam repositori ada di GitHub, tetapi tidak dalam rilis resmi), baik untuk NuttX, atau semacamnya. Ya, dan diskusi di forum menunjukkan bahwa RTOS seharusnya tidak diperlukan di sana dan mengambil tempat yang lebih baik untuk bermain Arduino - www.raspberrypi.org/forums/viewtopic.php?t=201540 Contoh Osdev

ternyata tidak beroperasi, jadi jika seseorang menginginkan sesuatu- kemudian lakukan pada bare metal, kemudian lihat contoh yang lebih baik dari kami :)

Dukungan penuh untuk Rpi 2/3/4 baru masih dalam rencana kami. Tetapi beberapa dukungan kemungkinan besar akan disampaikan sebagai bagian dari GSoC 2020, salah satu ide paling populer di kalangan siswa. Sebenarnya, untuk GSoC, kami mengembalikan dukungan Rpi1 di Embox. Jika seseorang memiliki pemikiran tentang mengapa mereka membutuhkan Rpi RTOS, tulis di komentar, kami akan senang :)

Selain itu, jika Anda mempelajari sumber RaPi atau hanya Embox, kami akan dengan senang hati menjawab pertanyaan:
Newsletter: embox-ru@googlegroups.com
Obrolan Telegram: t.me/embox_chat

All Articles