Сыплю голову пеплом, почитал ман на fromelf.exe, пришлось у друзей заимствовать свежую утилиту из 4-го кейла (из моего кейла ключик не поддерживается почему-то), батник изменился на:
C:\Keil\ARM\BIN30\fromelf.exe
--bincombined --output "e:\project\compile\binary.bin" "e:\project\compile\binary.axf"
Теперь нормально бинарник на выходе получаю, но вопрос всё равно остался открытым...
После передачи управления от бутлоадера к пользовательской прошивке (в указанном мной ранее соседнем топике подсказали):
Код
// copy application INTVEC to remapped INTVEC location (start of RAM)
uint32_t const *Src = (uint32_t *)FLASH_USER_START;
uint32_t *Dst = (uint32_t *)AT91C_ISRAM; //RAMSTART
uint_fast8_t Size = 0x40 / sizeof *Dst;
do { *Dst++ = *Src++; } while (--Size);
BOARD_RemapRam();
BL_StartUserApplication = (void(*)(void))0x0;
BL_StartUserApplication();
происходит сброс и снова вход в бутлоадер, вот пошаговое выполнение через j-link, начиная с последней строки кода:
Цитата
J-Link>s
PC: 001014EA
J-Link>s
PC: 00000000
J-Link>s
PC: 00100020
J-Link>s
PC: 00100024
J-Link>
Получается, что по нулевому адресу флэш, то есть ремап в RAM не происходит, так что ли?
Поменял адрес для вызова функции:
Код
BL_StartUserApplication = (void(*)(void))AT91C_ISRAM;
Теперь, поставив точку останова на 0x200000 = AT91C_ISRAM, имею:
Код
J-Link>regs
PC: (R15) = 00200000, CPSR = 00000050 (User mode, ARM FIQ dis.)
R0 = 00101425, R1 = 00100899, R2 = 002007A4, R3 = 00200000
R4 = 00000020, R5 = 001007A9, R6 = 00100475, R7 = 001000F4
USR: R8 =00200008, R9 =A5000001, R10=00206D70, R11 =00000000, R12 =00000000
R13=00207D50, R14=00101431
FIQ: R8 =FFFFF000, R9 =01000000, R10=00000000, R11 =00000002, R12 =00000000
R13=00207FE0, R14=02000000, SPSR=10000057
SVC: R13=00207F70, R14=00100E7F, SPSR=7000007F
ABT: R13=00207FF0, R14=00000000, SPSR=3000001C
IRQ: R13=00207FD0, R14=40000070, SPSR=40000070
UND: R13=00208000, R14=00000000, SPSR=600000DE
J-Link>s
PC: 00102860
J-Link>s
PC: 00102864
J-Link>s
PC: 00102868
Бинго! передал управление на RAM, оттуда перешёл на Reset_Handler (0x00102860), описанный в стандартном кейловском файле SAM7.S
НО: где-то на этапе инициализации происходит сбой (если проект компилировать как самостоятельный без смещения памяти, то всё работает нормально), и я снова попадаю в бутлоадер. Через консоль j-link не получается нормально посмотреть, брейкпоинты почему-то один раз ставятся и потом не удаляются, и новые не ставятся. Буду копаться дальше, конечно. Но как же это муторно!