esaulenka 7 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба Здравствуйте, коллеги. Имеется 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)", процессор туда и не смотрит... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба но, судя по "Writing register (PC = 0x080017b8)", процессор туда и не смотрит...Отладик вроде берет точку старта из elf, куда она попадает из строки ENTRY(адрес) скрипта линкера. Посмотрел внимательнее: а что вас смущает? У вас в векторах записан адрес 0x080017b9, младший бит указывает, что код в Thumb-режиме и как адресный бит не используется. Про указатель стека не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба Сергей, я, видимо, невнятно написал. Прыжок на ResetHandler работает хорошо. А вот дальше без костыля в этом ResetHandler() asm volatile(" LDR r0, =_estack"); asm volatile(" MSR msp, r0"); ...отлаживаться неудобно... Собственно, вопрос: почему оно работало раньше и как это вернуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 15 мая, 2018 Опубликовано 15 мая, 2018 · Жалоба Сергей, я, видимо, невнятно написал. Прыжок на ResetHandler работает хорошо. А вот дальше без костыля в этом ResetHandler() asm volatile(" LDR r0, =_estack"); asm volatile(" MSR msp, r0"); ...отлаживаться неудобно... Собственно, вопрос: почему оно работало раньше и как это вернуть? А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 16 мая, 2018 Опубликовано 16 мая, 2018 · Жалоба А зачем голову ломать, добавьте в run/restart commands команду вроде set $sp = *(int*)0x00000000 и наслаждайтесь. Работает, спасибо. Но правильное решение - это галка "Pre-run/Restart reset" на вкладке Startup. И почему я её столько времени не замечал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться