Я так все прерывания делаю. Тривиальный кольцевой буфер. В
прерывании - только в него пишет и переставляет индекс, который
если длина буфера кратная степени двойки (256) сам заворачивается.
Вот это: { buf[buf_write_index++] = myvar; buf_updated_flag = true;
} ~ три инструкции. В mainloop постоянный поллинг:
if (buf_updated_flag) {
buf_updated_flag = false;
while (buf_read_index != buf_write_index) {
myvar_from_interrupt = buf[buf_read_index++]; // извлекли
}
}
Для иллюстрации пишется/читается myvar. Сделать buffer[] из struct{} никто не мешает.
записывать туда время происхождения прерывания - тоже полезно.
Порядок "сообщений" подобная буферизация не изменяет.