|
|
  |
слинковать данные во внешнюю ОЗУ, на Olimex LPC-E2214 IAR 4.31 |
|
|
|
Apr 28 2007, 14:00
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Попытался использовать в качестве ОЗУ внешнюю память на плате. Тупо поменяв в xcl файле адреса внутренней памяти на внешнюю, получил то, что контроллер вообще перестал стартовать. (пробовал разные варианты данные, стек, данные+стек) Я так понимаю проблема в том что доступ к данной памяти 32 битный(адресные разряды A0, A1 не используются. см. схему)??? И получается её можно использовать, только как некий контейнер, руками копируя туда и руками считывая по тексту программы. А так чтобы компилятор использовал её при линковке получается сделать нельзя или можно? Код //************************************************************************* // Read/write segments mapped to RAM. //*************************************************************************
-DRAMSTART=40000000 -DRAMEND=40003FFF
-DEXTRAMSTART=81000000 -DEXTRAMEND=810FFFFF
//************************************************ // Data segments. //************************************************
//-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND -Z(DATA)DATA_I,DATA_Z,DATA_N=EXTRAMSTART-EXTRAMEND
-Z(DATA)CODE_I=RAMSTART-RAMEND -QCODE_I=CODE_ID
//************************************************************************* // Stack and heap segments. //*************************************************************************
-D_CSTACK_SIZE=2000 // -D_SVC_STACK_SIZE=10 -D_IRQ_STACK_SIZE=100 -D_HEAP_SIZE=2000
//-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND //// -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND //-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE,HEAP+_HEAP_SIZE=RAMSTART-RAMEND
-Z(DATA)CSTACK+_CSTACK_SIZE=EXTRAMSTART-EXTRAMEND // -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=EXTRAMSTART-EXTRAMEND -Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE,HEAP+_HEAP_SIZE=EXTRAMSTART-EXTRAMEND схема платы
|
|
|
|
|
Apr 28 2007, 14:27
|

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

|
Цитата(xelax @ Apr 28 2007, 13:00)  Тупо поменяв в xcl файле адреса внутренней памяти на внешнюю, получил то, что контроллер вообще перестал стартовать. (пробовал разные варианты данные, стек, данные+стек)
Я так понимаю проблема в том что доступ к данной памяти 32 битный Нет. Проблема в том, что надо проинициализировать контроллер внешней памяти перед работой с ней. Память может быть 8-.16-,32-битной, это не принципиально, ширина адресной шины указывается контроллеру (EMC) и он сам делает необходимое количество обращений. Но обратите внимание, что поскольку у вас стек во внешнем ОЗУ, проинициализировать EMC надо до использования стека. А поскольку глобальные переменные обнуляются перед входом в main(), то и в случае с данными во внешнем ОЗУ EMC тоже должен быть проинициализирован до инициализации данных. В IAR это можно сделать, разместив инициализацию EMC в функции __low_level_init, которая вызывается из cstartup сразу после старта. В остальном все прекрасно работает. Если вы собиратесть и отлаживаемый код занести во внешнее ОЗУ, то надо дополнительно настройку EMC делать в .mac в функции execUserPreload()
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 28 2007, 15:32
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
в принципе понятно в каком направлении двигаться, кавалерийским наскоком не получилось одолеть. Но возникло ещё парочка вопросов. В Olimexовском примере они EMC инициализируют уже в программе. __low_level_init я что-то не нашёл, может плохо искал ещё погляжу. По поводу mac файлов то они нужны только для отладки получается? Что-то нигде не нашёл как их подключить, кроме как в Debugger настройках проекта. Гигантский  Сергею Борщу  . Заработало. Буду дальше изучать матчасть.
|
|
|
|
|
Apr 29 2007, 18:23
|

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

|
Цитата(Dron_Gus @ Apr 28 2007, 22:36)  А как быть с вызовом функции? Ведь при вызове тоже используется стек... Или я что-то недопонимаю? Конкретно в ARM для хранения адреса возврата из подпрограмм используется регистр LR, а вот сама функция действительно использует стек. Получается, что если надо разместить стек во внешнем ОЗУ, то надо подключать свой cstartup взамен библиотечного (один из тех 0.01% случаев) и в нем инициализировать EMC. Цитата(xelax @ Apr 28 2007, 15:32)  __low_level_init я что-то не нашёл, может плохо искал ещё погляжу. пошукайте в хелпе на компилятор. Цитата(xelax @ Apr 28 2007, 15:32)  По поводу mac файлов то они нужны только для отладки получается? Что-то нигде не нашёл как их подключить, кроме как в Debugger настройках проекта. Да, это макросы, которые исполняет отладчик (или симулятор) в определенные моменты (описание есть в Embedded Workbench Users guide).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 2 2007, 07:41
|

Знающий
   
Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206

