|
Ремап, вектора прерываний... |
|
|
|
May 30 2010, 15:48
|
Участник

Группа: Участник
Сообщений: 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 насколько я понимаю. Вот и пусть лежит там и выполняется оттуда.
|
|
|
|
|
 |
Ответов
|
Jul 7 2010, 11:48
|

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

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