Okullar için Robotik ve Mühendislik · anaokulundan liseye

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?

Flash.text: 9000 B.rodata: 800 B.data: 200 B9,8 / 64 KBRAM.data: 200 B.bss: 1200 B.stack: 1024 B.heap: 512 B2,9 / 20 KB
.text.rodata.data.bss.stack.heap
$ arm-none-eabi-size firmware.elf text data bss 9800 200 1200 Flash 15,3% · RAM 14,3% · sığıyor

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

PlatformIO: platformio.ini ve derleme komutları
; 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 bilgisayarda

Sı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

  1. Bağlayıcı betiğinin (.ld) görevi nedir?

  2. Başlangıç değerli küresel değişkenler (.data) nerede yer kaplar?

  3. CubeMX projesinde kendi kodun nereye yazılmalı?

  4. 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ı.

Gerçek parçalar (Hyvex, 3B modelli)

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç