Jump to content

    

Отладка программы под бутлоадер.

Подскажите как отладчику указать, чтоб он стартовал с определенного адреса?

Читал, что вроде как нужно в скаттер файле определить точку входа через команду 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)
  }
}

Share this post


Link to post
Share on other sites

Я отлаживаю программу без загрузчика, с обычными адресами. А потом ту же программу компилирую под загрузчик, со сдвинутым адресом.

Share this post


Link to post
Share on other sites
Я отлаживаю программу без загрузчика, с обычными адресами. А потом ту же программу компилирую под загрузчик, со сдвинутым адресом.
А я заставляю отладчик при запуске/сбросе записать в VTOR адрес начала образа (=начала таблицы векторов) приложения и загрузить в указатель стека число из нулевого вектора приложения, а в PC - число из первого вектора. Но у меня не Кейл. Может и Кейла можно научить такому?

Share this post


Link to post
Share on other sites
Может и Кейла можно научить такому?

ЕМНИП, там скрипт отладчика всё это позволяет сделать.

Share this post


Link to post
Share on other sites

Да любой отладчик или загрузчик, знающий что такое кортекс, должен иметь скрипт устанавливающий стек и точку входа. А VTOR я обычно в самом приложении устанавливаю значением, которое линкер подставляет. Так надёжнее, мало ли откуда загрузиться придётся.

Share this post


Link to post
Share on other sites

Может. Кейл может.

Share this post


Link to post
Share on other sites

Если бутлоадер корректно всё загружает, то Вы и попадёте на свой 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

 

Как то так

Share this post


Link to post
Share on other sites
Подскажите как отладчику указать, чтоб он стартовал с определенного адреса?

Эт зависит от отладчика.

В общем случае смотреть надо скрипты отладчика под каждый конкретный чип.

Например J-Link прежде чем загрузит отладочную версию программы выполняет кучу скриптов.

Там и нейтрализация WDT, и активизация схем тактирования, и операции с памятью и т.д.

Share this post


Link to post
Share on other sites

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

 

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

Помогите пожалуйста допилить этот ini.

Edited by maxntf

Share this post


Link to post
Share on other sites
Помогите пожалуйста допилить этот ini.

SP=*(int*)0x08000000

PC=*(int*)0x08000004

 

Share this post


Link to post
Share on other sites
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 сбрасываются. И получается что нужно перезагружать отладчик.

Share this post


Link to post
Share on other sites
У меня сейчас получается что при загрузке отладчика срабатывает функция Setup(), а когда я нажимаю в нем Reset то SP и PC сбрасываются. И получается что нужно перезагружать отладчик.

Можно в командной строке отладчика вызвать "Setup()".

Кстати, вот что-то интересное пишут.

Share this post


Link to post
Share on other sites
Кстати, вот что-то интересное пишут.

Спасибо! То, что нужно.

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();
}

Edited by maxntf

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this