KRS 1 16 сентября, 2011 Опубликовано 16 сентября, 2011 · Жалоба Можно ли сделать копирование векторов прерываний в другую страницу на этапе линковки загрузчика, скажем по адресу 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 }; Но тут надо смотреть какие секции у вас используются и т.п. но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба но принцип - все скопировать в озу и перейти по вектору старта из таблицы уже в озу. Главное не забывать про выравнивание таблицы прерываний! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 19 сентября, 2011 Опубликовано 19 сентября, 2011 · Жалоба Главное не забывать про выравнивание таблицы прерываний! это как раз не проблема - кладется в начало области и все, автоматически будет выравнена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 20 сентября, 2011 Опубликовано 20 сентября, 2011 · Жалоба Область то тоже должна быть выровнена, причем байт минимум на 256. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться