по мне. Как сделать там синхронизацию без такого говнокода? Систему считаем одноядерной, бареметал. Буду рад конструктивным предложениям с хорошей производительностью, т.к. volatile часть их теряет
@vpclmulqdq, у тебя есть конкретные предложения по этому вопросу? Цель - избежать volatile для переменной, которую устанавливают в прерывании.
зачем его избегать? атомик через ex монитор будет дороже
у нас нет pthread. Вообще. Никакой. Нету ОС ведь
в АРМе атомики работают через эксклюзивный монитор, ему ОСь и потоки не нужны. Он же часть ядра.
для lockless атомиков никакие треды не нужны. это просто класс, для которого компилятор (тем или иным способом) умеет испускать правильные инструкции и ограничивать оптимизации до валидных с учётом ордеринга
Как я понимаю, для этого нужен хотя бы Cortex M4. А как жить на M0/M0 Plus?
Подумаю, почитаю, спасибо. В newlib такие с коробки, надеюсь
монитор есть начиная с ARMv7-M, на М0 вроде это уже ARMv6-M там монитора нет, там уже считают пузатой мелочью, там вам должно хватать on/off_irq
irq on/off - это наша критическая секция (быстрая и прекрасно работающая). Для поллинга флага предлагаешь постоянно делать on-off для прерываний?
я вам говорил, как заменить монитор на М0, причем тут полинг. Если просто полинг то волотайл, если нужна атомарность, юзай монитор, нет монитора юзай on/off_irq
В гцц есть встроенные атомики (__atomic_xxx функции). Все что следует знать. volatile нельзя толком использовать даже на одноядерной машине, т.к. саму запись в volatile-переменную компилятор может выполнить не в той же строчке, а когда-нибудь потом. Если его не принудить конечно через asm("" ::: "memory"). Когда-нибудь потом -- это в конце функции запросто. Если в функции записывается volatile, потом какой-то вечный цикл, а потом выход, то запись volatile может запросто съехать после цикла. Что следует понимать.
Ввести компиляторный барьер руками через clobbers в asm-вставке. Не обязательно "memory", clobber-ить можно только одну единственную переменную (так код будет эффективней). Это нужно сделать при записи. И при чтении. Проще использовать __atomic_xxx функции. Там всё само.
Есть ещё алгоритмы Деккера, Петерсона и Лэмпорта. Но им volatile тоже нужен.
https://en.cppreference.com/w/c/atomic Есть в C11, Но если у тебя ничего нет то юзай volatile
Почему-то мой мозг все ещё живёт в с99. Спасибо, буду пробовать переводить проект на них. Главное, чтобы компилятор был с атомиками. А то он может определить, что их нет, и я снова отправлюсь в далёкое путешествие по просторам volatile
давно все есть атомики для АРМа появились в гцц с 4.9.2 версии
Давно пора переходить на C23, где специально для ембеддеров ввели директиву #embed.
Ещё бы все вендоры свои компиляторы пообновляли - цены бы им не было
Это была шутка, embed это директива чтобы встраивать данные, как include, но для бинарей
Ну АРМ собрал последний на сколько помню gcc 12.3 достаточно свежий.
Но мы ни одним армом едины(
ну началось... ладно я тогда ливаю, с вашими PIC avr и иже с ними
Вот да. Даже с теми же армами иногда нужен компилятор именно от вендора, т.к. есть необходимость интеграции с какими-то программными компонентами того же вендора
Да в общем-то и неплохо
Обсуждают сегодня