Поскольку мой компилятор все еще не поддерживает C++ 11 и std :: atomic, я вынужден реализовать его вручную через пару ldrex-strex.Atomic int64_t на ARM Cortex M3
Мой вопрос: какой правильный способ «атомарно» читать-модифицировать-писать int64_t с помощью ldrex и strex?
Простое решение, как это не похоже на работу (один из STREXW возвращает 1 все время):
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));
Я не мог найти ничего о нескольких последовательных LDREX или инструкции STREX указывая на различные адреса в но мне показалось, что это должно быть разрешено.
В противном случае несколько потоков не смогут изменять две разные атомные переменные в некоторых сценариях.
Это GCC? рассмотрите встроенную атомию GCC? – user3528438
GCC для ARM теперь поддерживает std :: atomic. Нет, это не GCC, это Keil armcc. – Amomum
См. [ARM AN321 - Cortex-M барьеры памяти] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHEADII.html). Atomic - это немного перегруженное слово. Вещи не могут произойти атомарно во вселенной. Они являются атомными по сравнению с некоторыми наборами электроники; mainline/interrupts, SMP, устройство на автобусе и т. д. В чем же ваша проблема? Вы должны это описать лучше. –