Derleyicim hala C++ 11 ve std :: atomic'i desteklemediğinden, ldrex-strex çifti aracılığıyla manuel olarak uygulamak zorunda kaldım.ARM Cortex M3 üzerinde atomik int64_t
Soruma şudur: ldrex ve strex ile int64_t 'atomik olarak okuma-değiştir-yazmanın doğru yolu nedir?
böyleBasit çözüm işe görünmüyor (STREXW biri 1'e her zaman döndürür):
volatile int64_t value;
int64_t temp;
do
{
int32_t low = __LDREXW((uint32_t *)&value);
int32_t high = __LDREXW(((uint32_t *)&value)+1);
temp = (int64_t)low | ((int64_t)high<<32);
temp++;
} while(__STREXW(temp, (uint32_t *)&value) | __STREXW(temp>>32, ((uint32_t *)&value)+1));
Ben farklı adreslerde işaret birkaç sıralı LDREX veya STREX talimatlar hakkında bir şey bulamadık
Kılavuz ama bana izin verilmesi gerektiğini bana görünüyordu. Aksi takdirde, birden fazla iş parçacığı, bazı senaryolarda iki farklı atom değişkenini değiştiremezdi.
Bu GCC nedir? GCC dahili atomlarını düşünün? ARM için – user3528438
GCC şimdi std :: atomic için destek var. Hayır, GCC değil, Keil armcc. – Amomum
Bakın: [ARM AN321 - Cortex-M bellek engelleri] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHEADII.html). Atomik aşırı yüklü bir kelimedir. Evrendeki şeyler atomik olarak gerçekleşemez. Bir takım elektronikler karşısında atomiktirler; Ana hat/kesintiler, SMP, otobüste cihaz vb. Probleminiz tam olarak nedir? Daha iyi tarif etmelisin. –