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

Вопросы по созданию своего загрузчика для LPC17xx

Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 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 };

 

Но тут надо смотреть какие секции у вас используются и т.п.

но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу.

 

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


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

но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу.

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

 

 

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


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

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

это как раз не проблема - кладется в начало области и все, автоматически будет выравнена.

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


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

Область то тоже должна быть выровнена, причем байт минимум на 256.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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