Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BootLoader для FreeRTOS
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
vladik
Здравствуйте.

Использую FreeRTOS v6.0.4, проект uIP_Demo, среда IAR. При обычных настройках icf файла проект само собой работает. Бутлодер располагается в начале флешки, основная программа (на базе FreeRTOS) - со смещением 0x2000. В файле at91SAM7X256_FLASH.icf меняю:
define symbol __ICFEDIT_intvec_start__ = 0x00100000;
define symbol __ICFEDIT_region_ROM_start__ = 0x00100040;
на
define symbol __ICFEDIT_intvec_start__ = 0x00102000;
define symbol __ICFEDIT_region_ROM_start__ = 0x00102040;

после запуска шедуллера программа сваливается. Подозреваю что нужно подправить Cstartup.s, помогите разобраться где подправить. Заранее благодарен.
aaarrr
Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит.
Два варианта на выбор:
1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора
2. Сделать ремап и прописать свои вектора в основной программе
vladik
Действительно, улетал в никуда при вызове asm( "SWI 0" ). Правильно ли я понимаю, что при возникновении SWI процессор принудительно переходит на абсолютный адрес 0x8, вне зависимости от того, было ли в icf файле смещение DROMSTART или нет?
Теперь пробую лечить это по первому варианту. В основной программе при переходе на вектор по адресу 0x08, в PC загружался адрес обработчика из ячейки со смещением +24. Соответственно в бутлодере пытаюсь прыгнуть на 0x2000 вперед (в сумме получается 8192+24 = 8216), написал для SWI:

SWI_Handler_Entry:
ldr pc , [pc, #+8216]

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

А как обстоят дела с другими обработчиками (Reset, IRQ, FIQ), неужели тоже придется каждый раз прыгать за пределы бутлодера?
zltigo
QUOTE (vladik @ Jul 6 2010, 10:38) *
ldr pc , [pc, #+8216]
после этого не компилится бутлодер, т.к выходит за пределы DROMEND

Ассемблеру глубоко фиолетово что там в pc в результате получается. А вот сколько бит для непосредственного значения предусмотрено в формате команды - это надо знать. Ну не влезает туда 8216, на что и должен ругаться и ругается Ассемблер.
TU-104
Цитата(aaarrr @ Jul 5 2010, 20:54) *
Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит.
Два варианта на выбор:
1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора
2. Сделать ремап и прописать свои вектора в основной программе

А есть пример ?
Прошу прощения за глупый вопрос. Такая же проблема.
По отдельности работает (freertos c адреса 0x00100000).
Бутлоадер тоже работает, с простыми приложениями (моргание лампочками, уарт, работа с датафлеш).



TU-104
ну кто-то же делал уже это?

Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)
kan35
Прерывания для FreeRTOS должны быть сконфигурированы как все preemptive, делайте это на старте. И не забывайте ремапить таблицу векторов на ваше смещение.
TU-104
Цитата(kan35 @ Mar 16 2014, 08:06) *
И не забывайте ремапить таблицу векторов на ваше смещение.

вот с этим и затык
RabidRabbit
Цитата(TU-104 @ Feb 18 2014, 08:27) *
Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)

Всю прошивку можно не копировать. Достаточно скопировать из основной программы (после ремапа) по адресу 0 "таблицу векторов".
То есть, примерно вот такое:
CODE
; exception vectors
exception_block_start
ldr pc, Reset_Addr
ldr pc, Undef_Addr
ldr pc, SWI_Addr
ldr pc, PAbt_Addr
ldr pc, DAbt_Addr
nop
ldr pc, [pc, #-0xF20] ; go to by IRQ vector
ldr pc, [pc, #-0xF20] ; go to by FIQ vector
exception_vectors
; address map for exeption vectors
Reset_Addr
DCD Reset_Handler
Undef_Addr
DCD Undef_Handler
SWI_Addr
DCD SWI_Handler
PAbt_Addr
DCD PAbt_Handler
DAbt_Addr
DCD DAbt_Handler
exception_block_end
TU-104
Мне, получается, надо сначала заставить работать Free-RTOS cо сделанным ремапом?
В функции AT91F_LowLevelInit поставил BOARD_RemapRam() из примеров board_memories.h
Теперь надо как-то в файле линкера указать "копировать секцию векторов". В комплекте к uIP_Demo_IAR_ARM7 есть файлик только для работы из флеш. Может есть у кого уже готовый?
RabidRabbit
По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру sm.gif Сначала копируете, а потом уже remap.
TU-104
Цитата(RabidRabbit @ May 6 2014, 13:53) *
По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру sm.gif Сначала копируете, а потом уже remap.

Благодарю! Скопировал из флеш в память тупо 0х80 байт (указав в настройках, что память начинается с 0х200080). Всё заработало.

Затем поместил этот бинарник всё во флеш после загрузчика, всё работает. Еще раз огромное спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.