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

    

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

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

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

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


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

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

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


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

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


Ссылка на сообщение
Поделиться на другие сайты
Может и Кейла можно научить такому?

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

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


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

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

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


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

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

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


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

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

 

Как то так

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


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

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

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

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

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

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


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

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

 

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

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

Изменено пользователем maxntf

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


Ссылка на сообщение
Поделиться на другие сайты
Помогите пожалуйста допилить этот ini.

SP=*(int*)0x08000000

PC=*(int*)0x08000004

 

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


Ссылка на сообщение
Поделиться на другие сайты
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 сбрасываются. И получается что нужно перезагружать отладчик.

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


Ссылка на сообщение
Поделиться на другие сайты
У меня сейчас получается что при загрузке отладчика срабатывает функция Setup(), а когда я нажимаю в нем Reset то SP и PC сбрасываются. И получается что нужно перезагружать отладчик.

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Кстати, вот что-то интересное пишут.

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация