Skip to content

Yeni yazı: volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri#100

Open
Mavrikant wants to merge 3 commits into
masterfrom
post/2026-05-29-volatile-yetmediginde-c11-atomic
Open

Yeni yazı: volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri#100
Mavrikant wants to merge 3 commits into
masterfrom
post/2026-05-29-volatile-yetmediginde-c11-atomic

Conversation

@Mavrikant

@Mavrikant Mavrikant commented May 29, 2026

Copy link
Copy Markdown
Owner

Konu

volatile Yetmediğinde: Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri — gömülü C dünyasında en sık tekrarlanan yanılgılardan biri olan "volatile ISR ile main loop arasında veri paylaşımı için yeterlidir" iddiasını Zynq-7000 (dual Cortex-A9 SMP, SCU, ACP, PL DMA) bağlamında çürüten teknik yazı.

Neden bu konu seçildi?

  • Türkçe boşluk: Konu C dünyasında çok tartışılmıştır (Linus Torvalds, SEI CERT, LWN, Embedded.com), ama Zynq-7000'in PS-PL ve SCU/ACP davranışıyla birleştiren derin Türkçe içerik neredeyse yok. Mevcut Türkçe içerik ya çeviri özetlerden ibaret ya da tek-CPU senaryosuyla sınırlı.
  • Saha gerçeği: Aviyonik / emniyet kritik dünyada Zynq-7000 yaygın bir SoC; ekipler volatile-ile-paylaşım hatasını DMB serpiştirerek "çözmeye" çalışır, ama gerçek sebep MMU sayfa attribute hatası, ACP yerine HP/GP port seçimi, veya SCU snoop'un kapsam dışında kalan bir sayfa olabiliyor.
  • Standart yorumu: ISO/IEC 9899:2011 §6.7.3'ün "volatile semantiği" ile §7.17'nin "atomik semantiği" arasındaki fark dışarıdan açık değildir; bu yazı iki maddeyi yan yana koyup ARMv7-A bellek modeliyle eşler.
  • Mevcut ekosistemle çakışmıyor: Açık PR'lardaki MC/DC, CRC, VOR, watchdog, linker script, WCET, FTA, bellek güvenliği konularıyla örtüşmüyor. Son üç yayın (sistem, RF/DSP, gömülü/SoC) farklı alanlarda.
  • Doğal devam: Daha önce yayımlanan Renode ile Zynq7000 Simülasyonu yazısının yazılım eşzamanlılığı yanını tamamlıyor.

Derinlik öğesi (Bölüm 7)

Assembly inspection + sistem mimarisi haritası. arm-none-eabi-gcc -O2 -mcpu=cortex-a9 -marm ile aynı RMW operasyonunun üç versiyonu derleniyor:

  • volatile uint32_t v_counter; v_counter++; → 3 ardışık LDR/ADD/STR (yarış koşuluna açık, bariyer yok).
  • atomic_fetch_add_explicit(&a_counter, 1, memory_order_relaxed);LDREX/STREX döngüsü (ARMv7-A exclusive monitor + SCU snoop ile yarış-güvenli).
  • atomic_fetch_add_explicit(&a_counter, 1, memory_order_seq_cst); → RMW döngüsünün önüne ve arkasına DMB ISH ekleniyor (SCU coherency garanti).

Ayrıca Zynq-7000'in üç koherans bölgesi (SCU snoop, ACP koherent, HP/GP non-koherent) bir Mermaid blok şemasıyla gösteriliyor; her birinin volatile / _Atomic / cache maintenance sorumluluğu net bir tabloyla ortaya konuyor.

"Bu konuyu bulmak neden zor?"

  • İngilizcede temel kaynaklar dağınık (kernel docs, CERT, LWN, ARM ARM, ISO standardı, Xilinx UG585, AMD Wiki).
  • Türkçe içerik genellikle "volatile demek bellek değişebilir demektir" seviyesinde kalıyor; atomicity vs ordering ayrımı işlenmiyor.
  • Zynq özelinde SCU'nun shareability domain ile çalıştığı, yanlış MMU attribute'unun LDREX/STREX'i sessizce bozduğu bilgisi nadiren tek bir yerde yazıyor.
  • ACP'nin "cache flush'tan kurtaran yol" olduğu performans argümanı genelde Xilinx blog yazılarında dağınık; mühendislik kararı bağlamı yok.

Kullanılan başlıca kaynaklar

Öz-eleştiri özeti

  • ✅ Tek-core M4 senaryosundan SMP Cortex-A9'a geçişle birlikte DMB'nin "gereksiz"den "şart"a döndüğü vurgulandı.
  • ✅ SCU snoop'un sayfa attribute (Inner Shareable + Cacheable) gerektirdiği, BSP'nin Xil_SetTlbAttributes ile bu garantiyi nasıl bozabileceği eklendi.
  • ✅ ACP vs HP/GP ayrımı blok şema + tablo ile netleştirildi; pratik mühendislik kararına dönüştürüldü.
  • ✅ Linus Torvalds doğrudan alıntısı kernel dokümanından paraphrased özete dönüştürüldü.
  • ⚠ Kelime sayısı 3,805 (hedef bantın biraz üstünde) — Zynq spesifik kazanım için kabul edildi.
  • memory_order_seq_cst (5) numarası GCC enum değerine bağlı; pedagojik olarak bırakıldı.

