Некоторые для информации после некоторого поиска:
»
ARM Cortex-M3 битовая полоса
Ядро микроконтроллера ARM предлагает еще один способ реализации семафоров. Доступ на запись к переменным в области псевдонимов в битовой полосе вызывает атомарный доступ для чтения, изменения и записи к области памяти в области битовой полосы на уровне системной шины.
Как это перевести в семафоры? Переменная в области битовой полосы может служить контейнером для семафоров. Каждый клиент немного владеет этим контейнером. Всякий раз, когда клиенту требуется запросить семафор, он устанавливает свой собственный бит, записывая 1 в соответствующее местоположение в области псевдонимов битовой полосы. Затем он считывает контейнер (область битовой полосы) и проверяет, что другие биты не установлены, что означает, что клиент успешно запросил семафор. В случае, если установлены другие биты, клиент должен будет снова очистить свой собственный бит и повторить попытку (возможно, после ожидания).
"
( источник )
Вот мое грубое (непроверенное) толкование:
/*
* Frees a lock.
*
* @note lock must point to a fully aligned 32 bit integer.
* (atomically set to 0)
*
* @returns 1 if successfull
*/
int rwl_FreeLock(volatile uint32_t *lock){
*lock = 0;
return 1; // always successful
}
/*
* Attempts to acquire a lock
* @param who is the client taking the lock
* @lock pointer to the mutex (uint32_t value in memory)
* @note lock must point to a fully aligned 32 bit integer.
* (atomically set to 1 only if set to 0)
*/
int rwl_TryLock(volatile uint32_t *lock, int who){
// initial check of lock
if(*lock == 0){
Var_SetBit_BB((uint32_t)lock, who);
if(*lock == (1<<who)){ // check that we still have exclusive access
// got the lock!
return 1;
} else {
// do not have the lock
Var_ResetBit_BB((uint32_t)lock, who); // clear the lock flag
return 0;
}
}
}
Var_Set_BB / Var_Reset_BB: установить / очистить бит, используя битовую полосу. (Атомный)
Однако, это не работает !!!