|
|
  |
ARM926E-S, TCM, remap |
|
|
|
Jun 3 2013, 14:25
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Добрый день! Что-то я совсем запутался. Объясните, пожалуйста, "на пальцах" - как это все происходит. Смаппировать область не проблема, есть специально выделенный регистр. Но как тогда быть с TCM и векторами прерываний? Я пытаюсь включить TCM, переношу вектора в RAM, маппирую RAM в регион 0... и улетаю черт-те знает куда Можно, конечно, мапировать RAM за пределами области TCM, но как быть с векторами? Получается, что из-за конфликта ремапа и TCM памяти у меня все крашится (?) UPD Читать, читать и читать... Магическое слово - бит V в Control Register of System Control CoprocessorПродолжаем упражнения  Из описания CP15 c1 Control RegisterЦитата Exception vector location bit: 1 = vector address range is 0xFFFF0000 to 0xFFFF001C 0 = vector address range is 0x00000000 to 0x0000001C. Все бы хорошо, но при попытке записать вектора в область 0xFFFF0000, проц вообще впадает в ступор, отладчик просто отваливается с матюками Вот что из UM: Цитата The ARM968E-S processor has its exception vectors located at address logic 0. Since flash is the only non-volatile memory available in the LPC29xx, the exception vectors in the flash must be located at address logic 0 at reset (AHB_RST).
After booting a choice must be made for region 0. When enabled, the Tightly Coupled Memories (TCMs) occupy fixed address locations in region 0 то есть приходим к тому же самому. Как включить TCM и при этом сохранить вектора также с адреса 0? Не понимаю, хоть тресни
|
|
|
|
|
Jun 3 2013, 15:02
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Jun 3 2013, 18:30)  А что мешает прописать вектора в TCM? потому что как только отрабатывает этот код, копирующий из Flash вектора в регион 0, я сваливаюсь в Abort Код PRESERVE8
AREA CODE,READONLY
VECTOR_RAM_SRC EQU 0x80000000 VECTOR_FLASH_SRC EQU 0x20000000 VECTOR_DST EQU 0x00000000
EXPORT VectorRemap AREA BlockCopy, CODE, READONLY ; name this block of code
VectorRemap STMFD sp!, {r0, r1, r4-r11}; save registers
LDR r0, =VECTOR_FLASH_SRC; r0 = pointer to source block
LDR r1, =VECTOR_DST ; r1 = pointer to destination block LDMIA r0!, {r4-r11} ; remap first 16 words from 0x20000000 STMIA r1!, {r4-r11} ; to address 0x00000000 for interrupt LDMIA r0!, {r4-r11} ; exception handler STMIA r1!, {r4-r11} LDMFD sp!, {r0, r1, r4-r11}; restore registers
END точнее - сразу после LDMFD
|
|
|
|
|
Jun 3 2013, 15:23
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Jun 3 2013, 19:07)  Если это подпрограмма, то сразу после LDMFD у Вас отсутствует инструкция возврата. понятно, спасибо Код LDMIA R13!,{R4,PC} и вопрос решен PS. Нефиг копипастить
|
|
|
|
|
Jun 3 2013, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Ну, я бы сделал так: Код VectorRemap STMFD sp!, {r4-r9} ; save registers
LDR r0, =VECTOR_FLASH_SRC; r0 = pointer to source block
LDR r1, =VECTOR_DST ; r1 = pointer to destination block LDMIA r0!, {r2-r9} ; remap first 16 words from 0x20000000 STMIA r1!, {r2-r9} ; to address 0x00000000 for interrupt LDMIA r0!, {r2-r9} ; exception handler STMIA r1!, {r2-r9} LDMFD sp!, {r4-r9} ; restore registers MOV pc, lr
|
|
|
|
|
Jun 10 2013, 20:26
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Еще вопрос Exception вектора записаны как Код LDR Reset ... я копирую вектора из области 0x20000000 в 0x00000000 и, конечно, в итоге нифига не получаю перехода на первую команду обработки исключения, ибо она лежит вне диапазона относительного перехода Какой выход? Я так вижу, что собрать аналогичный код, но уже в диапазоне remap, и собрать их скаттером "поближе" Или я бью гору, а шоссе рядом?
|
|
|
|
|
Jun 10 2013, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(toweroff @ Jun 11 2013, 00:26)  Еще вопрос Exception вектора записаны как Код LDR Reset ... Ну, так они точно не могут быть записаны  Можете привести код дословно?
|
|
|
|
|
Jun 10 2013, 21:20
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Jun 11 2013, 00:50)  Ну, так они точно не могут быть записаны  Можете привести код дословно? легко  Код ResetStart LDR PC, ResetAddr LDR PC, CheckUndefined ; UndefinedAddr LDR PC, CheckUndefined ; SWI_Addr LDR PC, CheckPrefetch ; PrefetchAddr LDR PC, CheckAbort ; DataAbortAddr LDR PC, CheckReserved ; ReservedAddr LDR PC, IRQ_Addr ;IRQ_Addr ; IRQ_Addr LDR PC, FIQ_Addr ; FIQ_Addr сейчас (пока  ) все злопыхание с этим вот... это вот - злопыханья Кейла с его стартапом копаю доку на арм и никак не могу понять - там должна (в векторе) быть команда или адрес перехода...
|
|
|
|
|
Jun 10 2013, 21:59
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(aaarrr @ Jun 11 2013, 01:39)  Команда.
ldr pc, XXX - это на самом деле ldr pc, [pc, #offset]. Если переменные с адресами (ResetAddr, CheckUndefined и т.п.) копируются в TCM вместе с векторами, то все должно работать. Просто посмотрите дизассемблер этого куска. конечно посмотрел пободался со скаттером... вроде как поднялось. И началось  то ли память быстрая, то ли что.. устройство должно "кушать" от меня, как от мастера ии2 пока в ITCM не запихал код - все было ок, в том числе и от SRAM на AHB и спать бы, и добить кусок, черт его дери  в и2си все на прерывании, давно все отрегулировано. Перенес код (считай сейчас - в ITCM) - всем кранты...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|