fmdost 0 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба никак не могу передать управление из бутлоадера на основную программу начинающуюся с адреса 0x08002000. Тоесть, переходит из бутлоадера на адрес 0x08002000 исправно, а там в дизасемблере. 0x08002000 0EE0 DCW 0x0EE0 0x08002002 2000 DCW 0x2000 0x08002004 2101 DCW 0x2101 0x08002006 0800 DCW 0x0800 0x08002008 3A89 DCW 0x3A89 0x0800200A 0800 DCW 0x0800 0x0800200C 38B1 DCW 0x38B1 В стартупе есть такие строчки 0x8002100 LDR R0, =SystemInit 0x8002102 BLX R0 0x8002104 LDR R0, =__main 0x8002106 BX R0 ИЧСХ, в __main заходит, а SystemInit нет! Если руками переставить "стрелочку" на 0x8002100 программа начинает работать корректно. ЧЗНХ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба никак не могу передать управление из бутлоадера на основную программу. Тоесть, переходит из бутлоадера на адрес 0x8002000 исправно, а там в дизасемблере В стартупе есть такие строчки ИЧСХ, в __main заходит, а SystemInit нет! Если руками переставить "стрелочку" на 0x8002100 программа начинает работать корректно. ЧЗНХ? ЧЗНХ почему переходит на 8002000 ? 8002000 = загрузить в указатель стэка 8002004 = адрес куда переходить, то есть на 8002101 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fmdost 0 21 июня, 2017 Опубликовано 21 июня, 2017 · Жалоба ЧЗНХ почему переходит на 8002000 ? 8002000 = загрузить в указатель стэка 8002004 = адрес куда переходить, то есть на 8002101 Уже понял что сам дурак. Чуть позже напишу тут как он грузится, себе на память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 22 июня, 2017 Опубликовано 22 июня, 2017 · Жалоба Вот так оно работает: static void StartMain (const void * aAddr) { void (*code_entry)(void); struct StartVector { uint32_t stack_ptr; // stack pointer uint32_t entry_ptr; // code entry pointer }; StartVector *start = (StartVector*) aAddr; // set interrupt vectors SCB->VTOR = (uint32_t)aAddr; // get code entry code_entry = (void (*)(void)) start->entry_ptr; // set stack pointer __set_PSP (start->stack_ptr); // start application code_entry (); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться