Что происходит в стартап скрипте с адресами стека, ROM и таблицей векторов прерываний
Что проверяют
Понимаете ли вы, что происходит от сброса питания до первой строки main, и умеете ли превратить это в проверки. От тестировщика ждут не пересказа документации, а списка того, что здесь ломается и как это выглядит снаружи.
Как отвечать
У распространённых микроконтроллеров таблица векторов лежит в начале постоянной памяти, и первые два слова в ней особенные: первое это начальное значение указателя стека, второе адрес обработчика сброса. Процессор читает их сам, до выполнения любого кода. Дальше работает стартовый код:
- настройка тактирования и питания, ожидание готовности генератора;
- копирование инициализированных переменных из постоянной памяти в оперативную;
- обнуление секции неинициализированных данных, подключение внешней памяти;
- инициализация библиотеки времени выполнения и глобальных объектов, переход в
main.
Адреса секций, вершина стека и размещение таблицы задаются файлом компоновщика, а саму таблицу можно перенести в оперативную память регистром смещения.
Теперь переведите это в проверки: карта памяти из отчёта компоновщика против образа, неиспользуемые векторы ведут в заглушку, а не в случайный адрес, стек залит шаблоном и максимальная глубина измерена, поведение при отказе внешнего генератора и при испорченной конфигурации, холодный старт против сброса по сторожевому таймеру, переход из загрузчика в приложение.
Где спотыкаются
Пересказывают теорию и останавливаются. Тестировщика спрашивают не о том, как устроен старт, а о том, что подать на вход и по какому признаку понять, что шаг прошёл: индикация, вывод в отладочный интерфейс, содержимое регистра причины сброса.
Второе: забывают про переход из загрузчика в прикладную программу. Если не переставить указатель стека и не переключить таблицу векторов, прерывание уйдёт в обработчик загрузчика. Дефект плавающий, воспроизводится только когда прерывание успело прийти.
Третье: проверяют только удачный старт. Переполнение стека тихо портит соседнюю область памяти, и падение случается позже и в другом месте, а испорченные данные в энергонезависимой памяти без контрольной суммы дают устройство, которое молча не запускается.