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

1. Для изменения частоты пытаюсь изменить константы, загружаемые в pll a:
#define PLLA_SETTINGS 0x20CCBF0E //0x20AABF0E
После загрузки в программе читаю значение регистра PLLA и получаю 0x206DBF09 вне зависимости от того, что установил в загрузчике..

2. Если я правильно понимаю, загрузчик копирует образ в SDRAM начиная с адреса,
указанного в #define JUMP_ADDR 0x20000000 /* Final Jump Address */
и переходит по этому адресу? Если я устанавливаю JUMP_ADDR не в начало SDRAM, программа не стартует =/
MALLOY2
телепаты все в отпуске.....
Какой проц ? какой компилятор ?
Dron_Gus
Похоже AT19SAM9260/RM9200.
Чтобы запускать код с другого адреса, он должен быть собран для этого адреса.
Атмег
а, ну да) AT91SAM9263, компилятор GCC.
загрузчик собираю, указывая в параметре JUMP_ADDR нужный мне адрес..
с PLL главный вопрос: не понятно, почему не меняется частота? я это вижу по времени выполнения программы.
sergeeff
Цитата(Атмег @ Jul 29 2009, 00:53) *
а, ну да) AT91SAM9263, компилятор GCC.
загрузчик собираю, указывая в параметре JUMP_ADDR нужный мне адрес..
с PLL главный вопрос: не понятно, почему не меняется частота? я это вижу по времени выполнения программы.


Значит в вашей программе вызывается что-то типа low_level_init, где PLL переустанавливается. Вы внимательно изучите структуру вашего startup'a. Или же вообще ваш загрузчик не выполняется.
Атмег
В моей программе стартапа нет, там все понятно как работает. Использую терминал и соответственно конфигурю только его.
Использую bootloader, взятый на сайте atmel. Он явно выполняется, так как моя программа запускается....
sergeeff
Цитата(Атмег @ Jul 29 2009, 10:05) *
В моей программе стартапа нет, там все понятно как работает. Использую терминал и соответственно конфигурю только его.
Использую bootloader, взятый на сайте atmel. Он явно выполняется, так как моя программа запускается....


Не видел ни одного компилятора без startup'a. Вы посмотрите map файл вашей программы. Там что, адрес main совпадает со стартовым адресом вашей программы?
Атмег
Цитата(sergeeff @ Jul 29 2009, 17:27) *
Не видел ни одного компилятора без startup'a. Вы посмотрите map файл вашей программы. Там что, адрес main совпадает со стартовым адресом вашей программы?


Да, конечно, адрес main не совпадает со стартовым. Я неправильно использую слово стартап.
Попытаюсь описать задачу.
Есть отлаженная на х86 программа, выполняющая некий расчет и выводящая результат в консоль.
Добавляю инициализацию UART и кнопок со светодиодами.
Компилирую ее GCC, в мэйкфайле указываю линкеру файл скрипта, взятый из примера:

CODE

/*------------------------------------------------------------------------------
* Linker script for running in external SDRAM on the AT91SAM9263
*----------------------------------------------------------------------------*/

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(entry)

MEMORY
{
sram (W!RX) : ORIGIN = 0x300000, LENGTH = 0x14000
sdram (W!RX) : ORIGIN = 0x20000000, LENGTH = 0x4000000
}

SECTIONS
{
.fixed :
{
. = ALIGN(4);
_sfixed = .;
*(.text*)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.data)
. = ALIGN(4);
_efixed = .;
} >sdram

.prerelocate : AT (_efixed)
{
. = ALIGN(4);
_sprerelocate = .;
. = ALIGN(4);
_eprerelocate = .;
}

.postrelocate : AT (_efixed + SIZEOF(.prerelocate))
{
. = ALIGN(4);
_spostrelocate = .;
*(.vectors);
*(.ramfunc)
. = ALIGN(4);
_epostrelocate = .;
} >sram

.bss (NOLOAD) : {
_szero = .;
*(.bss)
_ezero = .;
} >sram

_sstack = 0x22000000;
}
end = .;


С помощью самбы загружаю в SDRAM - все работает.
Хочу чтобы программа работала из флэш. Для этого беру бутлоадер, задаю константы

