ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
405470 Топик полностью
koyodza (26.04.2013 18:00, просмотров: 190) ответил Vladimir Ljaschko на Ну вот рассудите. У меня есть 1) расчеты на десяток миллисекунд с периодом 100мс 2) расчеты на 1 мс с периодом 10 мс 2) обслуживание 5-6 логических модулей с периодом 500 мкс. Как совместить? Я не могу разделить на части формулу с long long - что
смешались кони с котлетами все эти разные задачи (если они периодические) просто добавляются в процессе инициализации и потом будут вызываться с требуемым интервалом. Добавляются примерно так: TASKHANDLE AddTask(const void* pFn, DWORD param32, __int32 delay, __int32 period) Где: const void* pFn - указатель на функцию-обработчик события (именно она будет вызываться) DWORD param32 - передаваемый в функцию параметр (для циклически вызываемых смысла не имеет) __int32 delay - задержка перед первым вызовом __int32 period - период вызова Значения задаются в системных тиках, обычно системный тик 1мсек, но может быть и другое значение. Вызываемая функция должна завершаться быстро, чтобы она не рвала общую временную диаграмму. Насколько быстро - это зависит от устройства, где-то это не более сотни мксек, где-то и десяток мсек нормально, просто нужно понимать, что любое другое событие (кроме прерываний) может быть отложено на такое время. Это время назовём Tmax Если нужно выполнить большие расчёты, например, то этот кусок разбивается на несколько. У меня чаще выполняется не с жесткой периодичностью, а начинается по готовности другого модуля, который выступает инициатором начала расчётов, добавляя в очередь нужный вызов первой функции: TASKHANDLE AddMessage(const void* pFn, DWORD param32, __int32 delay) По завершении первая функция точно также добавляет вторую, и т.д. (или саму себя), каждая из функций отдельно не должна выполняться дольше Tmax, но в сумме это может быть сколько угодно. За тем, чтобы каждый кусок не выполнялся дольше Tmax нужно следить самому, при отладке помогает отдельный счетчик времени выполнения у каждой задачи и отдельно регистрируется максимальное время выполнения. В прерываниях выполняется только необходимый минимум, всё что возможно вынесено в фон. В моей реализации все задачи имеют равный приоритет, пока обходился этим. Есть только возможность добавить в очередь функцию для немедленного выполнения, для этого delay задается 0, но в каждый момент времени таких неотработавших функций может быть только одна, но больше не требовалось