реклама на сайте
подробности

 
 
 
Closed TopicStart new topic
> Отладка программы под бутлоадер.
maxntf
сообщение Sep 14 2018, 13:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Подскажите как отладчику указать, чтоб он стартовал с определенного адреса?
Читал, что вроде как нужно в скаттер файле определить точку входа через команду ENTRY. Только как это сделать я не знаю, что указывать в ее параметрах?
Или это не то?
Сам файл у меня тот, что предлагается стандартно (с измененной адресацией под бут)
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08005000 0x0000B000  {   ; load region size_region
  ER_IROM1 0x08005000 0x0000B000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x200000C0 0x00001F40  { ; RW data
   .ANY (+RW +ZI)
  }
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 14 2018, 15:24
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я отлаживаю программу без загрузчика, с обычными адресами. А потом ту же программу компилирую под загрузчик, со сдвинутым адресом.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 14 2018, 18:14
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ViKo @ Sep 14 2018, 18:24) *
Я отлаживаю программу без загрузчика, с обычными адресами. А потом ту же программу компилирую под загрузчик, со сдвинутым адресом.
А я заставляю отладчик при запуске/сбросе записать в VTOR адрес начала образа (=начала таблицы векторов) приложения и загрузить в указатель стека число из нулевого вектора приложения, а в PC - число из первого вектора. Но у меня не Кейл. Может и Кейла можно научить такому?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 14 2018, 18:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Sep 14 2018, 21:14) *
Может и Кейла можно научить такому?

ЕМНИП, там скрипт отладчика всё это позволяет сделать.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 14 2018, 18:37
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Да любой отладчик или загрузчик, знающий что такое кортекс, должен иметь скрипт устанавливающий стек и точку входа. А VTOR я обычно в самом приложении устанавливаю значением, которое линкер подставляет. Так надёжнее, мало ли откуда загрузиться придётся.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 14 2018, 19:18
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Может. Кейл может.
Go to the top of the page
 
+Quote Post
x893
сообщение Sep 14 2018, 19:36
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Если бутлоадер корректно всё загружает, то Вы и попадёте на свой Reset_Handler.
Ставьте BP на него или на main().

Или сделайте файл debug.ini примерно такой (F1 поможет)

FUNC void Setup (void) {

SP = _RDWORD(0x08005000); // Setup Stack Pointer
PC = _RDWORD(0x08005004); // Setup Program Counter
XPSR = 0x01000000; // Set Thumb bit
_WDWORD(0xE000ED08, 0x08005000); // Setup Vector Table Offset Register
}

Setup();
LOAD %L INCREMENTAL nocode // load debug info without performing reset
// or
// LOAD %L INCREMENTAL

g,main

Как то так
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 15 2018, 04:30
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(maxntf @ Sep 14 2018, 16:34) *
Подскажите как отладчику указать, чтоб он стартовал с определенного адреса?

Эт зависит от отладчика.
В общем случае смотреть надо скрипты отладчика под каждый конкретный чип.
Например J-Link прежде чем загрузит отладочную версию программы выполняет кучу скриптов.
Там и нейтрализация WDT, и активизация схем тактирования, и операции с памятью и т.д.
Go to the top of the page
 
+Quote Post
maxntf
сообщение Sep 15 2018, 07:10
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Отлаживаю в Keil - ST-Link Debugger.

Попробовал по совету x893 создал файл debug.ini. Похоже это то, что мне нужно. Только там получается что при запуске отладчика, он стартует с 0x08005004, а после reset(в отладчике) уже с 0x08000004.
Помогите пожалуйста допилить этот ini.

Сообщение отредактировал maxntf - Sep 15 2018, 07:28
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 15 2018, 10:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(maxntf @ Sep 15 2018, 10:10) *
Помогите пожалуйста допилить этот ini.

SP=*(int*)0x08000000
PC=*(int*)0x08000004
Go to the top of the page
 
+Quote Post
maxntf
сообщение Sep 15 2018, 11:00
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(scifi @ Sep 15 2018, 13:37) *
SP=*(int*)0x08000000
PC=*(int*)0x08000004


Это куда?
Вот файлик debug.ini
Код
FUNC void Setup (void) {

SP = _RDWORD(0x08005000); // Setup Stack Pointer
PC = _RDWORD(0x08005004); // Setup Program Counter
XPSR = 0x01000000; // Set Thumb bit

}

Setup();
LOAD %L INCREMENTAL nocode // load debug info without performing reset


Там бы дописать что-то типа:
Код
IF(RESET) Setup();


Только возможно ли такое?
У меня сейчас получается что при загрузке отладчика срабатывает функция Setup(), а когда я нажимаю в нем Reset то SP и PC сбрасываются. И получается что нужно перезагружать отладчик.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 15 2018, 11:27
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(maxntf @ Sep 15 2018, 14:00) *
У меня сейчас получается что при загрузке отладчика срабатывает функция Setup(), а когда я нажимаю в нем Reset то SP и PC сбрасываются. И получается что нужно перезагружать отладчик.

Можно в командной строке отладчика вызвать "Setup()".
Кстати, вот что-то интересное пишут.
Go to the top of the page
 
+Quote Post
maxntf
сообщение Sep 15 2018, 12:18
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Цитата(scifi @ Sep 15 2018, 14:27) *
Кстати, вот что-то интересное пишут.

Спасибо! То, что нужно.
Код
FUNC void Setup (void) {

SP = _RDWORD(0x08005000); // Setup Stack Pointer
PC = _RDWORD(0x08005004); // Setup Program Counter
XPSR = 0x01000000; // Set Thumb bit

}

Setup();
LOAD %L INCREMENTAL nocode // load debug info without performing reset

FUNC void OnResetExec(void) {
    Setup();
}


Сообщение отредактировал maxntf - Sep 15 2018, 12:20
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 17:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016