2. ünite / 11 · yaklaşık 4 saat
Araç zinciri: derleme, bağlama, yükleme, hata ayıklama
STM32CubeIDE ve PlatformIO, GCC ve bağlayıcı betiği, .elf/.bin, ST-LINK ve SWD ile adım adım hata ayıklama.
Bu ünitenin sonunda
- Kaynaktan çalışan koda giden zinciri (ön işlemci, derleyici, bağlayıcı, objcopy, yükleyici) açıklamak
- STM32CubeIDE ve PlatformIO ile proje kurmak; CubeMX'in ürettiği kodun nereye yazılacağını bilmek
- Bağlayıcı bölümlerini (.text, .rodata, .data, .bss) ve Flash/RAM bütçesini okumak
- ST-LINK ve SWD ile kesme noktası koyup yazmaç ve değişken izlemek
Ders notları
Bilgisayarında yazdığın C kodu, başka bir işlemci (ARM) için derlenir: buna çapraz derleme denir. Araç zinciri arm-none-eabi-gcc'dir.
- Derleyici: her .c dosyasını makine kodlu .o dosyasına çevirir.
- Bağlayıcı: .o dosyalarını ve kütüphaneleri birleştirir; bağlayıcı betiği (.ld) hangi bölümün Flash'a, hangisinin RAM'e gideceğini söyler. Sonuç .elf'tir (hata ayıklama bilgisiyle).
- objcopy: .elf'ten karta yazılacak saf .bin ya da .hex çıkarır.
- Yükleyici: ST-LINK, SWD hattı (SWDIO, SWCLK) üzerinden Flash'a yazar.
İki yol
STM32CubeIDE, ST'nin ücretsiz ortamıdır: CubeMX ile pinleri ve saatleri grafik olarak ayarlarsın, başlangıç kodu üretilir. Kendi kodunu yalnız /* USER CODE BEGIN */ ile /* USER CODE END */ arasına yaz; yeniden üretimde gerisi silinir. PlatformIO (VS Code eklentisi) aynı HAL'i kullanır, tek bir platformio.ini ile yapılandırılır, komut satırından derlenir ve CI'da kolay çalışır.
Bellek bütçesi
Derleme sonunda arm-none-eabi-size dört sayı verir: text, data, bss. Flash = text + rodata + data (ilk değerler Flash'ta saklanır), RAM = data + bss + yığın + öbek. Tek bir printf("%f") onlarca kilobayt ekleyebilir; küçük kartlarda bu fark edilir.
Simülasyon
Bağlayıcı (linker) bölümleri: Flash ve RAM bütçesi
.text, .rodata, .data, .bss, yığın ve öbek boyutlarını değiştir; Flash ve RAM doluluğunu gör. .data neden iki kez sayılır, printf ve float neden Flash'ı şişirir?
Kendin dene
Bağlayıcı simülasyonunda F401RE (512 KB Flash, 96 KB RAM) ve F030 (16 KB Flash, 4 KB RAM) hedeflerini karşılaştır. "printf + float" seçeneğini aç: hangi kartta sığmıyor? Büyük bir başlangıç değerli dizi (.data) ile sıfır dizi (.bss) arasındaki farkı Flash sütununda gör. Gerçek kartla: PlatformIO'da boş proje derle, size çıktısını not et.
Kod
; Nucleo-F401RE, STM32Cube HAL çerçevesi
[env:nucleo_f401re]
platform = ststm32
board = nucleo_f401re
framework = stm32cube
build_flags = -Wall -Wextra -Os ; uyarılar açık, boyuta göre iyileştir
upload_protocol = stlink
debug_tool = stlink
monitor_speed = 115200
; Terminal:
; pio run derle
; pio run -t upload ST-LINK ile yükle
; pio device monitor seri port
; pio test -e native saf mantık testleri bilgisayardaSık yapılan hatalar
- CubeMX kodunu USER CODE blokları dışında değiştirmek: yeniden üretimde kaybolur.
- Hata ayıklamayı -O2 ile yapmak: değişkenler "optimized out" görünür; hata ayıklarken -Og kullan.
- SWD pinlerini (PA13, PA14) GPIO olarak kullanmak: kart bir daha yüklenemez gibi görünür; reset tuşlu bağlanmayla kurtarılır.
- Yığın boyutunu varsayılanda bırakıp büyük yerel diziler kullanmak.
Yazılım mühendisliği bağlantısı
Derlemeyi tekrarlanabilir yap: aynı kaynak, aynı araç sürümü, aynı ikili.
- platformio.ini ya da CMake dosyası depoda; araç sürümü sabit.
- CI her işlemede derler, size çıktısını kaydeder ve Flash/RAM bütçesi aşılırsa uyarır.
- Donanımsız mantık için
pio test -e native: testler bilgisayarda koşar.
Kendini sına
Bağlayıcı betiğinin (.ld) görevi nedir?
Başlangıç değerli küresel değişkenler (.data) nerede yer kaplar?
CubeMX projesinde kendi kodun nereye yazılmalı?
ST-LINK kartla hangi hat üzerinden konuşur?
Bu üniteden sonra bitirme projesinde
- Öneri ve araç zinciri: Gereksinimler (G1–G7), protokol tablosu taslağı; boş projenin CI'da derlenmesi ve size çıktısı.