Gemstone için NuttX desteği henüz geliştirme aşamasındadır. Kartın üzerindeki I2C, SPI, PWM, CAN Bus gibi tüm çevre birimleri kullanmak mümkün değildir.
NuttX, gerçek zamanlı uygulamalar için tasarlanmış açık kaynaklı bir işletim sistemidir. POSIX ve ANSI standartlarına uyumlu olan NuttX, özellikle gömülü sistemler ve mikrodenetleyiciler için optimize edilmiştir. Gemstone kartında bulunan R5F çekirdekleri için NuttX’i seçmemizin temel nedeni, onun deterministik davranış sergilemesi ve gerçek zamanlı görevleri güvenilir şekilde yönetebilmesidir. Ayrıca NuttX, Ardupilot ve PX4 gibi popüler otopilot yazılımlarının desteklediği bir platform olması nedeniyle drone ve otonom araç projeleri için kritik öneme sahiptir. AM67A SoC’si için henüz resmi NuttX desteği bulunmadığından, özel olarak boards/arm/am67/t3-gem-o1 dizininde nsh konfigürasyonu oluşturulmuştur. Bu konfigürasyon ile NuttX, kartımızda yer alan gerçek zamanlı işlemlere uygun R5F çekirdeklerinde çalıştırılabilmektedir.

1. Derleme

1.1. Toolchain Kurulumu

NuttX’i derleyebilmek için ARM Cortex-R5F çekirdekleri ile uyumlu bir çapraz derleyiciye ihtiyacımız vardır. gcc-arm-none-eabi toolchain’i bu ihtiyacımızı karşılayan standart çözümdür. Ubuntu/Debian sistemlerde toolchain’i paket yöneticisi ile kurabilirsiniz:
sudo apt update
sudo apt install gcc-arm-none-eabi
Alternatif olarak, ARM’ın resmi sitesinden en güncel sürümü indirerek manuel kurulum yapabilirsiniz. Kurulumun ardından arm-none-eabi-gcc --version komutuyla toolchain’in düzgün çalıştığını doğrulayabilirsiniz.

1.2. Kaynak Kodları İndirme

NuttX ekosistemi iki temel repository’den oluşmaktadır: çekirdek işletim sistemi ve uygulama framework’ü. Gemstone kartı için özelleştirilmiş versiyonları indirmek için aşağıdaki adımları takip edin:
# Ana NuttX repository'sini klonlayın
git clone https://github.com/t3gemstone/nuttx.git

# NuttX uygulamalarını 'apps' klasörü olarak klonlayın
git clone https://github.com/t3gemstone/nuttx-apps.git apps

# Ana çalışma dizininize geçin
cd nuttx
Bu yapılandırma, NuttX’in beklediği standart dizin düzenini oluşturur. apps klasörü, işletim sisteminin üzerinde çalışacak uygulamaları ve servisleri içerir.

1.3. Varsayılan Konfigürasyonu Uygulama

NuttX, farklı donanım platformları için önceden hazırlanmış konfigürasyonlar kullanır. Gemstone kartımız için t3-gem-o1:nsh konfigürasyonunu uygulayarak başlayalım:
./tools/configure.sh -l t3-gem-o1:nsh
Bu komut, AM67A SoC’nin özelliklerine uygun temel ayarları yapılandırır ve NuttShell (nsh) isimli basit bir komut satırı arayüzünü aktif hale getirir. NuttShell, sistem üzerinde temel dosya işlemleri ve sistem yönetimi görevlerini gerçekleştirmenizi sağlar.

1.5. Projeyi Derleme

Konfigürasyon tamamlandıktan sonra NuttX’i derleyebiliriz:
make -j$(nproc)
Bu komut, sisteminizde bulunan tüm CPU çekirdeklerini kullanarak paralel derleme yapar. Derleme sonucunda nuttx isimli bir ELF dosyası oluşur. Bu dosya, R5F çekirdeğine yüklenecek işletim sistemi imajını içerir.

1.6. Konfigürasyonu Özelleştirme

Bazen varsayılan konfigürasyonda değişiklik yapmanız gerekebilir. NuttX, Linux çekirdeğine benzer şekilde menuconfig aracını kullanır. Bu grafik arayüz üzerinden driver’ları aktifleştirebilir, bellek ayarlarını değiştirebilir veya yeni özellikler ekleyebilirsiniz. Yaptığınız değişiklikler .config dosyasında tutulur.
make menuconfig
Değişikliklerinizi kalıcı hale getirmek ve versiyon kontrol sistemine ekleyebilmek için savedefconfig komutunu kullanın. Bu komut, sadece varsayılan ayarlardan farklı olan konfigürasyonları kaydeder, böylece konfigürasyon dosyası gereksiz yere büyümez. Komut sonucu oluşan defconfig isimli dosyayı boards/arm/am67/t3-gem-o1/configs dizini altındaki nsh isimli varsayılan konfigürasyona kopyalayabilir ya da farklı bir isimde yeni konfigürasyon oluşturabilirsiniz.
make savedefconfig

