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

GDB + JLink - плохо работает отладка

Здравствуйте, коллеги.

 

Имеется win10, gnu arm eclipse (нынче gnu mcu eclipse), JLink, STM32F4xx

В комплект gnu arm входят плагин для JLink'а и gdb.

 

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

Где-то видел рекомендации "записывай руками pc и sp после старта отладчика".

 

Запись pc так и работает (полностью автоматически, я ничего нигде не настраивал):

Downloading 452 bytes @ address 0x08000000 - Verified OK
...
Verifying flash   [....................] Done.
Writing register (PC = 0x080017b8)
...
R0 = 00000000, R1 = 00000000, R2 = 00000000, R3 = 00000000
R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 00000000, R11= 00000000
R12= 00000000, R13= 00000000, MSP= 00000000, PSP= 00000000
R14(LR) = 00000000, R15(PC) = 080017B8

 

Но sp автоматически не записывается (и в старом проекте тоже не записывался, всё корректно работало).

 

В таблице векторов указатель наличествует:

8000000: f8 ff 01 20 b9 17 00 08 5d 17 00 08 5d 17 00 08

но, судя по "Writing register (PC = 0x080017b8)", процессор туда и не смотрит...

 

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


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

но, судя по "Writing register (PC = 0x080017b8)", процессор туда и не смотрит...
Отладик вроде берет точку старта из elf, куда она попадает из строки ENTRY(адрес) скрипта линкера. Посмотрел внимательнее: а что вас смущает? У вас в векторах записан адрес 0x080017b9, младший бит указывает, что код в Thumb-режиме и как адресный бит не используется. Про указатель стека не знаю.

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


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

Сергей, я, видимо, невнятно написал.

Прыжок на ResetHandler работает хорошо.

А вот дальше без костыля в этом ResetHandler()

    
asm volatile(" LDR r0, =_estack");
asm volatile(" MSR msp, r0");

...отлаживаться неудобно...

 

Собственно, вопрос: почему оно работало раньше и как это вернуть?

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


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

Сергей, я, видимо, невнятно написал.

Прыжок на ResetHandler работает хорошо.

А вот дальше без костыля в этом ResetHandler()

    
asm volatile(" LDR r0, =_estack");
asm volatile(" MSR msp, r0");

...отлаживаться неудобно...

 

Собственно, вопрос: почему оно работало раньше и как это вернуть?

А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.

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


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

А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.

Работает, спасибо.

 

Но правильное решение - это галка "Pre-run/Restart reset" на вкладке Startup. И почему я её столько времени не замечал...

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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