|
пример mac файла. Это для Olimex E2294. Код execUserPreload() {
__message "*** setup.mac *** Setup default value in VIC\n"; // Disable all IRQ in VIC __writeMemory32(0xFFFFFFFF, 0xFFFFF014, "Memory"); // VICIntEnClear=0xFFFFFFFF // Reset all IRQ Addr in VIC __writeMemory32(0x00000000, 0xFFFFF034,"Memory"); // VICDefVectAddr, __writeMemory32(0x00000000, 0xFFFFF100,"Memory"); // VICVectAddr0, __writeMemory32(0x00000000, 0xFFFFF104,"Memory"); // VICVectAddr1, __writeMemory32(0x00000000, 0xFFFFF108,"Memory"); // VICVectAddr2, __writeMemory32(0x00000000, 0xFFFFF10C,"Memory"); // VICVectAddr3, __writeMemory32(0x00000000, 0xFFFFF110,"Memory"); // VICVectAddr4, __writeMemory32(0x00000000, 0xFFFFF114,"Memory"); // VICVectAddr5, __writeMemory32(0x00000000, 0xFFFFF118,"Memory"); // VICVectAddr6, __writeMemory32(0x00000000, 0xFFFFF11C,"Memory"); // VICVectAddr7, __writeMemory32(0x00000000, 0xFFFFF120,"Memory"); // VICVectAddr8, __writeMemory32(0x00000000, 0xFFFFF124,"Memory"); // VICVectAddr9, __writeMemory32(0x00000000, 0xFFFFF128,"Memory"); // VICVectAddr10, __writeMemory32(0x00000000, 0xFFFFF12C,"Memory"); // VICVectAddr11, __writeMemory32(0x00000000, 0xFFFFF130,"Memory"); // VICVectAddr12, __writeMemory32(0x00000000, 0xFFFFF134,"Memory"); // VICVectAddr13, __writeMemory32(0x00000000, 0xFFFFF138,"Memory"); // VICVectAddr14, __writeMemory32(0x00000000, 0xFFFFF13C,"Memory"); // VICVectAddr15, // Reset all IRQ Cntl in VIC __writeMemory32(0x00000000, 0xFFFFF200,"Memory"); // VICVectCntl0, __writeMemory32(0x00000000, 0xFFFFF204,"Memory"); // VICVectCntl1, __writeMemory32(0x00000000, 0xFFFFF208,"Memory"); // VICVectCntl2, __writeMemory32(0x00000000, 0xFFFFF20C,"Memory"); // VICVectCntl3, __writeMemory32(0x00000000, 0xFFFFF210,"Memory"); // VICVectCntl4, __writeMemory32(0x00000000, 0xFFFFF214,"Memory"); // VICVectCntl5, __writeMemory32(0x00000000, 0xFFFFF218,"Memory"); // VICVectCntl6, __writeMemory32(0x00000000, 0xFFFFF21C,"Memory"); // VICVectCntl7, __writeMemory32(0x00000000, 0xFFFFF220,"Memory"); // VICVectCntl8, __writeMemory32(0x00000000, 0xFFFFF224,"Memory"); // VICVectCntl9, __writeMemory32(0x00000000, 0xFFFFF228,"Memory"); // VICVectCntl10, __writeMemory32(0x00000000, 0xFFFFF22C,"Memory"); // VICVectCntl11, __writeMemory32(0x00000000, 0xFFFFF230,"Memory"); // VICVectCntl12, __writeMemory32(0x00000000, 0xFFFFF234,"Memory"); // VICVectCntl13, __writeMemory32(0x00000000, 0xFFFFF238,"Memory"); // VICVectCntl14, __writeMemory32(0x00000000, 0xFFFFF23C,"Memory"); // VICVectCntl15,
__message "*** setup.mac *** Setup EMC, do external RAM config\n"; // SRAM 32bit; IDCY = 0; WST1 = 0; RBLE = 1; WST2 = 0 __writeMemory32(0x20000400, 0xFFE00004, "Memory"); // BCFG1=0x20000400
// P1.26 : P1.31 - JTAG // P2.0 : P2.31 - Data bus // P3.1 : P3.22 - Address bus // P1.0 - CS0 (Flash) // P3.26 - CS1 (RAM) // P3.31 - BLS0 // P3.30 - BLS1 // P3.29 - BLS2 // P3.28 - BLS3 // P3.26 - WE // P1.1 - OE //PINSEL2 = 0000 1111 0000 0000 0000 1001 0010 0100 __writeMemory32(0x0F000924, 0xE002C014, "Memory"); // PINSEL2 = 0x0F000924;
__message "*** setup.mac *** Do ISR vectors remap to internal RAM 0x40000000 \n"; __writeMemory32(0x00000002, 0xE01FC040, "Memory"); // MEMMAP = 2 }
--------------------
Пасу котов...
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|