Устройство STM32F7 зависает: нет доступа к регистрам

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

Точно так же я не могу получить доступ к регистрам устройства для проверки счетчика программ, указателя стека и IPSR ни через сеанс отладки eclipse, ни с помощью программного обеспечения ST-Link Utility (устройство сбрасывается при подключении и состояние теряется) .

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

дополнительные детали

(a) Аппаратное обеспечение - боюсь, я не могу дать вам слишком много информации, это индивидуальная запатентованная разработка.

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

Проблема возникает нечасто, поэтому трудно сказать, оказало ли какое-либо влияние изменение.

(c) Я не пытался снизить тактовую частоту (системы?) и буду более тщательно тестировать устройство, отключив различные соединения.

(d) Интенсивность отказов составляет примерно 1 отказ на устройство в день, но трудно количественно оценить какое-либо улучшение/регресс (устройство работает весь день).

(e) Вы спрашиваете о захвате данных после сброса, но сообщаете, что проблема заключается в «зависании» MCU, а не в том, что он сбрасывается. Я предполагаю (но это не ясно), что проблема всегда в том, что MCU зависает. Это вы можете выполнить ручной сброс, и вы спрашиваете, можно ли получить какую-либо полезную информацию после ручного сброса. Это верно?

Правильный. Хотя получение информации во время заморозки было бы еще лучше.

Шаги отладки

(i) Эту проблему невозможно воспроизвести с помощью теста, несмотря на все мои усилия.

(ii) что вы делаете после этого, например, выполняете ручной сброс?

Пытаюсь прочитать регистры, определить, где завис код.

В идеале вам нужна функциональность для подключения к цели во время ее работы. Я не использую ваш набор инструментов, поэтому понятия не имею, возможно ли это. Этот веб-сайт предлагает некоторую информацию о Segger J-Link, и я немного припоминаю, что ST-Link можно обновить до J-Link (не уверен, что это были только те, что на платах Nucleo). Но даже без этого это может помочь, так как способ может работать и для ST-Link.
Звучит как проблема с аппаратным сбросом для меня. Это одноразовая конструкция?
ожидание незавершенного ввода-вывода
Как синхронизируется система? Используете ли вы стандартный код конфигурации часов (например, CubeMX)?
@Arsenal, я проверю это, спасибо за совет!
@ Andyaka нет, эта проблема воспроизводится на нескольких (идентичных) устройствах.
@SunnyskyguyEE75 да, я подумал, я думаю, что это связано с прерыванием из-за его асинхронной природы
Стандартная конфигурация часов @Jon, 216 МГц
@nick - Пожалуйста, отредактируйте свой вопрос, чтобы добавить больше деталей: (a) Объясните аппаратное обеспечение - это ваш дизайн или стандартная плата разработчика? Добавьте фотографии оборудования в вопрос. (b) Предполагая, что это ваш дизайн, объясните историю - всегда ли это было проблемой или было время, когда этой проблемы не было? Какие действия по устранению неполадок вы уже предприняли? (c) Какое упрощение вы можете сделать (или уже сделали) для системы, например, уменьшить тактовую частоту; удаление внешних подключений, запуск только кода «мигающий светодиод» и т. д.? (d) Что такое частота отказов и нашли ли вы что-нибудь, что ее меняет?
(e) Вы спрашиваете о захвате данных после сброса, но сообщаете, что проблема заключается в «зависании» MCU, а не в том, что он сбрасывается. Я предполагаю (но это не ясно), что проблема всегда в том, что MCU зависает. Это вы можете выполнить ручной сброс, и вы спрашиваете, можно ли получить какую-либо полезную информацию после ручного сброса. Это верно? Опять же, пожалуйста, отредактируйте вопрос, чтобы добавить подробную информацию о точных шагах, которые вы выполняете, чтобы (i) выполнить тест, который вызывает проблему, и (ii) что вы делаете после этого, например, выполняете ли вы ручной сброс? (f) Пожалуйста, добавьте также схему. Спасибо.
@SamGibson спасибо, я уточню
Обычные подозреваемые: сброс MCU, включая сторожевой таймер, потеря часов, потеря питания/отключение питания.

Ответы (2)

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

Вы все еще можете прочитать информацию об ОЗУ после сброса (или добавить некоторую трассировку, чтобы сбросить что-то в ОЗУ). Базовые архитектурные регистры не сбрасываются (если у вас нет части, относящейся к безопасности с высокой надежностью), поэтому, если вы поместите a B selfв обработчик сброса (при условии, что отладчик «остановка после сброса» не работает), тогда ваше старое состояние должно быть сохранено .

