Николай Коровин (29.03.2018 10:53 - 10:56, просмотров: 134) ответил Dingo на Как подступиться думаю: есть несколько устройств на одних и тех же выводах МК, и есть задачи разного приоритета с использованием этой периферии. Понятно, что прерывать обмен на середине нельзя, но как бы сделать, чтобы следующим обменом был
Я бы разделил приоритеты и количество задач на каждом приоритете. Скажем, каждая задача помнит, что ей надо сделать N отправок. Сама. А арбитр просто имеет одно слово флагов. Если какая-то задача хочет что-то отправить, то она взводит арбитру свой флаг и инкрементирует своё N. Когда линия свободна, арбитр выбирает старший флаг, сбрасывает его и даёт задаче линию. Задача начинает отправлять, декрементирует N и если там не ноль, то снова упрямо взводит арбитру свой флаг, напоминая, что она потом захочет ещё.
В результате и очередь не раздувается до неизвестной длины, и всё работает, как надо, гонок нет.
А, так ещё можно сделать суб-приоритеты. Если у какой-то задачи N стало слишком большим, она может в меру разумного представления о своих потребностях что-то выкинуть. Скажем, буфер от старья почистить.