Для доступа к ним из процедур расчета и захотелось добавить ATOMIC_BLOCK.
Был огорчён, что такой простой вещи после AVR не нашёл.
До сих пор с STM32 дел никаких не имел.
Код: Выделить всё
_Regs()->ODR ^= value;Код: Выделить всё
void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }Код: Выделить всё
void ClearAndSet()
{
Clear<clearMask>(); // _Regs()->BSRR = clearMask << 16;
Set<setMask>(); // _Regs()->BSRR = setMask;
}Код: Выделить всё
void toggle() { _Regs()->BSRR = pinsMask << 16 | ~_Regs()->ODR & pinsMask; }Стандартно. Если есть ОС, то через критические секции. Или просто запрещать прерывания в начале изменений и разрешать после внесения изменений. Кстати, это общий подход к работе с регистрами в многозадачной ОС.azhel12 писал(а):В условиях, что на STM такого нет и это данность, как лучше всего это реализовать, если в одну операцию в принципе невозможно?
Код: Выделить всё
void write(uint16_t data)
{
base()->BSRR = pinsMask << 16 | (data & pinsMask);
}Код: Выделить всё
void write(uint32_t value) { sio_hw->gpio_togl = (sio_hw->gpio_out ^ value) & pinsMask; }Для пинов- возможно, да. Но GPIO такая же периферия, как и любая другая, к которой могут быть обращения и разных потоков. И и подход к разделению доступа должен быть, и быть единым в рамках ОС или используемой среды программирования.Reflector писал(а):Это нужно если тоглить в разных потоках одинаковые пины, что само по себе практически никогда не нужно.