Джиттер во времени выполнения функций в embedded-системах - это нестабильность временных интервалов между событиями, которая может приводить к задержкам, ошибкам синхронизации и снижению надежности.
Представьте: объём работы должен быть выполнен в течение каждых 10 мс. Хотя все сроки соблюдены, существует значительный разброс во времени между запусками задачи. Для систем, требующих более точного начала или завершения работы в пределах 10 мс, это недопустимо.
В работе, связанной со считыванием физического входного сигнала (данных с аналого-цифрового преобразователя), точный период выборки может повысить точность получаемых значений. А вот колебания в интервалах между выборками импульсов - энкодера CAN драйвера, например - могут снизить точность определения скорости вращения вала.
Как обнаружить
- Заведите скоростной таймер (или таймер системного времени) и массив счетчиков для каждой ключевой функции.
- Считайте гистограмму или среднее отклонение времени начала выполнения и времени выполнения с хранением одного значения по формуле:
M(n) = M(n-1) + ((t(n) - t(n-1)) - M(n-1)) / n
где M - среднее отклонение, t - время (значение таймера), n - итерация.
- В другом потоке, с комфортной для вас частотой, печатайте значение в отладочный вывод.
Регулярный мониторинг временных характеристик хоть и снижает производительность, но помогает обеспечить стабильную работу системы.
Решение
- Проверьте ISR (Interrupt Service Routine), если это bare metal, - для критических задач приоритет должен быть выше. Проверьте приоритеты задач, если используется RTOS (Real-Time Operating System).
- Вынесите обработчик из ISR и синхронизируйте данные при помощи FIFO или кольцевых буферов.
- Проведите ревью кода, убрав рекурсивные вызовы и нерегулярные циклы.
- Снижайте количество зависимостей от сторонних библиотек (например, printf).