|
|
  |
BootLoader для FreeRTOS, sam7x256 |
|
|
|
Jul 5 2010, 14:41
|
Участник

Группа: Участник
Сообщений: 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, помогите разобраться где подправить. Заранее благодарен.
|
|
|
|
|
Jul 6 2010, 07:38
|
Участник

Группа: Участник
Сообщений: 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), неужели тоже придется каждый раз прыгать за пределы бутлодера?
|
|
|
|
|
Feb 11 2014, 05:44
|
Участник

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

|
Цитата(aaarrr @ Jul 5 2010, 20:54)  Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит. Два варианта на выбор: 1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора 2. Сделать ремап и прописать свои вектора в основной программе А есть пример ? Прошу прощения за глупый вопрос. Такая же проблема. По отдельности работает (freertos c адреса 0x00100000). Бутлоадер тоже работает, с простыми приложениями (моргание лампочками, уарт, работа с датафлеш).
|
|
|
|
|
Feb 18 2014, 04:27
|
Участник

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

|
ну кто-то же делал уже это?
Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)
|
|
|
|
|
Apr 1 2014, 07:23
|
Участник

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

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

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
May 6 2014, 06:05
|
Участник

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

|
Мне, получается, надо сначала заставить работать Free-RTOS cо сделанным ремапом? В функции AT91F_LowLevelInit поставил BOARD_RemapRam() из примеров board_memories.h Теперь надо как-то в файле линкера указать "копировать секцию векторов". В комплекте к uIP_Demo_IAR_ARM7 есть файлик только для работы из флеш. Может есть у кого уже готовый?
|
|
|
|
|
May 6 2014, 09:38
|
Участник

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

|
Цитата(RabidRabbit @ May 6 2014, 13:53)  По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру  Сначала копируете, а потом уже remap. Благодарю! Скопировал из флеш в память тупо 0х80 байт (указав в настройках, что память начинается с 0х200080). Всё заработало. Затем поместил этот бинарник всё во флеш после загрузчика, всё работает. Еще раз огромное спасибо.
Сообщение отредактировал TU-104 - May 6 2014, 10:00
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|