1.7. Temizlik İşlemleri

Geliştirme sürecinde bazen temiz bir başlangıç yapmanız gerekebilir. NuttX iki seviyede temizlik komutu sunar:
# Sadece obje dosyalarını ve binary'leri temizler
make clean

# Tüm build dosyalarını ve konfigürasyonu temizler
make distclean
make clean komutu derleme sonucunda oluşan dosyaları siler ancak konfigürasyonu korur. make distclean ise projeyi tamamen ilk haline döndürür, bu durumda konfigürasyon işlemini tekrar yapmanız gerekir.

2. Çalıştırma

NuttX işletim sistemi R5F çekirdeklerinde çalışırken A53 çekirdeklerinde de Linux işletim sistemi çalışmaktadır. Linux işletim sisteminde ve U-Boot’ta yer alan remoteproc mekanizması ile R5F çekirdeklerine kod yüklenebilmektedir. Remoteproc ile çekirdeklere yüklenecek program dosyaları /lib/firmware dizini altına önceden tanımlı isimlerde kopyalanmalıdır. Sistem başlangıcında, remoteproc mekanizması programları ilgili çekirdeklere otomatik olarak yükleyecektir. NuttX’i remoteproc ile çalıştırmak için aşağıdaki adımları takip edin.
  1. Derleme sonucu oluşan nuttx dosyasını /lib/firmware dizinine j722s-main-r5f0_0-fw isminde kopyalayın.
  2. Kartı yeniden başlatın.
  3. UART-MAIN1’in 40-pin HAT’te yer alan GPIO-14 (TX) ve GPIO-15 (RX) pinlerine USB-to-TTL cihazı bağlayarak NuttShell’e erişebilirsiniz.
  4. Açılan nsh konsolundan blink isimli programı çalıştırıp kartın üzerinde yer alan kullanıcı ledlerinin yanıp söndüğünü gözlemleyebilirsiniz.

3. Debug

3.1. Debug Özelliklerini Aktif Etme

NuttX varsayılan olarak release modunda konfigüre edilmiştir, bu da optimize edilmiş ancak debug bilgileri içermeyen küçük boyutlu bir ELF dosyası üretir. Geliştirme sürecinde adım adım debug yapabilmek için debug moduna geçmeniz gerekecektir. menuconfig aracını açın ve şu yolu takip edin: Build SetupDebug OptionsEnable Debug Features. Ayrıca Generate Debug Symbols seçeneğini de aktifleştirin. Bu ayarlar, derleyicinin debug bilgilerini ELF içerisine gömüp, debugger’ın kaynak kod seviyesinde debug yapabilmesini sağlar.

3.2. CCS IDE Entegrasyonu

Texas Instruments Code Composer Studio (CCS), AM67A SoC ailesi için özel olarak optimize edilmiş geliştirme ortamıdır. NuttX projenizi CCS’e entegre etmek için IDE’yi açın ve FileImportC/C++Existing Code as Makefile Project seçeneğini kullanın. Proje dizini olarak nuttx klasörünü seçin.

3.3. Çekirdeğe Programı Yükleme

CCS IDE üzerinden debug işlemini başlatmak için önce kullanacağınız Debug Probe modelini (örneğin Texas Instruments XDS200) ve J722S_TDA4VEN_TDA4AEN_AM67 kartını seçerek Target Configuration oluşturun. Ardından Target Configuration’ı başlatıp
AM67A SoC’ye bağlanın.
Debugger bağlantısı sağlandıktan sonra, Main R5F çekirdeğini seçip RunLoadLoad Program ile nuttx ELF dosyasını seçin. Bu işlem, NuttX işletim sistemini R5F çekirdeğinin belleğine yükler. Program yüklendikten sonra breakpoint’ler koyabilir, değişkenleri izleyebilir ve kod üzerinde adım adım ilerleyebilirsiniz. NuttX’in task scheduler’ı ve interrupt handler’ları gibi kritik bileşenlerinin nasıl çalıştığını bu şekilde detaylı olarak inceleyebilirsiniz.