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

 
 
 
Reply to this topicStart new topic
> Использование загрузчика.., общие вопросы
Атмег
сообщение Jul 28 2009, 15:10
Сообщение #1


Частый гость
**

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



Есть пара ламерских вопросов по работе загрузчика...

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

2. Если я правильно понимаю, загрузчик копирует образ в SDRAM начиная с адреса,
указанного в #define JUMP_ADDR 0x20000000 /* Final Jump Address */
и переходит по этому адресу? Если я устанавливаю JUMP_ADDR не в начало SDRAM, программа не стартует =/
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 28 2009, 15:17
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



телепаты все в отпуске.....
Какой проц ? какой компилятор ?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jul 28 2009, 15:45
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Похоже AT19SAM9260/RM9200.
Чтобы запускать код с другого адреса, он должен быть собран для этого адреса.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Атмег
сообщение Jul 28 2009, 21:53
Сообщение #4


Частый гость
**

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



а, ну да) AT91SAM9263, компилятор GCC.
загрузчик собираю, указывая в параметре JUMP_ADDR нужный мне адрес..
с PLL главный вопрос: не понятно, почему не меняется частота? я это вижу по времени выполнения программы.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 28 2009, 22:12
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Атмег @ Jul 29 2009, 00:53) *
а, ну да) AT91SAM9263, компилятор GCC.
загрузчик собираю, указывая в параметре JUMP_ADDR нужный мне адрес..
с PLL главный вопрос: не понятно, почему не меняется частота? я это вижу по времени выполнения программы.


Значит в вашей программе вызывается что-то типа low_level_init, где PLL переустанавливается. Вы внимательно изучите структуру вашего startup'a. Или же вообще ваш загрузчик не выполняется.
Go to the top of the page
 
+Quote Post
Атмег
сообщение Jul 29 2009, 07:05
Сообщение #6


Частый гость
**

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



В моей программе стартапа нет, там все понятно как работает. Использую терминал и соответственно конфигурю только его.
Использую bootloader, взятый на сайте atmel. Он явно выполняется, так как моя программа запускается....
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 29 2009, 13:27
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Атмег @ Jul 29 2009, 10:05) *
В моей программе стартапа нет, там все понятно как работает. Использую терминал и соответственно конфигурю только его.
Использую bootloader, взятый на сайте atmel. Он явно выполняется, так как моя программа запускается....


Не видел ни одного компилятора без startup'a. Вы посмотрите map файл вашей программы. Там что, адрес main совпадает со стартовым адресом вашей программы?
Go to the top of the page
 
+Quote Post
Атмег
сообщение Jul 29 2009, 15:21
Сообщение #8


Частый гость
**

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



Цитата(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 и после этого выполняется мой загрузчик?
Поправьте, пожалуйста, где я не правильно понимаю ход процесса.

Надеюсь на понимание, хотелось бы разобраться..
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 29 2009, 21:40
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Вообще из SDRAM и должно работать быстрее, так как в этом случае память сидит на 32-х разрядной шине. Второе - активируйте оба кеша. Получите скачок производительности почти на порядок.
Go to the top of the page
 
+Quote Post
Атмег
сообщение Jul 30 2009, 12:20
Сообщение #10


Частый гость
**

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



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


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

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


Попробую.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 30 2009, 21:15
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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



Попробую.


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

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

Загрузчик из флеша. Это ваш собственный загрузчик?
Go to the top of the page
 
+Quote Post
Атмег
сообщение Jul 31 2009, 16:01
Сообщение #12


Частый гость
**

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



Выяснил следующее: при загрузке самбы частота PCK/MCK устанавливается 200/192, кэш инструкций включен - отсюда разница в скорости в 1.5 раза. Когда включены оба кэша и MMU - в 3.5. Программу загружаю во внутреннюю SRAM.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 31 2009, 16:37
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



PCK/MCK не могут быть 200/192. PCK кратна MCK. Скорее всего PCK = 192 MHz.

Надо понимать, что bootloader устанавливает другие значения. Что за bootloader вы используете? Я в своем загрузчике все частоты задавал сам, инициализировал CS и прочее прочее. Вы сами все должны в нем прописать.
Go to the top of the page
 
+Quote Post
Атмег
сообщение Aug 1 2009, 00:59
Сообщение #14


Частый гость
**

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



Ой да, 200/100 конечно. 200/192 - это PLLA/PLLB.
Так и сделал, в своем стартапе все проинициализировал. Необходимости в загрузчике пока нет, на данном этапе программа помещается в SRAM.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:17
Рейтинг@Mail.ru


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