|
Если все в системе навешено на один аппаратный таймер, а задержки отсчитываются в разных циклах, а не в одном общем (главном)...то в таймерном хандлере требования упорядочиваются по величине.
Так сделано в большинстве СРВ для микроконтроллеров.
Предположим "системный тик" -1 мкс( это означает, что меньшие и некратные задержки получить нормальным способом в системе невозможно), а надо обрабатывать асинхронные запросы на задержки и "отсидевшие свое" в отстойнике ;) ( обменнике прерывания по времени) отложенные процессы запускать на выполнение.
Если "освобождаются" два процесса одновременно-то необходимо учитывать их приоритет.
В этом таймерном хандлере-далее по тексту "тике", который по сути есть диспетчер для всего в системе, нужно организовать учет поступивших требований, упорядочить их(в таблице, списке, очереди, кольцевом буфере либо по их идентификаторам, либо по указателям(отдельный вопрос)) и взводить их флажки готовности. Флажки могут быть и не нужны, это зависит от системы(программы). Если флажок сброшен - процесс отложен во времени(если есть отладчик в виде отдельного процесса это удобно, т.к. сразу видно состояние процесса в каждый момент времени). Например, в очередной раз у него появляются новые "клиенты" А,5 и B,20 Через запятую указано сколько "активизаций" таймерного хандлера-"тика" они должны быть неактивны. Если очередь обслуживаемых пуста, то можно переприсвоить второму процессу B величину ожидания на 15 и вообще на него не смотреть, пока его указатель не первый в очереди. А у A каждую активизацию таймерного хандлера вычитать по 1 и когда станет 0 взвести его флажок и удалить из очереди его указатель(лучше кольцевой буфер, если неизвестно сколько может быть ожидающих). Если поступят новые требования с меньшим временем ожидания-плохо, придется пересчитывать все значения, если с большим большего- без проблем, только для вновь поступившего. Можно и тупо по абсолютным величинам выстраивать очередь, но тогда в каждый "тик" придется декрементировать массу величин интервалов ожидания и переупорядочивать всю очередь(если вновь поступивший вклинивается). В общем, проще взять какой-нить исходник многозадачки и посмотреть как там сделан rqwait. Его взаимодействие с системным диспетчером будет прозрачно. Можно их объединить, только если у процессов нет приоритетов, то надо как-то отрабатывать ситуацию с одновременным освобождением нескольких. Когда очередь пуста хандлер должен ( при отсутствии диспетчера) разделять процессор между процессами :)
E-mail: info@telesys.ru