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

 
 
 
Reply to this topicStart new topic
> BootLoader для FreeRTOS, sam7x256
vladik
сообщение Jul 5 2010, 14:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-05-06
Пользователь №: 17 226



Здравствуйте.

Использую 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, помогите разобраться где подправить. Заранее благодарен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 5 2010, 14:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит.
Два варианта на выбор:
1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора
2. Сделать ремап и прописать свои вектора в основной программе
Go to the top of the page
 
+Quote Post
vladik
сообщение Jul 6 2010, 07:38
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 18-05-06
Пользователь №: 17 226



Действительно, улетал в никуда при вызове 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), неужели тоже придется каждый раз прыгать за пределы бутлодера?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 6 2010, 08:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Ассемблеру глубоко фиолетово что там в pc в результате получается. А вот сколько бит для непосредственного значения предусмотрено в формате команды - это надо знать. Ну не влезает туда 8216, на что и должен ругаться и ругается Ассемблер.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
TU-104
сообщение Feb 11 2014, 05:44
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



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

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



Go to the top of the page
 
+Quote Post
TU-104
сообщение Feb 18 2014, 04:27
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



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

Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)
Go to the top of the page
 
+Quote Post
kan35
сообщение Mar 16 2014, 02:06
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Прерывания для FreeRTOS должны быть сконфигурированы как все preemptive, делайте это на старте. И не забывайте ремапить таблицу векторов на ваше смещение.

Сообщение отредактировал kan35 - Mar 16 2014, 02:07
Go to the top of the page
 
+Quote Post
TU-104
сообщение Apr 1 2014, 07:23
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Цитата(kan35 @ Mar 16 2014, 08:06) *
И не забывайте ремапить таблицу векторов на ваше смещение.

вот с этим и затык
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Apr 1 2014, 07:45
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Цитата(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
Go to the top of the page
 
+Quote Post
TU-104
сообщение May 6 2014, 06:05
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Мне, получается, надо сначала заставить работать Free-RTOS cо сделанным ремапом?
В функции AT91F_LowLevelInit поставил BOARD_RemapRam() из примеров board_memories.h
Теперь надо как-то в файле линкера указать "копировать секцию векторов". В комплекте к uIP_Demo_IAR_ARM7 есть файлик только для работы из флеш. Может есть у кого уже готовый?
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение May 6 2014, 07:53
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру sm.gif Сначала копируете, а потом уже remap.
Go to the top of the page
 
+Quote Post
TU-104
сообщение May 6 2014, 09:38
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 10-12-08
Пользователь №: 42 354



Цитата(RabidRabbit @ May 6 2014, 13:53) *
По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру sm.gif Сначала копируете, а потом уже remap.

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

Затем поместил этот бинарник всё во флеш после загрузчика, всё работает. Еще раз огромное спасибо.

Сообщение отредактировал TU-104 - May 6 2014, 10:00
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 13:57
Рейтинг@Mail.ru


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