В стандарте C нет правила, требующего от компилятора реализовать эти функции по-разному. например При работе с регистрами компилятор может или не может «оптимизировать» присвоение от ga
до a
(т. Е. «Оптимизировать», я имею в виду: загрузите ga
в REG, затем используйте тот же REG для выполнения остальных вычислений , используя его как a
). Или это может не так.
Если вы хотите реализовать блокировки свободной структуры данных:
- C99 не предлагает ничего, что может помочь вам.
- C11 (очень современный стандарт) предлагает вам атомные типы данных.
Если вы используете C99, то вам необходимо либо:
- Используйте замки (и, следовательно, не безблокировочного код)
- Будьте готовы к написанию архитектуры определенный код. Самое меньшее, что вам нужно сделать, это использовать минимальный набор атомных операций, как это сделано в this library, который реализует блокирующие данные структуры данных с использованием атомных операций, предоставляемых x86, x86_64 и ARM ISAs.
В более ранней версии этого ответа, я коснулся стороны вопрос в (который имеет отношение к volatile
, и которая на самом деле не имеет отношения к вашему реальному вопроса):
Eсти один случай, который может поставить ограничение на то, как реализовано func_b
, но я фактически ухожу по касательной здесь: Если ga
объявлен как volatile
.
Если ga
летуч, то каждый читал на ga
должны нагрузки ga
из памяти заново. то есть в func_b
, ga
будет загружаться из памяти два раза. Один раз для сравнения, и один раз, чтобы вычислить возвращаемое значение. Ожидаемое использование, например, означает, что ga
относится к порту ввода/вывода с отображением памяти. Затем, если значение ga
изменяется между двумя считанными, это отразится на возвращаемом значении. Однако, если вы измените ga
в другом потоке, не ожидайте нормального/определенного поведения.
С другой стороны, не имеющий volatile
классификатор не означает, что ga
будет читаться только один раз в func_b
. И нет никакого классификатора, который является «противоположностью летучих».
ли RTOS упреждающий? – RedX
Хех! Хорошая точка, но давайте предположим, что это так. –
Да, предположим, что это упреждающее, а также ISR может изменить «ga». – user184258