ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
6 мая
159009 Топик полностью
Evgeny_CD, Архитектор (14.06.2009 11:41, просмотров: 386) ответил 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 мс, то у шедулера есть шанс все это разрулить.