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