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

Читаю даташит на AT91SAM9G20 (раздел 13. AT91SAM9G20 Boot Program) и понять не могу что конкретно должны содержать "ARM exception vectors" и нужны ли они загрузчику (кроме шестого, конечно, в нем ведь размер загружаемой откуда-либо программы)?
Инструкции перехода на процедуры обработки этих самых исключений?

В качестве примера из даташита:
Цитата
13.4.2.1 Example An example of valid vectors follows:
00 ea000006 B 0x20
04 eafffffe B 0x04
08 ea00002f B _main
0c eafffffe B 0x0c
10 eafffffe B 0x10
14 00001234 B 0x14
18 eafffffe B 0x18


Что это за жуткий прыжок на адрес "0xfffffe" во всех векторах?
Почему вектор по адресу 0x00 содержит инструкцию перехода на адрес 0x06?!
Как я понимаю, вектор по адресу 0x08 должен содержать инструкцию перехода на функцию main загрузчика?
Где можно посмотреть на реальный код загрузчика, размещаемого в Serial Flash, NAND и т. д?
DpInRock
Цитата
Как я понимаю, вектор по адресу 0x08 должен содержать инструкцию перехода на функцию main загрузчика?

Во первых, не загрузчика, а загружаемой программы.
Во вторых, он должен быть по адресу 0. Программа стартует сначала, таки.
В третьих, функции main предшествует всегда другая функция, которая инициализирует стеки, переменные и прочая. А уж потом передается управление майн.
В вашем примере это адрес 20.

Все вектора должны быть.
Все они должны быть в виде команды B (как в примере), либо LDR PC (как объясняется в тексте).

Вот когда длина похожа на правду и присутствуют коды нужных команд, принимается решение о загрузке программы и ее запуске.

Реальный пример.

Да все программы одинаковые. Отыщите в том компиляторе, что вы используете некий ассемблерный стартап файл, ключевое слово *startup*.
Там увидите структуру прерываний арм.
Ну а по листингу можно понять куда какие адреса подставляются.
Размер вы должны загонять самостоятельно, как вариант. Если в компиляторе или линкере не обнаружится соответсвующих данной цели способов...

---
PS. Жуткий адрес FFFFFFE - это всего лишь отрицательное смещение, которое требуется для формирования команды, которая зацикливается сама на себя.
koluna
Цитата(DpInRock @ Sep 20 2011, 20:27) *
В третьих, функции main предшествует всегда другая функция, которая инициализирует стеки, переменные и прочая. А уж потом передается управление майн.
В вашем примере это адрес 20.


Хм... расскажите тогда, пожалуйста, что каждый столбец в примере выше значит.
1 - смещение, 2 - команда перехода, 3 - видимо, тип команды (для сведения), 4 - ?
К сожалению компилятора пока у меня нет, с ARM я мало знаком.
Пока сделал только плату sm.gif

Цитата
Все вектора должны быть.
Все они должны быть в виде команды B (как в примере), либо LDR PC (как объясняется в тексте).


То, что вектора должны быть в виде определенных инструкций и должны быть - я понял.
Я не понял, в самой программе всегда ли должны быть обработчики этих самых векторов? sm.gif

Цитата
Да все программы одинаковые. Отыщите в том компиляторе, что вы используете некий ассемблерный стартап файл, ключевое слово *startup*.
Там увидите структуру прерываний арм.


Негде пока отыскивать sad.gif

Цитата
PS. Жуткий адрес FFFFFFE - это всего лишь отрицательное смещение, которое требуется для формирования команды, которая зацикливается сама на себя.


Т. е., векторы, содержащие команды перехода с таким адресом фактически никуда "не указывают" и, если программа в них "залетит", то там и повиснет?

Вообще, посоветуйте, пожалуйста, что можно почитать по процедуре загрузки процессора (информации в даташите мало).
Желательно, конечно, на русском, но можно и на английском.
DpInRock
Цитата
с ARM я мало знаком

Именно с этого надо начинать. И в самую первую очередь изучать структуру векторов.
Цитата
К сожалению компилятора пока у меня нет

Ну так никто не мешает скачать примеры у атмела.
Цитата
Я не понял, в самой программе всегда ли должны быть обработчики этих самых векторов?

Ну если вы не используете прерывания - необязательно. Я например, использую только IRQ вектор.
Таким образом, при возникновении исключения (ничем не маскируемых прерываний) программа улетает в никуда... Но лично меня это не беспокоит. Но whom how..

Цитата
Вообще, посоветуйте, пожалуйста, что можно почитать по процедуре загрузки процессора (информации в даташите мало)

Ну, даташит вполне достаточен. Просто вы не представляете структуру программы как таковую.

Я лично рекомендую скачать примеры и постараться понять их. НУ и побеспокоится о компиляторе. Я использую ИАР. В нем и примеров человеческих есть, и вообще, как-то нравится...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.