> ## Documentation Index
> Fetch the complete documentation index at: https://docs.t3gemstone.org/llms.txt
> Use this file to discover all available pages before exploring further.

# NuttX

> NuttX İşletim Sistemi

<Warning>
  Gemstone için NuttX desteği henüz geliştirme aşamasındadır. Kartın üzerindeki CAN Bus gibi bazı çevre
  birimleri kullanmak mümkün değildir.
</Warning>

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. Gereksinimleri ve Toolchain'i Kurma

NuttX'i derleyebilmek için sistemde çeşitli gereksinimlerin bulunması gerekmektedir. Aynı zamanda 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 gereksinimleri ve toolchain'i paket yöneticisi ile kurabilirsiniz:

```bash theme={"system"}
sudo apt update
sudo apt install \
    bison flex gettext texinfo libncurses5-dev libncursesw5-dev xxd \
    git gperf automake libtool pkg-config build-essential gperf genromfs \
    libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev \
    libexpat1-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux \
    kconfig-frontends gcc-arm-none-eabi
```

Alternatif olarak, ARM'ın resmi sitesinden toolchain'in en güncel sürümünü 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:

```bash theme={"system"}
# 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:

```bash theme={"system"}
./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:

```bash theme={"system"}
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.

```bash theme={"system"}
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.

```bash theme={"system"}
make savedefconfig
```

### 1.7. Temizlik İşlemleri

Geliştirme sürecinde bazen temiz bir başlangıç yapmanız gerekebilir. NuttX iki seviyede temizlik komutu sunar:

```bash theme={"system"}
# 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.

<Tip>
  U-Boot'ta `remoteproc` mekanizması ile kullanabilmek için [2.8. Derlenmiş projenin U-Boot aşamasında çalıştırılması](/tr/boards/o1/peripherals/mcu#2-8-derlenmiş-projenin-u-boot-aşamasında-çalıştırılması)
  bölümünü inceleyebilirsiniz.
</Tip>

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 Setup` → `Debug Options` → `Enable 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 `File` → `Import` → `C/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 `Run` → `Load` → `Load 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.
