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

BootLoader для FreeRTOS

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

 

Использую 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, помогите разобраться где подправить. Заранее благодарен.

 

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


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

Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит.

Два варианта на выбор:

1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора

2. Сделать ремап и прописать свои вектора в основной программе

 

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


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

Действительно, улетал в никуда при вызове 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), неужели тоже придется каждый раз прыгать за пределы бутлодера?

 

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


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

ldr pc , [pc, #+8216]

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

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

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


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

Падает после запуска шедулера, потому как на векторе SWI какая-нибудь ерунда торчит.

Два варианта на выбор:

1. Обеспечить перенаправление SWI в bootloader'е и оставить его вектора

2. Сделать ремап и прописать свои вектора в основной программе

А есть пример ?

Прошу прощения за глупый вопрос. Такая же проблема.

По отдельности работает (freertos c адреса 0x00100000).

Бутлоадер тоже работает, с простыми приложениями (моргание лампочками, уарт, работа с датафлеш).

 

 

 

 

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


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

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

 

Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)

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


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

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

Изменено пользователем kan35

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


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

Тогда такой вопрос - корректно ли будет просто скопировать в память с адреса 00 всю прошивку из flash, а затем прыгнуть на адрес 00? (после ремапа, когда RAM доступна по адресу 00)

Всю прошивку можно не копировать. Достаточно скопировать из основной программы (после ремапа) по адресу 0 "таблицу векторов".

То есть, примерно вот такое:

; 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

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


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

Мне, получается, надо сначала заставить работать Free-RTOS cо сделанным ремапом?

В функции AT91F_LowLevelInit поставил BOARD_RemapRam() из примеров board_memories.h

Теперь надо как-то в файле линкера указать "копировать секцию векторов". В комплекте к uIP_Demo_IAR_ARM7 есть файлик только для работы из флеш. Может есть у кого уже готовый?

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


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

По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру :) Сначала копируете, а потом уже remap.

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


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

По-моему, проще скопировать "ручками" (самому написать небольшой кусочек кода), чем что-то указывать линкеру :) Сначала копируете, а потом уже remap.

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

 

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

Изменено пользователем TU-104

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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