Evgeny_CDАрхитектор (14.06.2009 11:41, просмотров: 439) ответил Alex B. на по ссылке, пункт "системное время"
Вообще все шедулеры современных ОСей меня пугают своей абстрагированностью. Вот возьмем Ваш пример void TN_TASK task_1 (void *param)
{
TN_SYS_TIM_T t;
for (;;)
{
t = tn_sys_time_get();
foo();
t = tn_sys_time_get() - t;
if (t < FOO_PERIOD)
tn_task_sleep(FOO_PERIOD - t);
else
tn_task_sleep(1);
}
} Джиттер вызова foo() будет недеццкий. Либо мы тик ставим очень часто и тратитм на это ресурсы процессора.
Почему никто не делает так?
Есть некий свободный таймер, который бежит себе на все 16/32 бита, делательно от тактовой ядра. У него есть регистр сравнения для прерывания. Еще есть старшая программаня часть таймера, в виде переменных в памяти, но эт опока опустим.
Шедулер пишет в этот регистр сравнения таймера временную точку прерывания по мере необходимости. Без жесткого графика тиков и пр.
Есть foo(). Которой надо выполниться в момент времени t_foo Задача, в которой крутится foo(), вызывает систему и говорит - поставь мне семфаор на t_foo, и далее виснет на этом семафоре перед входом в foo(). Более того, если все так уж жестко, можно заказать t_foo - t_before , чтобы компенсировать задержки ОСи. Получив управление, задача опрашивает таймер "в лоб" в ожидании нужного момента времени, выполняет свою foo(), затем снова виснет на семафоре, заданном уже на другой момент времени. При этом регулярность вызова foo() не обязательна, джиттер на уровне 1 мкс получить можно.
Идея с мягкой критической секцией мне нравится все больше и больше.
Неотемлемой частью шедулера должна быть система протоколирования конфликтов. Типа когда несколько задач поставили запросы на близкие интервалы времени, и та, которой дали управление, работала дольше "зазора" до другой. Чтобы потом искать, кто где не успел по логам.
Если уж совсем грамотно проектировать, то задаче надо задавать (t_foo_min, t_foo_max, t_before). Если в вашей системе куча foo(), и всем нужен джиттер 1 мкс, то вам не повезло :) Если же такая задача 1, и есть еще десяток с джитером 1 мс, то у шедулера есть шанс все это разрулить.