поддержка GCC atomic builtins в МК
-
-
13.12.2021 #76543
Николай
Ключникsdv_cyborg 13 дек 2021, 12:07В процессе работы над несколькими проектами родилась микроскопическая реализация контейнера данных, пригодного для системы Subscriber/Publisher в реальном времени, если конкретно – то на основе алгоритма MVCC. В качестве бреда хотелось бы потестировать теперь ее на МК, ну банально на Cortex’ах, какие под руку попадутся – от M0 до M7 – ну, может, еще на ESP32 и RISC-V. И оценить, насколько хорошо оно подходит для синхронизации нескольких контекстов исполнения (ОС, прерываний и т.д.). Но загвоздка в том, что она целиком и полностью зависит на данный момент от atomic builtins в gcc (atomic_exchange, atomic_fetch_add, atomic_store, atomic_load) – которые как бы ориентированы в первую очередь на x86, как я понимаю. Отсюда и вопрос: поддерживаются ли atomic builtins в GCC для ARM, и прочих архитектур МК. И в каком объеме. Кто, может, знает?
Или сразу лучше не выдумывать и делать обертки с реализациями под каждую архитектуру?Eddy_Em 13 дек 2021, 14:01Простые операции над 32-битными числами и так будут атомарными, а для сложных придется заводить всякие LDREX’ы, какие-нибудь мьютексы и т.п.
Кстати, беглый поиск в интернете никаких gcc’шных атомарных инструкций для младших армов не нашел.Reflector 13 дек 2021, 14:25Eddy_Em писал(а):Простые операции над 32-битными числами и так будут атомарнымиИнкремент – это простая операция?
Eddy_Em 13 дек 2021, 14:30Нет, конечно.
Если хочется гарантированно волатильную переменную инкрементировать, чтобы в прерываниях с ней в это время ничего не сделалось, то нужно в цикл с LDREX/STREX запихнуть. Или прерывания временно отключать вокруг критических зон.
За RTOS не скажу: я – противник RTOS на МК.Reflector 13 дек 2021, 14:37Eddy_Em писал(а):Если хочется гарантированно волатильную переменную инкрементировать, чтобы в прерываниях с ней в это время ничего не сделалось, то нужно в цикл с LDREX/STREX запихнуть.Компилятор и сам умеет это делать, для ARMv7-M будут LDREX/STREX, для ARMv8-M – LDAEX/STLEX, а для M0 он вызов функции подставляет. TC мог потратить 5 мин своего времени и убедиться в этом сам.
-
Viewing 0 reply threads
- Вы должны войти в систему, чтобы ответить в этой теме.