Yeni yazı: volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri#100
Open
Mavrikant wants to merge 3 commits into
Open
Yeni yazı: volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri#100Mavrikant wants to merge 3 commits into
volatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri#100Mavrikant wants to merge 3 commits into
Conversation
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>
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>
volatile Yetmediğinde — C11 _Atomic ve Bellek Bariyerlerivolatile Yetmediğinde — Zynq-7000 Üzerinde C11 _Atomic, SCU ve Bellek Bariyerleri
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>
This was referenced May 30, 2026
This was referenced Jun 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Konu
volatileYetmediğ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 "volatileISR 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?
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.Derinlik öğesi (Bölüm 7)
Assembly inspection + sistem mimarisi haritası.
arm-none-eabi-gcc -O2 -mcpu=cortex-a9 -marmile aynı RMW operasyonunun üç versiyonu derleniyor:volatile uint32_t v_counter; v_counter++;→ 3 ardışıkLDR/ADD/STR(yarış koşuluna açık, bariyer yok).atomic_fetch_add_explicit(&a_counter, 1, memory_order_relaxed);→LDREX/STREXdö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ınaDMB ISHekleniyor (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?"
Kullanılan başlıca kaynaklar
<stdatomic.h>Öz-eleştiri özeti
memory_order_seq_cst (5)numarası GCC enum değerine bağlı; pedagojik olarak bırakıldı.Yayın akış kontrolü
post/2026-05-29-volatile-yetmediginde-c11-atomic_posts/2026-05-29-volatile-yetmediginde-c11-atomic.mdmermaid: truedahil)master'a doğrudan push yok🤖 Generated with Claude Code