Yayın akış kontrolü

  • Dal: post/2026-05-29-volatile-yetmediginde-c11-atomic
  • Dosya: _posts/2026-05-29-volatile-yetmediginde-c11-atomic.md
  • Front matter mevcut yazıların şemasıyla aynı (mermaid: true dahil)
  • Kelime sayısı: ~3,800
  • master'a doğrudan push yok
  • Gizlilik kontrolü: yalnızca kamuya açık standart, kernel docs, ARM ARM, Xilinx UG585, AMD Wiki kaynaklı; proje-spesifik veya ihracat-kontrollü içerik yok

🤖 Generated with Claude Code

ISR ile main loop arasında `volatile` ile veri paylaşımının neden eşzamanlılık
garantisi vermediğini, C11'in `<stdatomic.h>` aracını ve ARM Cortex-M ailesindeki
LDREX/STREX + DMB/DSB/ISB altyapısını ele alan teknik yazı.

Derinlik öğesi: Cortex-M4 üzerinde aynı `counter++` operasyonunun `volatile uint32_t`
ve `atomic_uint` versiyonlarının ürettiği assembly kodun karşılaştırması; ARMv6-M
(Cortex-M0/M0+) ve ARMv8-M Baseline (M23) üzerinde `_Atomic`'in libatomic'e nasıl
düştüğü ve bunun kesme gecikmesine etkisi.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 29, 2026 05:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Yazıyı tek-çekirdek Cortex-M senaryosundan Zynq-7000 PS (dual Cortex-A9 SMP)
ve PS-PL etkileşimine taşıdım. Ana değişiklikler:

- Başlık ve giriş: Zynq-7000 / SCU / ACP odaklı.
- Failure örneği: TTC0 ISR (CPU0) + main loop (CPU1) — gerçek SMP yarışı.
- Assembly: -mcpu=cortex-m4 yerine -mcpu=cortex-a9 -marm; relaxed örneğine
  ek olarak seq_cst varyantında 'dmb ish' bariyerinin nereye konduğu gösterildi.
- SCU davranışı: LDREX/STREX'in iki çekirdek arasında çalışması için sayfanın
  Inner Shareable + Cacheable işaretli olması gerektiği vurgulandı.
- Shareability domain tablosu (SY/ISH/OSH/NSH) eklendi; Zynq karşılıkları
  açıklandı.
- "Üç koherans bölgesi" yeni bölümü: SCU snoop, ACP coherent yolu, HP/GP
  non-coherent yolu — Mermaid blok şemasıyla.
- Karar matrisi ve karar akışı Zynq-7000 senaryoları için yeniden yazıldı:
  PS register, PS RAM SMP paylaşımı, ACP-üzeri DMA, HP/GP-üzeri DMA.
- Sık hatalar listesi 6'ya çıkarıldı: DMA tamponuna volatile koymak ve MMU
  attribute hatası (SCU snoop'un dışına düşmek) eklendi.
- Renode ile Zynq7000 Simülasyonu yazısına gönderme eklendi.
- Kaynaklar: ARMv7-A ARM, Cortex-A9 MPCore TRM, Xilinx UG585, AMD Xilinx Wiki
  ACP makaleleri eklendi; Cortex-M referansları çıkarıldı.

Kelime sayısı: 2,719 → 3,805 (hâlâ 1,500-3,500 hedef bandının biraz üstünde
ama içerik yoğunluğu Zynq-spesifik kazanım sağlıyor).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@Mavrikant Mavrikant changed the title Yeni yazı: volatile Yetmediğinde — C11 _Atomic ve Bellek Bariyerleri Yeni yazı: volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri May 29, 2026
8 sorun bulundu ve düzeltildi:

1. Assembly bölümünde çelişkili paragraf: "relaxed seçilmesine rağmen
   varsayılan inner-shareable koruma serpiştirilir" cümlesi mantıksal
   olarak tutarsızdı (relaxed → bariyer yok). Cümle yeniden yazıldı.

2. Yapı/akış sorunu: "Karar Matrisi" HP/GP/ACP'den bahsediyordu ama
   bu kavramları açıklayan "Üç Koherans Bölgesi" sonra geliyordu.
   İki bölüm yer değiştirdi; matris artık koherans bölgeleri tanıtıldıktan
   sonra geliyor.

3. ACP cacheline boyutu: 64 byte yanlıştı. Cortex-A9 L1 ve Zynq-7000
   PL310 L2 cacheline boyutu 32 byte. Düzeltildi (matriste, açıklamada
   ve karar akışında).

4. Mermaid karar akışında typo: "PS RAM PS RAM iki CPU paylaşıyor"
   → "PS RAM, iki CPU paylaşıyor".

5. Yanlış BSP dosya referansı: "Xilinx'in xil_mmu BSP'si" → "Xilinx
   standalone BSP'nin translation_table.S dosyası" (gerçek dosya adı).

6. Yanlış bağlam: "Linux'ta Xil_DCacheFlushRange()" → "Bare-metal
   BSP'de" (bu fonksiyon Linux'ta değil, Xilinx standalone BSP'de).

7. AxCACHE/AxPROT ifadesi netleştirildi: ikisini de "0b1111" gibi
   gösteren muğlak ifade ayrıştırıldı (AxCACHE=0b1111, AxPROT=0b010).

8. Mermaid edge label'ları tırnak içine alındı; özel karakter güvenliği
   ve okunabilirlik için.

Ek olarak: opening örneğinde "AMP modunu varsayalım" notu eklendi —
iki çekirdeğin paylaşılan OCM senaryosunu netleştirmek için.

Kelime sayısı: 3805 → 3843.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants