Skip to main content
← Back to blog
rustzynqrtos

Neden Zynq?

5 min read
Neden Zynq?

Zynq ile daha önce çalışmıştım — tanışığım ama tamamen hakim değilim. Çekirdek seviyesinde inceliklere inmedim, bu seride ben de Zynq'i daha iyi öğrenmiş olacağım. Bu tanışıklık seri için yine de avantaj çünkü esas yeni eksen Rust tarafında olacak. İki bilinmeyen yerine bir bilinmeyen.

Yine de Zynq'i hiç bilmeyen okuyucu için bu yazı bir zemin olmalı. Bu seride sürekli Zynq'in parçalarından bahsedeceğim — A9, GIC, SCU, AXI, MMU — ve bu isimlerin bir yerde buluştuğu fikri kafada olması lazım. Bu yazı o çerçeveyi çiziyor.

Zynq nedir

Zynq, Xilinx döneminde ortaya çıkan bir SoC (System on Chip) ailesi. Tek bir silikon parça üzerinde iki farklı dünyayı birleştiriyor: bir tarafta ARM tabanlı bir işlemci sistemi, diğer tarafta programlanabilir mantık (FPGA fabric). Bu iki tarafa Xilinx'in kendi adlandırması:

  • PS — Processing System: ARM Cortex-A9 MPCore tabanlı işlemcisi, bellek denetleyicileri (DDR3, OCM), ve standart peripheral'lar (UART, SPI, I2C, Ethernet, USB, SD, GPIO). Bildiğimiz "embedded processor" dünyası.
  • PL — Programmable Logic: FPGA kısmı. LUT'lar, flip-flop'lar, block RAM, DSP slice'ları. Yazılımın donanıma dönüştüğü yer.

Bu iki dünya arasında AXI interconnect var — ARM'ın standart bus protokolü. PS, PL'ye AXI ile konuşuyor; PL, PS'e AXI ile konuşuyor. AXI üzerinden interrupt hatları, DMA, shared memory — hepsi çalışıyor.

Bu serideki asıl oyuncu PS tarafı. Yani Cortex-A9, cache, MMU, GIC. Bu seride PL'ye dokunmayacağım. İlerleyen yazılarda bir ihtiyaç çıkarsa belki değinirim, ama şimdilik plan PS-odaklı.

Zynq-7000 ailesi 2011'den beri değişmiş, olgunlaşmış, dokümantasyonu oturmuş bir platform. ARM'ın ARMv7-A mimarisini temsil ediyor. Bugünlerde Xilinx'in yeni çipleri (Zynq UltraScale+, Versal) ARMv8 kullanıyor ama Zynq-7000 hala yaygın ve erişilebilir. "Bu seriyi iki yıl sonra birisi okursa hala çalışan bir platform" demek önemli.

Neden Zynq

Bu seri için bir hedef belirledim: ARM A-profile bare-metal. A-profile demek application processor demek — MMU'lu, cache'li, operating system çalıştırabilen çekirdek. Bunu öğrenmek için dört şeyi aynı anda veren bir donanım lazımdı:

  1. MMU. Bir RTOS yazarken sayfa tabloları kurmak, virtual memory'yi anlamak, TLB'yi yönetmek gerek.
  2. Cache hiyerarşisi. L1 + L2, dual-core coherency. Memory barrier'ların neden lazım olduğunu gerçekten hissetmek için bu olmadan olmaz.
  3. SMP donanımı. İki çekirdek, paylaşımlı cache, inter-processor interrupt. Dual-core bir RTOS yazma imkanı, tek-core'dan tamamen farklı bir ders.
  4. Açık dokümantasyon. Primary source'lara erişim — UG585, ARM DDI 0388, DDI 0407, DDI 0406. Tahmin yürütmeden her registerın ne yaptığını okuyabilmek.

Zynq-7010 bu dördünü veriyor. Dual-core Cortex-A9 MPCore — her çekirdekte L1 (32KB I + 32KB D), ortak L2 (512KB), dahili SCU (Snoop Control Unit) cache coherency için, GIC (Generic Interrupt Controller) kesmeler için. NEON ve VFPv3 her çekirdekte. 667 MHz — oyuncak değil, yavaş da değil.

Xilinx dokümantasyonu bu seri için özellikle değerli: UG585 (Zynq-7000 TRM) nerede hangi register var, onu söylüyor. ARM'ın kendi belgeleri (Cortex-A9 TRM ve ARMv7-A Architecture Reference Manual) çekirdeğin iç işleyişini. İki katmanın belgeleri birbirini tamamlıyor.

Ve bir pratik sebep daha: Zynq'in PS tarafı hem fiziksel kartta hem QEMU'da çalışıyor. QEMU'nun xilinx-zynq-a9 makinesi Zynq-7000'i taklit ediyor, yani kartı olmayan bir okuyucu seriyi sanal ortamda takip edebilir. Çoğu embedded öğrenme serisinde bu seçenek yoktur.

Yazı 0'da alternatiflere değinmeyi düşünmüştüm ama vazgeçtim — birçok karşılaştırma yazmak konunun merkezinden uzaklaştırır. Sadece şunu söyleyeyim: Cortex-M (STM32 gibi) MMU ve A-profile kavramlarını vermiyor, 64-bit ARM (Raspberry Pi gibi) başka bir mimari (ARMv8) demek. Zynq bu serinin hedefi için kesişim noktasında duruyor.

Zynq'in dezavantajları

Bu yazıyı "Zynq harika, gidin alın" yazısı yapmak istemiyorum. Her seçimin tersi var.

Boot süreci karmaşık. Zynq'i açtığında BootROM çalışıyor, o FSBL'i (First Stage Boot Loader) yüklüyor, FSBL senin uygulamanı yüklüyor. Xilinx'in tool'ları (Vivado, Vitis) bu zinciri sihirli bir şekilde kuruyor — ama arkasında ne olduğunu öğrenmek başlı başına bir iş. Faz 1'de bu kuyuya ineceğim.

Xilinx ekosistemi labirent. Vivado, Vitis, eski Xilinx SDK, PetaLinux, XSCT, BOOT.BIN, XSA, BIT, ELF, DTS... Yeni birisi ilk iki haftayı "hangi tool ne iş yapıyor" sorusuyla geçirebilir. Ben bunun çoğunu devre dışı bırakıyorum — Vivado'yu sadece hardware export için kullanacağım, geri kalan için Rust toolchain + QEMU + GDB yetecek. Ama her okuyucu bu seçimi yapamaz; Xilinx dünyasının ağırlığı gerçek.

Rust tarafı bir bilinmeyen. armv7a-none-eabihf bir Rust hedefi olarak destekleniyor, ama bu seride neyle karşılaşacağımı şimdiden bilmiyorum. Cortex-M ekosisteminin olgunluğunda mı, değil mi — seri boyunca birlikte göreceğiz.

Bunların hiçbiri Zynq'i "kötü" yapmıyor — sadece hangi problemle uğraşacağını bilmen lazım.

Zynq-7010 özelinde

Elimdeki kart Zynq-7010 (XC7Z010). Aile içindeki konumu: dual-core PS + küçük PL.

PS tarafı diğer Zynq-7000'lerle (7020, 7030 gibi) aynı. Aynı Cortex-A9 MPCore, aynı cache düzeni, aynı GIC, aynı peripheral'lar, aynı register adresleri. Yani bu serinin yazdığı RTOS kodu, başka bir 7000 ailesi parçasında da çalışmalı — spec olarak.

Fark PL'de: 7010'un 28K logic cell'i var, 7020'nin 85K. Daha küçük bir FPGA. Bu seride PL'yi minimal kullanacağım için 7010'un kapasitesi fazlasıyla yeter.

Yazı 0'da söyledim, tekrarlıyorum: 7020 veya başka bir 7000 parçası elindeyse seriyi sorunsuz takip edebilirsin. Kod sizin için de çalışır; ben sadece kendi kartımda test ediyorum.

Sonraki yazı

İki hafta sonra Yazı 2: "Neden Rust." Donanım tarafı netleşti, sırada yazılım tarafı. Neden Rust seçtim, C ile kıyaslandığında ne kazandırıyor, bare-metal tarafta ne sınırlar var — bunları konuşacağız.


Sonradan döneceğim

Bu kutu şimdilik boş. İlerleyen yazılarda geri dönüp Yazı 1'de bilmediğim veya atladığım şeyleri buraya ekleyeceğim.


Terminoloji

  • SoC (System on Chip): tek çip üzerinde sistem
  • FPGA (Field-Programmable Gate Array): programlanabilir mantık dizisi
  • MMU (Memory Management Unit): bellek yönetim birimi
  • MPCore (Multi-Processor Core): çok çekirdekli işlemci kümesi; ARM'ın dual/quad Cortex-A ailesi için kullandığı isim
  • GIC (Generic Interrupt Controller): ARM'ın standart kesme denetleyicisi
  • SCU (Snoop Control Unit): çok çekirdekli sistemde L1 cache'ler arasında tutarlılık sağlayan birim
  • AXI (Advanced eXtensible Interface): ARM'ın AMBA ailesindeki bus protokolü
  • PS / PL (Processing System / Programmable Logic): Zynq'in iki yarısı — işlemci tarafı ve FPGA tarafı