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

Не могу разобраться с линкером Keil и размещением векторов

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

ЧЗНХ?

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


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

никак не могу передать управление из бутлоадера на основную программу. Тоесть, переходит из бутлоадера на адрес 0x8002000 исправно, а там в дизасемблере

 

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

 

 

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

 

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

ЧЗНХ?

ЧЗНХ

почему переходит на 8002000 ?

8002000 = загрузить в указатель стэка

8002004 = адрес куда переходить, то есть на 8002101

 

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


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

ЧЗНХ

почему переходит на 8002000 ?

8002000 = загрузить в указатель стэка

8002004 = адрес куда переходить, то есть на 8002101

 

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

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


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

Вот так оно работает:

 

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 ();
}

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...