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

 
 
> Алгоритм работы загрузчика AT91SAM9G20
koluna
сообщение Sep 20 2011, 12:44
Сообщение #1


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



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

Читаю даташит на 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 и т. д?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
DpInRock
сообщение Sep 20 2011, 16:27
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
Как я понимаю, вектор по адресу 0x08 должен содержать инструкцию перехода на функцию main загрузчика?

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

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

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

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

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

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


Сообщение отредактировал DpInRock - Sep 20 2011, 16:29


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
koluna
сообщение Sep 21 2011, 06:05
Сообщение #3


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

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(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 - это всего лишь отрицательное смещение, которое требуется для формирования команды, которая зацикливается сама на себя.


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

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


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Sep 21 2011, 07:44
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
с ARM я мало знаком

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

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

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

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

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

Я лично рекомендую скачать примеры и постараться понять их. НУ и побеспокоится о компиляторе. Я использую ИАР. В нем и примеров человеческих есть, и вообще, как-то нравится...


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:55
Рейтинг@Mail.ru


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