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

 
 
> Ремап, вектора прерываний...
алексей500
сообщение May 30 2010, 15:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



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

Работаю с контроллером AT91SAM7A3. Объясните, пожалуйста, некоторые вещи. По ходу выполнения стартапа вектора прерывания должны копироваться в RAM, потом происходит ремап. Вот в общем код этот:


CODE
; Copy Exception Vectors to Internal RAM

IF :DEF:RAM_INTVEC
ADR R8, Vectors ; Source
LDR R9, =RAM_BASE ; Destination
LDMIA R8!, {R0-R7} ; Load Vectors
STMIA R9!, {R0-R7} ; Store Vectors
LDMIA R8!, {R0-R7} ; Load Handler Addresses
STMIA R9!, {R0-R7} ; Store Handler Addresses
ENDIF


; Remap on-chip RAM to address 0

MC_BASE EQU 0xFFFFFF00 ; MC Base Address
MC_RCR EQU 0x00 ; MC_RCR Offset

IF :DEF:REMAP
LDR R0, =MC_BASE
MOV R1, #1
STR R1, [R0, #MC_RCR] ; Remap
ENDIF




Так вот. Почему-то этот код пропускается у меня. И в окне дизассемблера вообще нет соответствующих команд. Ну то есть когда тыкаю на команду, то в дизассемблере он никуда не переходит. Смотрю что лежит в RAM, там что-то изменилось, но в основном нули, а должны же быть значения такие же как и во FLASH(ну собственно вектора прерываний)? А вообще, зачем вектора копировать в RAM? До копирования же обработчик RESET лежит во FLASH насколько я понимаю. Вот и пусть лежит там и выполняется оттуда.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nikitoc
сообщение Jul 7 2010, 11:48
Сообщение #2


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Чтобы не плодить похожих тем решил спросить здесь. Я, наконец-то, добрался до написания собственного загрузчика - так как SAM-BA замучила неимоверно. И решил разобраться в этом вопросе досконально. Прочитал с десяток тем в этом и других разделах. Многое понял, но не все, конечно. А именно - для чего нужен ремап (то что он переключает отображение FLASH и RAM на 0х00 - понятно, но для чего конкретно это необходимо)? Я (в общих чертах) так представляю себе реализацию загрузчика:
1. После старта программа расположенная в самом начале FLASH инициализирует основные узлы микропроцессора и определяет требуется ли обновление прошивки (по предопределенным признакам - например, наличию высокого уровня на какой-нибудь ножке. Естественно перед этим эта ножка настраивается должным образом.)
2. Если прошивка требуется - то программа копирует в ОЗУ функцию, которая по какому-нибудь интерфейсу (у меня UART) получает и записывает их во FLASH. (Это необходимо, потому, что нельзя пытаться записывать FLASH и при этом исполнять оттуда программу).
3. Проверяем контрольные суммы (полученную с прошивкой и подсчитанную при записи) и делаем программный RESET.

Поправьте меня если я что-то написал неправильно.
P.S. Растолкуйте еще, пожалуйста, про ремап.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 7 2010, 11:52
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Nikitoc @ Jul 7 2010, 14:48) *
(то что он переключает отображение FLASH и RAM на 0х00 - понятно, но для чего конкретно это необходимо)?
Чтобы поставить на место аппаратных векторов исключений обработчики приложения. Перед ремапом вектора копируются в начало ОЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jul 7 2010, 11:56
Сообщение #4


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(Сергей Борщ @ Jul 7 2010, 14:52) *
Чтобы поставить на место аппаратных векторов исключений обработчики приложения. Перед ремапом вектора копируются в начало ОЗУ.

Я про это читал. Но что это даст, ведь после сброса память все равно отображается на FLASH (я имею в виду FLASH отображается на 0х00)? И как эту "фичу" использовать для реализации загрузчика?

Сообщение отредактировал Nikitoc - Jul 7 2010, 12:01
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 7 2010, 12:33
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Nikitoc @ Jul 7 2010, 15:56) *
И как эту "фичу" использовать для реализации загрузчика?

Основное приложение сможет задействовать свои вектора, если понадобится. Без необходимости делать ремап не следует.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jul 7 2010, 12:51
Сообщение #6


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(aaarrr @ Jul 7 2010, 15:33) *
Без необходимости делать ремап не следует.

А когда эта необходимость может возникнуть? Для чего нужно копировать исключительные вектора в ОЗУ?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- алексей500   Ремап, вектора прерываний...   May 30 2010, 15:48
- - toweroff   А где-то есть что-то типа ? Код#define RAM_INTVEC ...   May 30 2010, 16:48
- - алексей500   Спасибо, что отреагировали. В коде этого нет #def...   May 30 2010, 17:37
|- - aaarrr   Цитата(алексей500 @ May 30 2010, 21:37) Ч...   May 30 2010, 21:10
- - алексей500   Не, чего-то голова уже кипит. Не пойму почему посл...   May 30 2010, 20:54
- - алексей500   Если в скаттере чуток сдвинуть начало IRAM, то всё...   May 30 2010, 22:42
|- - aaarrr   Цитата(алексей500 @ May 31 2010, 02:42) Э...   May 30 2010, 22:52
|- - Сергей Борщ   Цитата(Nikitoc @ Jul 7 2010, 15:51) А ког...   Jul 7 2010, 13:13
- - Nikitoc   Спасибо. Буду переваривать. Правда, не уверен, что...   Jul 7 2010, 13:33


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 19:13
Рейтинг@Mail.ru


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