Вопрос знатокам ассемблера (я в нем вообще дуб): правильно ли я написал функцию mutex_trylock?
Код:
|
typedef uint32_t mutex_t;
...
mutex_t mutex_trylock(mutex_t *m){
uint32_t status = 0;
mutex_t old_lock = __ldrex(m); // get mutex value
// set mutex
status = __strex(MUTEX_LOCKED, m);
if(status == 0) __dmb();
else old_lock = MUTEX_LOCKED;
return old_lock;
} |
За образец взял mutex_lock, но так и не разобрался: безопасно ли вот так писать, как я сделал?
Что делает инструкция DMB? Ждет или просто "подчищает хвосты"?
Можно ли вот так писать? Если LDREX возвращает значение MUTEX_LOCKED, я все равно вызываю STREX, чтобы сбросить состояние индивидуального доступа (чтобы последующий вызов mutex_trylock не вернулся с ошибкой, если даже мьютекс будет разблокирован).