Что такое таблица векторов прерываний (vector table) и где она находится
Что проверяют
Понимаете ли вы, как железо передаёт управление в код, и умеете ли вывести из этого класс дефектов. Для тестирования встроенных систем вопрос с продолжением: ошибки вокруг прерываний не ловятся функциональными сценариями, они всплывают под нагрузкой и на редких сочетаниях событий.
Как отвечать
Таблица векторов прерываний это массив адресов обработчиков, пронумерованный по источникам событий. Когда контроллер сообщает процессору номер события, процессор берёт из таблицы соответствующий адрес, сохраняет минимальный контекст и передаёт управление обработчику. Смысл таблицы в предсказуемости: переход занимает фиксированное время, без поиска и разбора.
Где она лежит, зависит от архитектуры. У микроконтроллеров на ядре Cortex-M таблица расположена в начале памяти программ: первое слово это стартовое значение указателя стека, дальше вектор сброса и системные исключения, затем периферийные. База переносится отдельным регистром смещения, поэтому у загрузчика и у приложения таблицы разные. В x86 в реальном режиме таблица лежит в самом начале адресного пространства, а в защищённом её роль играет таблица дескрипторов прерываний, адрес которой хранится в регистре процессора.
Для тестирования отсюда следует главное: у прерываний есть приоритеты и вложенность, обработчик выполняется поверх любого текущего кода, и всё, что он делит с основной программой, становится разделяемым ресурсом.
Где спотыкаются
Считают адрес таблицы неизменным и нулевым. На практике база переносится, и обновление прошивки, где приложение стартует из загрузчика, ломается именно на этом: прерывания уходят в чужие обработчики.
Путают вектор с обработчиком. Вектор это адрес, а не код, и номер вектора не задаёт приоритет: приоритеты настраиваются отдельно, поэтому событие с меньшим номером спокойно ждёт, пока выполняется более приоритетное.
Проверяют только функцию. Тестировать надо ситуации, которые прерывания и создают: слишком длинный обработчик, потерянное второе событие того же источника, доступ к общей переменной без защиты. В одиночном сценарии всё зелено, а на потоке событий данные начинают расходиться.