Безопасный доступ к двум переменным, когда между ними может возникнуть прерывание - PullRequest
1 голос
/ 21 июля 2010

Прежде всего, я бы приветствовал изменения в названии этого вопроса, я не мог придумать, как его лучше сформулировать, но я не очень доволен тем, что я придумал.

Этовопрос о параллелизме, мое приложение на микроконтроллере в C, но я не думаю, что это имеет большое значение.

У меня есть подпрограмма прерывания, которая может изменить значения двух глобальных переменных.У меня есть основной код, который может читать эти переменные.Но он должен получать согласованные значения от обоих, что означает, что я не могу прочитать одно, а затем прочитать другое, потому что между ними может произойти прерывание и изменить их обоих, в результате чего я прочитал одно из одного набора и одно из другого.

Обычно я бы просто отключил прерывание для крошечной части кода, которая читает обе переменные, но я не могу этого сделать, потому что прерывание нужно вызывать точно в нужное время без «дрожания» в вызовах.4 или 5 инструкций для чтения и хранения переменных приведут к слишком сильному дрожанию во времени прерывания.(Я генерирую видео PAL в прерывании, поэтому любое дрожание во времени приведет к видимому движению пикселей на экране).

Я мог бы изменить код, чтобы сделать это по-другому, чтобы одно и то же прерывание не отвечало за эти две вещи, и в долгосрочной перспективе я, вероятно, сделаю это, но это значительная работа.В любом случае, теперь этот вопрос стал для меня интересным как «загадка», даже если я позже перекодирую его, чтобы избежать ситуации.

Итак, я спрашиваю, есть ли способ, которым яможет прочитать обе переменные и убедиться, что они находятся в согласованном состоянии, не отключая прерывания?

Не имеет значения, получаю ли я значение до или после прерывания, пока оба значения приходятиз того же места.

Я думал о том, чтобы иметь отдельный счетчик «номера версии» для чтения, чтобы гарантировать, что каждая переменная - это та же самая версия, которая читается, но это только усугубляет проблему, как сейчас у меня4 переменные для чтения.

1 Ответ

3 голосов
/ 21 июля 2010

Какой микроконтроллер вы используете.О каких переменных мы говорим?Если вам нужно менее 4 байтов и использовать 32-битный MCU, вы можете решить эту проблему, поместив две переменные в одну 32-битную переменную.

РЕДАКТИРОВАТЬ:

Если вы используете 8-битный MCU, я думаю, что лучший способ сделать это - поместить переменные в структуру, создать массив этих структур (2 элемента) иодна переменная, которая указывает, какая структура в настоящее время используется для чтения.Затем ваше прерывание меняет неиспользуемую структуру, а после этого меняет значение индикатора.

...