энергозависимый барьер памяти против прерываний - PullRequest
3 голосов
/ 27 июня 2019

Пусть x и y - переменные, которые совместно используются основным кодом и кодом прерывания.

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

Каждое использование x и y в основном коде гарантированно будет атомарным при отключении прерываний.

Действительно ли x и y должны быть volatile, или достаточно поставить барьер памяти перед их использованием для принудительной перезагрузки переменных из ОЗУ?

A)

volatile bool x;
volatile int y[100];

int main(void)
{

        while (true) {
                disable_interrupts();
                if (x)
                        work(y);
                x = false;
                enable_interrupts();
        }
}

В)

bool x;
int y[100];

int main(void)
{

        while (true) {
                memory_barrier();
                disable_interrupts();
                if (x)
                        work(y);
                x = false;
                enable_interrupts();
        }
}

Цели:

  • Чтобы позволить компилятору оптимизировать work().

  • Уметь использовать стандартные библиотечные функции, такие как memcpy() (они не предназначены для использования с volatile переменными).

Редактировать: добавить пример прерывания

interrupts.c

extern volatile? int x;
extern volatile? int y;

void interrupt(void)
{

        x = true;
        REGY1 = y[7];
        y[23] = REGY2;
}

1 Ответ

2 голосов
/ 27 июня 2019

Барьеры памяти вместо volatile в порядке. Разработчики ядра Linux предпочитают так

Есть несколько вещей, на которые стоит обратить внимание.

  • Переместить шлагбаум после отключения прерываний. Прерывания, как правило, случаются в худшие времена.
  • Вам нужен второй барьер памяти перед включением прерываний для переменных, которые записываются в основную программу и читаются в обработчике прерываний.
  • Отключение прерываний недостаточно в многопроцессорной / многоядерной системе, это не мешает запуску другого ядра.
  • Излишне говорить, что прерывания не следует отключать на длительные периоды времени, поскольку это может помешать работе некоторых аппаратных драйверов.
...