Ответ: в многозадачках упорядочивают по величине задержки
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено andys1960 05 января 2004 г. 18:30
В ответ на: почитать как делать алгоритм не понятно как делать одновременное выполнение временных задержек отправлено nm5 05 января 2004 г. 14:59

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

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru