Перейти к содержанию
    

Отладка при помощи Stlink, странное поведение

Друзья, вчера меня ввёл в ступор процесс отладки. Очень странная проблема. Есть некая функция ( USBH_class_request,  не ручаюсь за точность, это функция из библиотеки USB host для Stm32, камень - н743). Размещаю в ней брейкпоинт, он не срабатывает. Долго думал, что по какой-то причине функция не вызывается, но нет - поставил брейкпоинт раньше, и пошагово шёл от команды к команде и в итоге отладчик в функцию зашёл. 

Как найти причину? Среда разработки Keil. Отладчик - stlink 2.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, MementoMori сказал:

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

Оптимизация включена?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, MementoMori сказал:

Как найти причину?

Выключить оптимизацию, пересобрать проект полностью заново с отладочной информацией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, MementoMori сказал:

Включена, уровень 3.

Там (в STM32CubeIDE и gcc) еще есть уровень оптимизаии - 'Debug'. Его лучше тогда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, AleksBak said:

Там (в STM32CubeIDE и gcc) еще есть уровень оптимизаии - 'Debug'. Его лучше тогда.

У меня кейл 5.х

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, MementoMori сказал:

поставил брейкпоинт раньше, и пошагово шёл от команды к команде и в итоге отладчик в функцию зашёл. 

Может пока вы неспешно выполняли команду за командой успело произойти какое-то событие, без которого программа в функцию заходить не должна? Или, как тут правильно намекнули, вы ставите точку останова на выражение, которое компилятор соптимизировал настолько, что уже не в состоянии найти соответствующую его началу ассемблерную инструкцию (на адрес которой он должен поставить точку останова).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, помогло.

 

Следующая проблемка.


/*----------   -----------*/
#define USBH_DEBUG_LEVEL      0U

  #if (USBH_DEBUG_LEVEL > 0U)
#define  USBH_UsrLog(...)   do { \
                            printf(__VA_ARGS__); \
                            printf("\n"); \
} while (0)
#else
#define USBH_UsrLog(...) do {} while (0)
#endif

Так выводятся отладочные сообщения. Для этого нужно включить DEBUG_LEVEL, присвоить ему значение больше нуля. Как только я это делаю, после старта проц несколько раз останавливается при старте. Еще до обращения к библиотеке USB

То есть, можно поставить брейкпоинт здесь

CkHsDnUC.png?download=1

 

и до его срабатывания не доходит. Только после трех нажатий "Run". А дальше все как обычно, работа без проблем.

Во время остановки в ассемблерном окне вот что

Tl3Dr7KH.png?download=1

 

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

То есть строки 

#define  USBH_UsrLog(...)   do { \
                            printf(__VA_ARGS__); \
                            printf("\n"); \
} while (0)

 

создают проблему не своим действием, но своим присутствием.

 

Проблема эта отсутствует на F746 камне на плате Discovery, в проекте сгенерированном кубом.

Проблема эта присутствует на H743 камне на самопальной плате, в проекте сгенерированном кубом.  

Исходя из этого, полагаю, куб ни при чем, плата, думаю тоже, значит какая-то особенность 743 камня, не учтенная в библиотеке USB

 

Что делать и кто виноват?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, MementoMori сказал:

Что делать и кто виноват?

В вашей программе присутствует команда останова. Кто виноват, что в ней появилась такая команда? Что делать: искать в .map, внутри находится этот адрес, искать эту функцию в исходнике, удалить из нее эту команду или пытаться понять - зачем ее туда поместили и как ее обойти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть, искать функцию, адрес которой ближе всего к 08000Е8С и при этом меньше его? 

 

Пардон, а какая такая команда на С приводит к остановке? Ассемблерных вставок, где могла бы быть такая команда, я вроде бы не видел... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, MementoMori said:

Пардон, а какая такая команда на С приводит к остановке?

Никакая) Ищете по всему тексту в проекте "bkpt" без чувствительности к регистру...

11 minutes ago, MementoMori said:

Ассемблерных вставок

Они оформляются разными способомами, может быть просто не заметили) А файлы на ассемблере есть? Возможно, в них находится эта команда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, haker_fox said:

Никакая) Ищете по всему тексту в проекте "bkpt" без чувствительности к регистру...

Иными словами, если описанный казус у меня происходит, то это однозначно дело рук асмемблерного кода? А компилятор не может глюкануть и при переваривания С кода родить такую команду? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 минут назад, Сергей Борщ сказал:

В вашей программе присутствует команда останова. Кто виноват, что в ней появилась такая команда?

Для того, чтобы BKPT появилось в образе программы во флешь, не обязательно команда останова должна присутствовавть в программе.

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

15 минут назад, MementoMori сказал:

Иными словами, если описанный казус у меня происходит, то это однозначно дело рук асмемблерного кода?

Не обязательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, MementoMori said:

то это однозначно дело рук асмемблерного кода?

Я других способов не знаю, но вам про них написал уважаемый @jcxz) Есть ещё так называемые intrinsic-функции, но среди них не нашёл __BKPT()

8 minutes ago, jcxz said:

успеет снять этот бряк и он останется в коде.

О как! Даже не предполагал такого, вернее на сталкивался. Спасибо за информацию! В этом случае автору топика остаётся лишь перепрошить МК)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jcxz said:

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

Вот кстати, обратил внимание на странный факт - после того, как я выключаю отладку, кейл фокусирует рабочее окно на файле  .S и в тексте имеющегося там кода напротив некоторых строк стоят брейкпоинт, хотя я их туда не ставил. Я убираю, но спустя какое то время они появляются вновь. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...