Самый простой способ разделить переменную между обработчиками IRQ и основным потоком в любой голой железной системе:
Убедитесь, что тип переменной - тот, который ЦП может атомарно прочитатьи напишите.
Сделайте переменную глобальной и объявите ее volatile
, чтобы сгенерированный машинный код не мог оптимизировать доступ к общей переменной.
Чтобы прочитатьзначение, используйте что-то вроде const atomic_type local_copy = shared_variable;
и работайте с этой локальной копией.Выражение типа shared_variable * shared_variable
может использовать разные значения для shared_variable
.
Убедитесь, что только один обработчик IRQ (который должен выполняться только один раз в одно и то же время) или только основнойпоток записывает в общую переменную.
Все остальные части кода могут читать только общую переменную.
Если данные, которые вы хотите передать между обработчиком IRQи основной поток не вписывается в атомарный тип, развлекайтесь со сложными протоколами блокировки.