#define IMG_ADDRESS 0x20000 /* Image Address in NandFlash */
#define IMG_SIZE 0x40000 /* Image Size in NandFlash */
#define JUMP_ADDR 0x20000000 /* Final Jump Address */

Записываю во флеш бутлоадер и свою программу. Бутлоадер загружается во внутреннюю SRAM, инициализирует PLL, регистры необходимые для работы с SDRAM, еще что то, после этого копирует программу по указанному адресу из флэш в SDRAM и переходит по этому адресу. Правильно ли я этот момент понимаю?

Далее... программа работает, но медленнее чем при загрузке самбой в SDRAM (меряю по RTC).
Хочу установить частоту. Меняю в бутлоадере константы для регистра PLLA:

#define MASTER_CLOCK (239669000/2) //(199919000/2)
#define PLLA_SETTINGS 0x20CCBF0E //0x20AABF0E
#define PLLB_SETTINGS 0x10483F0E

Ничего не меняется. Читаю в программе регистр AT91C_CKGR_PLLAR - содержиме не зависит от того, что я прописываю в бутлоадере. Почему?? Что я здесь не понимаю?
Второй непонятный момент: если в JUMP_ADDR вместо 0x20000000 пишу 0x23F00000 - программа не загружается.

По моменту начальной загрузки: внутренний загрузчик находит во флэш мой загрузчик (по наличию 8 векторов перехода по исключениям), загружает его в SRAM, делает REMAP и после этого выполняется мой загрузчик?
Поправьте, пожалуйста, где я не правильно понимаю ход процесса.

Надеюсь на понимание, хотелось бы разобраться..
sergeeff
На форуме несколько раз рассказывалось, как правильно устанавливать все частоты для rm9200. Там все не так прямолинейно и тривиально. Посмотрите примеры. Или посмотрите последние варианты примеров от Atmel.

Вообще из SDRAM и должно работать быстрее, так как в этом случае память сидит на 32-х разрядной шине. Второе - активируйте оба кеша. Получите скачок производительности почти на порядок.
Атмег
Цитата(sergeeff @ Jul 30 2009, 01:40) *
Вообще из SDRAM и должно работать быстрее, так как в этом случае память сидит на 32-х разрядной шине.


Так у меня в обоих случаях в SDRAM.. В первом варианте заливаю самбой, во втором - загрузчик из флэши.
Разъясните, если не сложно.

Цитата(sergeeff @ Jul 30 2009, 01:40) *
Второе - активируйте оба кеша. Получите скачок производительности почти на порядок.


Попробую.
sergeeff
Цитата(Атмег @ Jul 30 2009, 15:20) *
Так у меня в обоих случаях в SDRAM.. В первом варианте заливаю самбой, во втором - загрузчик из флэши.
Разъясните, если не сложно.



Попробую.


Для контроля выведите clock процессора поделенный на сколько-нибудь на какую-нибудь доступную ногу процессора и посмотрите осциллографом, что будет за частота. Сразу многое прояснится.

По поводу частоты процессора под samb'ой. Обычно Atmel в своих встроенных загрузчиках частоты использует меньше рабочих для надежности.

Загрузчик из флеша. Это ваш собственный загрузчик?
Атмег
Выяснил следующее: при загрузке самбы частота PCK/MCK устанавливается 200/192, кэш инструкций включен - отсюда разница в скорости в 1.5 раза. Когда включены оба кэша и MMU - в 3.5. Программу загружаю во внутреннюю SRAM.
sergeeff
PCK/MCK не могут быть 200/192. PCK кратна MCK. Скорее всего PCK = 192 MHz.

Надо понимать, что bootloader устанавливает другие значения. Что за bootloader вы используете? Я в своем загрузчике все частоты задавал сам, инициализировал CS и прочее прочее. Вы сами все должны в нем прописать.
Атмег
Ой да, 200/100 конечно. 200/192 - это PLLA/PLLB.
Так и сделал, в своем стартапе все проинициализировал. Необходимости в загрузчике пока нет, на данном этапе программа помещается в SRAM.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.