Dato che il mio compilatore non supporta ancora C++ 11 e std :: atomic, sono costretto a implementarlo manualmente tramite la coppia ldrex-strex.Atomic int64_t su ARM Cortex M3
La mia domanda è: qual è il modo corretto di "atomicamente" leggere-modificare-scrivere int64_t con ldrex e strex?
soluzione semplice come questo non sembra funzionare (uno dei STREXW restituisce 1 per tutto il tempo):
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));
non ho trovato nulla circa parecchi LDREX sequenziale o istruzioni STREX indicando varie strade il manuale ma mi è sembrato che fosse permesso.
In caso contrario più thread non sarebbero in grado di modificare due diverse variabili atomiche in alcuni scenari.
è GCC? considerare gli atomici integrati GCC? – user3528438
GCC per ARM ora ha il supporto per std :: atomic. No, non è GCC, è Keil armcc. – Amomum
Vedere: [ARM AN321 - Barriere di memoria Cortex-M] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHEADII.html). Atomic è una parola un po 'sovraccaricata. Le cose non possono accadere atomicamente nell'universo. Sono atomici contro qualche set di componenti elettronici; linea principale/interrupt, SMP, dispositivo su un bus, ecc. Qual è esattamente il tuo problema? Devi descriverlo meglio. –