поддержка GCC atomic builtins в МК

    • #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:25
      Eddy_Em писал(а):
      Простые операции над 32-битными числами и так будут атомарными

      Инкремент – это простая операция?

      Eddy_Em

      13 дек 2021, 14:30
      Нет, конечно.
      Если хочется гарантированно волатильную переменную инкрементировать, чтобы в прерываниях с ней в это время ничего не сделалось, то нужно в цикл с LDREX/STREX запихнуть. Или прерывания временно отключать вокруг критических зон.
      За RTOS не скажу: я – противник RTOS на МК.

      Reflector

      13 дек 2021, 14:37
      Eddy_Em писал(а):
      Если хочется гарантированно волатильную переменную инкрементировать, чтобы в прерываниях с ней в это время ничего не сделалось, то нужно в цикл с LDREX/STREX запихнуть.

      Компилятор и сам умеет это делать, для ARMv7-M будут LDREX/STREX, для ARMv8-M – LDAEX/STLEX, а для M0 он вызов функции подставляет. TC мог потратить 5 мин своего времени и убедиться в этом сам.

Viewing 0 reply threads
  • Вы должны войти в систему, чтобы ответить в этой теме.
Интepecнoe нa фopумe:
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля
×