Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу разобраться с линкером Keil и размещением векторов
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
fmdost
никак не могу передать управление из бутлоадера на основную программу начинающуюся с адреса 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
Цитата(fmdost @ Jun 21 2017, 01:37) *
никак не могу передать управление из бутлоадера на основную программу. Тоесть, переходит из бутлоадера на адрес 0x8002000 исправно, а там в дизасемблере

В стартупе есть такие строчки


ИЧСХ, в __main заходит, а SystemInit нет!

Если руками переставить "стрелочку" на 0x8002100 программа начинает работать корректно.
ЧЗНХ?

ЧЗНХ
почему переходит на 8002000 ?
8002000 = загрузить в указатель стэка
8002004 = адрес куда переходить, то есть на 8002101
fmdost
Цитата(x893 @ Jun 21 2017, 02:45) *
ЧЗНХ
почему переходит на 8002000 ?
8002000 = загрузить в указатель стэка
8002004 = адрес куда переходить, то есть на 8002101


Уже понял что сам дурак. Чуть позже напишу тут как он грузится, себе на память.
esaulenka
Вот так оно работает:

Код
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 ();
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.