Я использую Atmel SAM4E-16e на плате Atmel SAM4E-EK. Я написал загрузчик для этой конфигурации. Загрузочный загрузчик получает .bin-файл через UART и записывает его во Flash. Это работает без проблем, я сделал шестигранного дамп, и это было именно то, что я ожидал:Загрузочный загрузчик для Cortex M4 - Перейти к загруженному приложению
- Загрузчик в 0x400000 (Flash-Start Адрес АТ SAM4E)
- My Application на 0x420000
- 0x800000 является флэш-End Адрес
Это C-код:
int main(void){
// Init and downloading the .bin to Flash
binary_exc((void*) 0x420000);
}
int binary_exec(void * vStart){
int i;
// -- Check parameters
// Should be at least 32 words aligned
if ((uint32_t)vStart & 0x7F)
return 1;
Disable_global_interrupt();
// Disable IRQs
for (i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF;
// Clear pending IRQs
for (i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF;
// -- Modify vector table location
// Barriars
__DSB();
__ISB();
// Change the vector table
SCB->VTOR = ((uint32_t)vStart & SCB_VTOR_TBLOFF_Msk);
// Barriars
__DSB();
__ISB();
Enable_global_interrupt();
// -- Load Stack & PC
_binExec(vStart);
return 0;
}
void _binExec (void * l_code_addr){
__asm__ ("mov r1, r0 \n"
"ldr r0, [r1, #4] \n" //I also tryed #5 but that doesn't work, too
"ldr sp, [r1] \n"
"blx r0"
);
}
Но когда я пытаюсь перейти к моему заявлению , приложение не запускается. Код для перехода к программе не является примером Atmel для SAM8X (Cortex M3). Отладчик иногда говорит, что ПК перескакивает на другой адрес (0x004003E2), но не идет дальше.
Я нашел старую тему Bootloader for Cortex M3, где решение было просто добавить одно, но это не работает для меня, даже если я использовал их код. Затем отладчик больше не отвечает.
Я использую Atmel Studio 7 с GCC. Процессор работает в режиме Thumb-Mode.
Надеюсь, вы поможете мне решить эту проблему или дать мне подсказки, что здесь происходит неправильно.
Вам, безусловно, нужно установить lsb регистра '' blx'', или вы попытаетесь выполнить взаимодействие с несуществующим состоянием ARM и жесткой ошибкой. На каком адресе вы пытались добавить его (то есть в какой именно точке этого кода), что еще хуже? – Notlikethat
, если ваш код находится на 0x420000, тогда вы хотите использовать blx для 0x420001, так почему вы читаете инструкцию по адресу 0x420000, а затем пытаетесь перейти на адрес, определенный инструкцией? почему не orr r0, # 1; blx r0? что ваша демонстрация показывает, какой адрес входит в binary_exec? и почему все накладные расходы в binary_exec? вы пытаетесь справиться с любым случаем, был ли запущен код перед тем, как поставить систему в неизвестном состоянии? –
вы можете сделать или из 1 в вызове C на _binExec, тогда bin exec является не более чем blx r0. конечно, если этот код вернет, он вернется после blx, который, вероятно, не тот, который вы хотите. –