Как вы тестируете свой модуль обработки прерываний?

StackOverflow https://stackoverflow.com/questions/1237368

  •  11-09-2019
  •  | 
  •  

Вопрос

У меня есть модуль обработки прерываний, который управляет аппаратным обеспечением контроллера прерываний на встроенном процессоре.Теперь я хочу добавить к нему больше тестов.В настоящее время тесты проверяют только, работает ли вложение прерываний, создавая два программных прерывания из ISR, одно с низким приоритетом и одно с высоким приоритетом.Как я могу протестировать этот модуль дальше?

Это было полезно?

Решение

Я предлагаю вам попробовать создать и другие стимулы.

Часто аппаратные прерывания также могут быть вызваны программным обеспечением (автоматическое тестирование) или отладчиком путем установки флага.Или как прерывание через ввод-вывод.Или прерывание по таймеру.Или вы можете просто установить бит прерывания в контроллере прерываний через отладчик во время выполнения одиночного шага.

Вы можете добавить некоторые проверки во время выполнения для вещей, которые не должны происходить.Иногда я предпочитаю устанавливать выходные контакты для внешнего мониторинга (неплохо, если у вас есть осциллограф или логический анализатор ...)

low_prio_isr(void)
{
    LOW_PRIO_ISR=1;
    if (1 == HIGH_PRIO_ISR)
    { this may never happen. dummy statement to allow breakpoint in debugger }

}

high_prio_isr(void)
{
    HIGH_PRIO_ISR=1
} 

Недостатком программного прерывания является то, что момент фиксирован;всегда одна и та же инструкция.Я полагаю, вы хотели бы увидеть доказательства того, что это всегда работает;тупик свободен.

Для процедур обслуживания прерываний я нахожу обзоры кода очень ценными.В конце концов, вы можете протестировать только те ситуации, которые вы себе представили, и в какой-то момент усилия по тестированию будут очень велики.ISR, как известно, очень сложны в отладке.

Я думаю, что полезно предоставить тесты для следующего:- isr не прерывается для прерывания с более низким приоритетом - isr не прерывается для прерывания с тем же приоритетом - isr прерывается для прерывания с более высоким приоритетом - максимальное количество вложенностей в пределах ограничений стека.

Некоторые из ваших тестов могут остаться в коде в качестве инструментария (чтобы вы могли отслеживать, например, максимальный уровень вложенности.

О, и еще кое-что:Обычно мне удавалось сохранять ISR настолько короткими, что я мог воздержаться от вложенности....если вы сможете, это обеспечит вам дополнительную простоту и большую производительность.

[ПРАВИТЬ] Конечно, ISR также необходимо протестировать на аппаратном обеспечении в системе.Помимо поэтапного подхода, который вы, возможно, захотите доказать:- стабильность системы при максимальной нагрузке на прерывание (предпочтительно в несколько раз превышающей прогнозируемую максимальную нагрузку;если ваш последовательный драйвер со скоростью 115 Кбит / с также может обрабатывать скорость 2 Мбит / с, все будет в порядке!) - правильный момент включения / выключения isr, особенно если система также переходит в спящий режим - количество прерываний.Может быть удивительно, если вы добавите механические переключатели, механические поворотные (сотни моментов разрыва / соприкосновения до достижения устойчивого положения)

Другие советы

Я рекомендую тестирование на реальном оборудовании.Обработка прерываний по своей сути случайна и непредсказуема.

Используйте генератор сигналов и подайте прямоугольную волну на соответствующий вывод прерывания.Используйте несколько генераторов (или один с несколькими выходами) для тестирования нескольких линий IRQ и проверки обработки приоритетов.

Поэкспериментируйте с увеличением и уменьшением частоты на генераторах сигналов (варьируйте частоты между ними) и посмотрите, что получится.Имейте множество диагностического кода для проверки состояния контроллера прерываний в различных состояниях.

Альтернатива: Если на вашей платформе есть таймеры, которые могут запускать прерывания, вы можете использовать их вместо внешнего оборудования.

Я не встраиваемый разработчик, поэтому я не знаю, возможно ли это, но как насчет отделения кода, который обрабатывает прерывания, от механизма регистрации обратного вызова?Это позволило бы вам написать код симулятора, запускающий события прерывания так, как вам нравится...

Для подобных вещей я настоятельно рекомендую что-то вроде Проверка модели ВРАЩЕНИЯ.В итоге вы тестируете алгоритм, а не код, но тестирование является исчерпывающий.Еще в те времена, Я нашел ошибку в gdb используя эту технику.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top