C32: атомарные операции с помощью extended inline assembler. Пытаюсь понять, как написать атомарный код, например, для инверсии бита в любой переменной.
Начал с этого:
static volatile int a = 0;
//-- a ^= 1;
__asm__ __volatile__( "xori %0, %0, 1"
: "=r"(a)
: "r"(a)
);
Получилось неатормарно:
static volatile int a = 0;
__asm__ __volatile__( "ll $t1, 0(%0)": : "r"(a) );
__asm__ __volatile__( "xori $t1, $t1, 1" );
__asm__ __volatile__( "sc $t1, 0(%0)": : "r"(a) );
Но это явно неправильно, результат отличается от желаемого:
9D0014E8 8F828018 LW V0, -32744(GP) 9D0014EC 38420001 XORI V0, V0, 1 9D0014F0 AF828018 SW V0, -32744(GP)Читаю в доках, что для обеспечения атомарной последовательности Read-Modify-Write служат инструкции LL, SC. Пытаюсь написать так:
140: __asm__ __volatile__( "ll $t1, 0(%0)": : "r"(a) ); 9D001454 8F828018 LW V0, -32744(GP) # WRONG! | I need for LL T1, -32744(GP) instead of 9D001458 C0490000 LL T1, 0(V0) # WRONG! | these two LW, LL instructions 141: __asm__ __volatile__( "xori $t1, $t1, 1" ); 9D00145C 39290001 XORI T1, T1, 1 142: __asm__ __volatile__( "sc $t1, 0(%0)": : "r"(a) ); 9D001460 8F828018 LW V0, -32744(GP) # WRONG! | I need for SC T1, -32744(GP) instead of 9D001464 E0490000 SC T1, 0(V0) # WRONG! | these two LW, SC instructionsКак правильно это написать?
-
- Нашел ошибку, правильно так: dimonomid(1158 знак., 05.07.2013 16:34 - 16:51)