Показать сообщение отдельно
Непрочитано 24.10.2014, 08:43   #4136
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Вопрос знатокам ассемблера (я в нем вообще дуб): правильно ли я написал функцию 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 не вернулся с ошибкой, если даже мьютекс будет разблокирован).
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума   Ответить с цитированием