Точки останова не работают при загрузке с Flash

Раньше я без проблем отлаживал исполняемые файлы, загруженные во внутреннюю SRAM моего Cortex M3 (STM32F2). Недавно я загружал свой исполняемый файл во Flash (из-за проблем с размером).

С тех пор отладка с помощью GDB не работает. Насколько я понимаю, когда исполняемый файл находится во Flash, можно использовать только аппаратные точки останова (в отличие от программных), а аппаратных точек останова у меня шесть. Однако при установке только одной аппаратной точки останова GDB выдает сообщение об ошибке:

(gdb) break main
Breakpoint 1 at 0x800019a: file src/main.c, line 88.
(gdb) c
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.
(gdb) Warning:
Cannot insert hardware breakpoint 1.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

Что может пойти не так? Используются ли мои аппаратные точки останова в фоновом режиме?

Примечание: я использовал OpenOCD для загрузки исполняемого файла через JTAG.


person Randomblue    schedule 08.05.2012    source источник
comment
Пробовали ли вы создавать точки останова с помощью hbreak?   -  person ams    schedule 08.05.2012
comment
@ams: Да, я пытался. Не работает.   -  person Randomblue    schedule 08.05.2012
comment
Что говорит maintenance info breakpoints?   -  person ams    schedule 08.05.2012
comment
@ams: там написано «Нет точек останова или точек наблюдения».   -  person Randomblue    schedule 08.05.2012
comment
Тогда это должно исключить скрытую фоновую точку останова.   -  person ams    schedule 09.05.2012
comment
Следующий пост в списке рассылки патчей gdb может быть использован/интересен исходным кодом. org/ml/gdb-patches/2006-11/msg00002.html Проверьте, какую версию GDB вы используете, попробуйте определить, включен ли в вашу версию патч, указанный в сообщении выше. Рассмотрите возможность обновления, если это уместно.   -  person Rob Kielty    schedule 30.05.2012
comment
@Роб: Спасибо. Симптомы, описанные в патче, это именно то, что я вижу.   -  person Randomblue    schedule 30.05.2012
comment
@Randomblue надеюсь, что это может привести вас к разрешению. Извините, я не мог больше помочь.   -  person Rob Kielty    schedule 30.05.2012


Ответы (1)


Таким образом, в основном есть два способа (плюс один действительно плохой способ), с помощью которых точки останова могут быть реализованы в любой данной комбинации отладчика/платформы:

  1. Используйте некоторые аппаратные возможности («аппаратные точки останова»), чтобы заставить процессор прерываться при достижении определенного адреса. Обычно это ограничивается парой точек останова, если вообще доступно.

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

  3. Пошаговое выполнение всей программы. Этот на самом деле не считается, потому что он ужасно медленный.

Похоже, что ваш отладчик использует только метод № 2 ("программные точки останова"). Суть этого метода в том, что он требует, чтобы программа была доступна для записи, а флэш-память не может быть перезаписана по одной инструкции за раз, поэтому этот метод не будет работать.

person Community    schedule 04.07.2012