Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GDB + JLink - плохо работает отладка
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
esaulenka
Здравствуйте, коллеги.

Имеется 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)", процессор туда и не смотрит...
Сергей Борщ
QUOTE (esaulenka @ May 15 2018, 11:09) *
но, судя по "Writing register (PC = 0x080017b8)", процессор туда и не смотрит...
Отладик вроде берет точку старта из elf, куда она попадает из строки ENTRY(адрес) скрипта линкера. Посмотрел внимательнее: а что вас смущает? У вас в векторах записан адрес 0x080017b9, младший бит указывает, что код в Thumb-режиме и как адресный бит не используется. Про указатель стека не знаю.
esaulenka
Сергей, я, видимо, невнятно написал.
Прыжок на ResetHandler работает хорошо.
А вот дальше без костыля в этом ResetHandler()
Код
    
asm volatile(" LDR r0, =_estack");
asm volatile(" MSR msp, r0");

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

Собственно, вопрос: почему оно работало раньше и как это вернуть?
Timmy
Цитата(esaulenka @ May 15 2018, 14:31) *
Сергей, я, видимо, невнятно написал.
Прыжок на ResetHandler работает хорошо.
А вот дальше без костыля в этом ResetHandler()
Код
    
asm volatile(" LDR r0, =_estack");
asm volatile(" MSR msp, r0");

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

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

А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.
esaulenka
Цитата(Timmy @ May 15 2018, 17:16) *
А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь.

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

Но правильное решение - это галка "Pre-run/Restart reset" на вкладке Startup. И почему я её столько времени не замечал...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.