Memulai Zephyr di Ubuntu
Cara saya memasang Zephyr RTOS di Ubuntu Linux dan mem-flash aplikasi pertama ke nRF5340 DK, setelah terbiasa dengan bare metal.
Spesifikasi utama
| Board | Nordic nRF5340 DK |
|---|---|
| SoC | nRF5340, dua core Arm Cortex-M33 (aplikasi + jaringan) |
| Komputer | Ubuntu Linux |
| Alat | west, Zephyr SDK, CMake, Ninja |
| Debugger | SEGGER J-Link, sudah terpasang di DK |
| Aplikasi pertama | Blinky (samples/basic/blinky) |
Diagram blok
Gambaran umum
Selama bertahun-tahun saya menulis firmware secara bare metal, dengan main loop buatan sendiri, interrupt, dan driver yang langsung menulis ke register. Saya ingin mencoba Zephyr, RTOS open source yang sekarang didukung Nordic, NXP, ST, dan banyak lainnya. Berikut cara saya memasangnya di Ubuntu dan menjalankan aplikasi pertama di nRF5340 DK.
Memasang Zephyr di Ubuntu
1. Pasang alat-alat sistem
$ sudo apt update && sudo apt upgrade
$ sudo apt install --no-install-recommends git cmake ninja-build gperf \
ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \
xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1
2. Buat lingkungan Python dan pasang west
west adalah alat command line milik Zephyr. Alat ini mengunduh kode, melakukan build, dan mem-flash. Saya memasangnya di lingkungan Python tersendiri, supaya tidak tercampur dengan Python bawaan Ubuntu.
$ python3 -m venv ~/zephyrproject/.venv
$ source ~/zephyrproject/.venv/bin/activate
$ pip install west
Setiap membuka terminal baru, jalankan lagi perintah ini sebelum memakai west.
$ source ~/zephyrproject/.venv/bin/activate
3. Unduh Zephyr
$ west init ~/zephyrproject
$ cd ~/zephyrproject
$ west update
$ west zephyr-export
$ west packages pip --install
west update butuh waktu cukup lama. Perintah ini mengunduh Zephyr dan semua modulnya, termasuk library dari para vendor.
4. Pasang Zephyr SDK
SDK berisi compiler (GCC untuk Arm dan arsitektur lain) serta alat debugging.
$ cd ~/zephyrproject/zephyr
$ west sdk install
5. Pasang alat untuk mem-flash nRF5340 DK
DK ini sudah punya debugger SEGGER J-Link. Untuk mem-flash dari Linux, saya memasang dua alat.
- J-Link Software and Documentation Pack dari SEGGER (file
.debuntuk Ubuntu), - nRF Util dari Nordic, lalu perintah untuk board.
$ nrfutil install device
6. Build dan flash Blinky
nRF5340 punya dua core. Aplikasi berjalan di core aplikasi, cpuapp.
$ cd ~/zephyrproject/zephyr
$ west build -p always -b nrf5340dk/nrf5340/cpuapp samples/basic/blinky
$ west flash
LED1 di board mulai berkedip.
7. Lihat keluaran serial
Contoh hello_world menulis ke port serial USB milik DK.
$ west build -p always -b nrf5340dk/nrf5340/cpuapp samples/hello_world
$ west flash
$ sudo usermod -aG dialout $USER # sekali saja, lalu logout dan login lagi
$ screen /dev/ttyACM0 115200 # keluar dengan Ctrl+A, lalu K
Yang saya pelajari - bare metal vs Zephyr
Bare metal berarti kode saya satu-satunya yang berjalan di chip. Ada loop while (1), interrupt untuk hal yang mendesak, dan driver yang ditulis langsung ke register. Hasilnya kecil, cepat, dan sepenuhnya bisa diprediksi, dan saya tahu setiap baris yang berjalan. Untuk produk sederhana, misalnya satu sensor dan satu tugas, ini tetap pilihan yang tepat.
Masalahnya muncul saat proyek makin besar. Dengan BLE, layar, logging, dan sensor sekaligus, main loop berubah menjadi tumpukan flag dan state machine, dan satu tugas yang lambat menunda semua tugas lain.
Zephyr memberi saya empat hal.
- Thread dengan prioritas. Setiap tugas punya thread sendiri, dan scheduler menjalankan yang paling mendesak lebih dulu. Mutex, semaphore, dan message queue membuat thread bisa berbagi data dengan aman.
- Stack siap pakai. Bluetooth LE, USB, jaringan, file system, logging, dan shell sudah tersedia, dirawat, dan diuji.
- Kode yang portabel. Hardware dijelaskan di devicetree dan fitur diaktifkan di Kconfig (
prj.conf). Blinky yang sama bisa di-build untuk ratusan board hanya dengan mengganti-b. - Dua core sudah diurus. Di nRF5340, Zephyr bisa menjalankan controller Bluetooth di core jaringan untuk saya. Dengan bare metal, saya harus mengatur sendiri kedua core dan komunikasi di antara keduanya.
Ada harganya. Zephyr butuh flash dan RAM lebih besar, sistem build-nya (west, CMake, devicetree, Kconfig) perlu waktu untuk dipelajari, dan error kadang lebih sulit dilacak.
Pegangan saya. Untuk perangkat kecil dengan satu fungsi, saya pakai bare metal. Begitu saya butuh beberapa tugas berjalan bersamaan, koneksi nirkabel, atau kode yang harus tetap bisa dipakai saat ganti chip, saya pakai Zephyr.