Сравните и обмен / обмен на dsPIC33F с инструкцией CPSNE - PullRequest
2 голосов
/ 03 апреля 2020

Есть ли лучший способ реализовать блокированный вариант «сравни и обмен» на 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. "

...