реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не могу разобраться с линкером Keil и размещением векторов, bootloader и вектора прервыаний
fmdost
сообщение Jun 20 2017, 22:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



никак не могу передать управление из бутлоадера на основную программу начинающуюся с адреса 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 программа начинает работать корректно.
ЧЗНХ?
Go to the top of the page
 
+Quote Post
x893
сообщение Jun 20 2017, 23:45
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Цитата(fmdost @ Jun 21 2017, 01:37) *
никак не могу передать управление из бутлоадера на основную программу. Тоесть, переходит из бутлоадера на адрес 0x8002000 исправно, а там в дизасемблере

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


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

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

ЧЗНХ
почему переходит на 8002000 ?
8002000 = загрузить в указатель стэка
8002004 = адрес куда переходить, то есть на 8002101
Go to the top of the page
 
+Quote Post
fmdost
сообщение Jun 21 2017, 01:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



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


Уже понял что сам дурак. Чуть позже напишу тут как он грузится, себе на память.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 22 2017, 11:21
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.02383 секунд с 7
ELECTRONIX ©2004-2016