Прежде всего, я бы приветствовал изменения в названии этого вопроса, я не мог придумать, как его лучше сформулировать, но я не очень доволен тем, что я придумал.
Этовопрос о параллелизме, мое приложение на микроконтроллере в C, но я не думаю, что это имеет большое значение.
У меня есть подпрограмма прерывания, которая может изменить значения двух глобальных переменных.У меня есть основной код, который может читать эти переменные.Но он должен получать согласованные значения от обоих, что означает, что я не могу прочитать одно, а затем прочитать другое, потому что между ними может произойти прерывание и изменить их обоих, в результате чего я прочитал одно из одного набора и одно из другого.
Обычно я бы просто отключил прерывание для крошечной части кода, которая читает обе переменные, но я не могу этого сделать, потому что прерывание нужно вызывать точно в нужное время без «дрожания» в вызовах.4 или 5 инструкций для чтения и хранения переменных приведут к слишком сильному дрожанию во времени прерывания.(Я генерирую видео PAL в прерывании, поэтому любое дрожание во времени приведет к видимому движению пикселей на экране).
Я мог бы изменить код, чтобы сделать это по-другому, чтобы одно и то же прерывание не отвечало за эти две вещи, и в долгосрочной перспективе я, вероятно, сделаю это, но это значительная работа.В любом случае, теперь этот вопрос стал для меня интересным как «загадка», даже если я позже перекодирую его, чтобы избежать ситуации.
Итак, я спрашиваю, есть ли способ, которым яможет прочитать обе переменные и убедиться, что они находятся в согласованном состоянии, не отключая прерывания?
Не имеет значения, получаю ли я значение до или после прерывания, пока оба значения приходятиз того же места.
Я думал о том, чтобы иметь отдельный счетчик «номера версии» для чтения, чтобы гарантировать, что каждая переменная - это та же самая версия, которая читается, но это только усугубляет проблему, как сейчас у меня4 переменные для чтения.