Есть ли лучший способ реализовать блокированный вариант «сравни и обмен» на dsPIC33F?
unsigned int InterlockedCompareExchange(volatile unsigned int* Destination, unsigned int Exchange, unsigned int Compare) {
register unsigned int Old;
__asm volatile (
"DISI #3\n"
"MOV [%[DEST]], %[OLD]\n"
"CPSNE %[COMPARE], %[OLD]\n" // required 1 cycle if not skipped, 2 otherwise
"MOV %[EXCHANGE], [%[DEST]]\n" // is discarded if Compare NEQ [Destination]
: [OLD] "=&a" (Old), [DEST] "+r" (Destination)
: [EXCHANGE] "r" (Exchange), [COMPARE] "r" (Compare)
);
return Old;
}
Есть ли вариант, чтобы вообще не использовать DISI, поскольку «[...] эта инструкция не препятствует запуску прерываний и прерываний приоритета 7. "