ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
23 декабря
1000878 Топик полностью
Связанные сообщения
Snippets
Пользуйся:2020-06-11
RxTx (01.05.2020 20:07, просмотров: 1280) ответил Andreas на Есть периодическое прерывание с длительностью менее 100мкс, где много что делается и по времени оно впритык. И из него надо скинуть наружу в лог 5..15 байт максимально быстро. Да, конечно можно через буфер а в другой задаче выгребать и не торопясь отправлять в консоль по printf. Но неудобно по разным причинам и хотелось другого решения.
Я так все прерывания делаю. Тривиальный кольцевой буфер. В прерывании - только в него пишет и переставляет индекс, который если длина буфера кратная степени двойки (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{} никто не мешает.

записывать туда время происхождения прерывания - тоже полезно.

Порядок "сообщений" подобная буферизация не изменяет.

Спасибо, князь. Вы настоящий дворянин. И программист.