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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Вопросы по созданию своего загрузчика для LPC17xx
KRS
сообщение Sep 16 2011, 13:10
Сообщение #16


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Vitaliy_ARM @ Sep 16 2011, 16:22) *
Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 0x18000?

Я бы в вашем случае сделал так:
загрузчик пишется как обычно приложение, но только для работы в RAM.
Это можно сделать двумя способами - с помощью __ramfunc и двух таблиц прерываний, но на мой взгляд больно геморно....

Второй вариант переписав стратап код! Для кортекса можно без асма обойтись. Тоже понадобится 2 таблицы прерываний.

Код
// вектора во флеше для первоначального старта
uint32_t const __boot_table[]@".bootvect" =
{
    0x20003FF0, //0
    (uint32_t)bl_main, //1
};

#pragma section=".intvect"
#pragma section=".intvect_init"
#pragma section=".text_init"
static void segment_init(void)
{
    uint32_t *src;
    uint32_t *dst;
    uint32_t len;
    src = __section_begin(".intvect_init");
    len = (uint32_t)__section_end(".text_init");
    len = (len + 3 - (uint32_t)src) & ~3;
    dst = __section_begin(".intvect");
    while(len) {
        *dst++=*src++;
        len-=4;
    }
}

#pragma location=".boot"
__noreturn
void bl_main(void)
{
    segment_init();
              *AT91C_CM3_VTOR = (unsigned)__section_begin(".intvect");
               asm ("ldm r1, {r0,r1}\n"
                     "mov r13, r0\n"
                     "mov r15, r1");
                while(1);
}


А в icf файл добавить
Код
do not initialize { section * };
initialize manually { section .text, section .intvect};

place at start of FLASH { section .bootvect };
place at start of RAM { section .intvect };
place in FLASH          { section .boot*, section .text_init, section .intvect_init};
place in RAM           { readwrite, readonly };


Но тут надо смотреть какие секции у вас используются и т.п.
но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 19 2011, 04:50
Сообщение #17


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(KRS @ Sep 16 2011, 19:10) *
но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу.

Главное не забывать про выравнивание таблицы прерываний!

Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 19 2011, 20:39
Сообщение #18


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Alechek @ Sep 19 2011, 08:50) *
Главное не забывать про выравнивание таблицы прерываний!

это как раз не проблема - кладется в начало области и все, автоматически будет выравнена.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Sep 20 2011, 06:12
Сообщение #19


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Область то тоже должна быть выровнена, причем байт минимум на 256.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:38
Рейтинг@Mail.ru


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