Параллельный доступ к члену структуры - PullRequest
3 голосов
/ 22 августа 2010

Я использую 32-битный микроконтроллер (STR91x). Я одновременно обращаюсь (из ISR и основного цикла) к члену структуры типа enum. Доступ ограничен записью в это поле перечисления в ISR и проверкой в ​​основном цикле. Базовый тип Enum не больше целого (32-битного). Я хотел бы убедиться, что я ничего не пропускаю, и я могу смело делать это.

Ответы [ 6 ]

2 голосов
/ 23 августа 2010

Если вы хотите убедиться, найдите переключатель компилятора, который генерирует список сборок, и проверьте сборку на запись в ISR и чтение в основном цикле. Даже если вы не знакомы со сборкой ARM, я уверен, что вы быстро и легко сможете определить, являются ли операции чтения и записи атомарными.

2 голосов
/ 22 августа 2010

Как сказал paxdiablo & David Knell, в общем, это нормально. Даже если ваша шина <32 бит, скорее всего, несколько циклов шины инструкции не будут прерваны, и вы всегда будете читать действительные данные. </p>

То, что вы заявили, и то, что мы все знаем, но стоит повторить, что это хорошо для ситуации с одним писателем, читателем N Если у вас было более одного писателя , все ставки отключены, если у вас нет конструкции для защиты данных.

2 голосов
/ 22 августа 2010

При условии, что 32-битные операции чтения и записи являются атомарными, что почти наверняка имеет место (возможно, вы захотите убедиться, что ваше перечисление выровнено по словам), тогда то, что вы описали, будет в порядке.

1 голос
/ 25 августа 2010

ARM поддерживает 32-битные выровненные чтения, которые являются атомарными в отношении прерываний.Однако убедитесь, что ваш компилятор не пытается кэшировать значение в регистре!Либо пометьте его как volatile, либо используйте явный барьер памяти - в GCC это можно сделать следующим образом:

int tmp = yourvariable;
__sync_synchronize(yourvariable);

Обратите внимание, однако, что в текущих версиях GCC предусмотрен полный барьер памяти для __sync_synchronize, а не только для одной переменной, поэтому volatile, вероятно, лучше для ваших нужд.

Кроме того, обратите внимание, что ваша переменная будет выровнена автоматически, если вы не делаете что-то странное (т.е. явно указываетерасположение структуры в памяти или запрос упакованной структуры).Нераспределенные переменные в ARM не могут быть прочитаны атомарно, поэтому убедитесь, что они выровнены, или отключите прерывания во время чтения.

0 голосов
/ 24 августа 2010

Выровненный 32-битный доступ, как правило, будет атомарным (если это не был особенно нелепый компилятор!).

Однако надежное решение (и одно из них, как правило, применимо и к не 32-битным целевым объектам) заключается в простом временном отключении прерывания при доступе к данным вне прерывания.Самый надежный способ сделать это - использовать функцию доступа к статически ограниченным данным, а не делать данные глобальными , где у вас нет единой точки доступа и, следовательно, нет способа принудительного применения механизма атомарного доступа при необходимости.

0 голосов
/ 22 августа 2010

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

Так что, вероятно, единственное, на что вам следует обратить внимание - это если основной поток может быть прерван в середине чтения (так что он может получить часть старого значения и часть нового).

Это , должно быть простым вопросом обращения к спецификациям, чтобы гарантировать, что прерывания обрабатываются только между инструкциями (это, вероятно, так как альтернатива будет очень сложной) и что ваша 32-битная нагрузка является одиночной инструкция.

...