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