Вы можете использовать трассировку ETM для захвата трассировки в реальном времени, и если вы записываете трассировку в ETB, вы можете просто прочитать ее после сброса (опять же, она должна быть постоянной) без использования зонда (но, возможно, указатель буфера будет потерян, поэтому вы может потребоваться ручная обработка трассировки). Трассировка ETM покажет ветки (адреса для любой непрямой ветки) и исключения (включая блокировку), поэтому вы должны получить достаточно точное представление о том, что было последним. В частности, трассировка просто «наблюдает» за ядром, поэтому она видит, что инструкции удаляются, не подвергаясь влиянию активности шины. DWT также может дать что-то полезное - в зависимости от того, что на самом деле не работает.

Как указано в одном из комментариев, по крайней мере, используя MDK, вы можете подключиться к «горячей» работающей цели (без сброса/остановки, без загрузки кода), поскольку порт отладки представляет собой полностью асинхронный мастер шины, встроенный в ядро . Это дает вам возможность исследовать состояние памяти устройства с длительным временем безотказной работы (но не основных регистров) с минимальным вмешательством, и это может быть полезно для подтверждения диагноза. Вы даже можете написать регулярный опрос ячеек памяти, если это актуально.

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

Кроме того, попробуйте использовать Keil MDK. Возможно, ему больше повезет при подключении к неудовлетворительному целевому устройству. Он должен поддерживать ваш зонд STLink.

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

  1. Проблема может заключаться в коротком замыкании где-то на плате или в разомкнутом соединении, или, возможно, в слабом соединении. Мы не знаем, что это может быть. Итак, прежде всего, очистите всю плату изопропиловым спиртом (он же очиститель печатных плат), хорошенько потрите ее зубной щеткой, а затем используйте Kimwipes, чтобы вытереть грязь/пыль/металлические частицы и т. д. Проверьте, работает ли UC. Если это не так, осмотрите послеочистку печатной платы на наличие оборванных дорожек, поврежденных контактных площадок печатной платы, соединений холодной пайки и т. д. На этом этапе желательно попробовать переработать всю плату, чтобы устранить проблему «ослабленных соединений/стыков». Проверьте, работает ли UC после этого.

  2. Если UC по-прежнему не работает, проверьте основные факторы, такие как колебания напряжения питания, шумы в сигнальных линиях, тактовые импульсы UC и т. д. Используйте DSO для контроля тактовых импульсов и линии сброса. Также проверьте целостность всех разъемов. Пошевелите провода, когда UC работает, и посмотрите, устранена ли проблема. Проверьте эти вещи, а затем снова попробуйте на UC.

  3. Если это не решит проблему, проверьте программное обеспечение. Прошить код на новом UC (не на новой макетной плате!). Создайте свою собственную доску разработки barebones. Под barebone-системами я подразумеваю отсутствие подключенных периферийных устройств и внешних схем. Просто часы и несколько регуляторов, вот и все! Вы должны убедиться, что код не замораживает UC. Устранение внешних периферийных устройств устранит проблемы, связанные с ними (если таковые имеются). Итак, теперь это проверяет ваше программное обеспечение. Когда вы делаете свою собственную плату разработки barebones, замигайте светодиодным кодом, чтобы убедиться, что она работает. Затем прошейте свое программное обеспечение на UC и проверьте, зависает ли UC или нет. Если это так, то радуйтесь, это было программное обеспечение, вызывающее проблемы. Внесите необходимые изменения в программное обеспечение и заставьте его работать на базовой плате разработки. Как только он отлично заработает на bb devboard,

  4. Если UC все еще зависает, это означает, что вы, возможно, изменили некоторые биты регистра UC, которые нельзя трогать, с помощью программного обеспечения. Проверьте свое программное обеспечение и запишите все регистры и биты, которые оно изменяет. Убедитесь, что программное обеспечение безопасно использует UC.

  5. Если проблема не устранена, проверьте, правильно ли работает используемый вами флэш-инструмент. Сделайте это, используя флеш-инструмент для отладки «здоровых» плат UC. Если операция прошла успешно, то ваш flash tool в порядке.

  6. Если ваше программное обеспечение зависает каждый UC, то, вероятно, это проблема с программным обеспечением. Проверьте, есть ли в STMm32F7 что-то вроде «Используйте параллельный программатор высокого напряжения для сброса фьюз-битов». Блокированные микроконтроллеры Atmel можно восстановить с помощью HVPP.

Попробуйте эти методы и дайте мне знать, что происходит. Будьте терпеливы в процессе отладки, устраняйте проблемы одну за другой. Помните, программирование — это навык, а отладка — это искусство!

Хотя этот список действителен для общей отладки, на самом деле он не отвечает на вопрос о том, «как я могу извлечь состояние ядра». ОП спрашивает об особенностях конкретного устройства. Для отладки DAP у нас есть видимость того, какой уровень протокола застрял, и архитектура отладки также разработана для облегчения запуска кремния, поэтому есть некоторые довольно конкретные рекомендации, если нам нужно пойти по этому пути.