2010-07-21 7 views
1

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

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

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

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

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

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

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

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

ответ

3

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

EDIT:

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

+0

Это Cortex-M3 (LPC1343). Ах, да, я понимаю, что вы имеете в виду, объедините их в одно слово, а затем напишите это в одной инструкции ... Это сработает, они будут как одиночными байтами. Это легко, теперь вы сказали это, почему я не подумал об этом :) – jcoder

+0

Хотя я должен добавить предупреждение: * при условии, что указанный размер данных доступен атомарно *. Один байт обычно является атомарным. Но 16-разрядный (или 32-разрядный) доступ может быть не атомарным - рассмотрите системы, в которых шина данных является только 8-разрядной (или 16-разрядной), соответственно. – 2010-07-21 08:13:30

+0

Для Cortex-M3 это будет атомная операция, но самый портативный способ - сделать это вторым способом. – kmalmur

 Смежные вопросы

  • Нет связанных вопросов^_^