Atilla
@Atilla

Управление процессами и прерываниями в микроконтроллере stm32f4

По мере разработки одной программы возникла такая проблема:

К линии I2C подключенный несколько датчиков. Пускай это датчик "А" и датчик "Б".

Я получил прерывание от USB - допустим команда от компьютера, к которому подключён микроконтроллер, вытащить калибровочные данные из датчика "А". Приоритет этого прерывания низкий. Пускай 3. Обработчик подключился по I2C, и начал тянуть оттуда данные. А в этот момент приходит прерывание с датчика "Б" с приоритетом повыше. 2 например. Мол, готовы новые измерения, забирай. И выполнение программы прескачило в обработчик.
А по линии в это время передавались данные из "А". Естественно обработчик попытается подключиться к "Б" и забрать последние данные, и натворит бед на линии.

Можно конечно в обработчике прервать коммуникации с "А", отправив стоповый бит, и подключиться к "Б", а затем забрать данные из него. Но тогда я потеряю данные из датчика "А", плюс когда управление вернётся в обработчик "А", то он обнаружит что коммуникация с "А" внезапно закрыта. Хотелось бы чтобы прерывание от Б не беспокоило почём зря обработчик А, а подождала своей очереди.

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

То биш нужно уступать только когда линия I2C занята.

Надеюсь не очень сумбурно.
  • Вопрос задан
  • 3167 просмотров
Пригласить эксперта
Ответы на вопрос 1
Я очень давно не работал с STM32, но обычно такие вещи решает DMA и трансляция irq в soft-irq. Идея в том что бы получить прерывание от USB - оставить его "на потом" в виде обработчика softirq, а данные писать с i2c прямо в память через DMA. Когда сбор данных завершится - выполнить обработку всех отложенных прерываний в порядке следования.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы