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

 
 
 
Reply to this topicStart new topic
> слинковать данные во внешнюю ОЗУ, на Olimex LPC-E2214 IAR 4.31
xelax
сообщение Apr 28 2007, 14:00
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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


схема платы
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2007, 14:27
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
xelax
сообщение Apr 28 2007, 15:32
Сообщение #3


Местный
***

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



в принципе понятно в каком направлении двигаться, кавалерийским наскоком не получилось одолеть.

Но возникло ещё парочка вопросов. В Olimexовском примере они EMC инициализируют уже в программе.
__low_level_init я что-то не нашёл, может плохо искал ещё погляжу. По поводу mac файлов то они нужны только для отладки получается? Что-то нигде не нашёл как их подключить, кроме как в Debugger настройках проекта.

Гигантский a14.gif Сергею Борщу cheers.gif . Заработало.

Буду дальше изучать матчасть.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 28 2007, 22:36
Сообщение #4


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Сергей Борщ @ Apr 28 2007, 15:27) *
Но обратите внимание, что поскольку у вас стек во внешнем ОЗУ, проинициализировать EMC надо до использования стека. А поскольку глобальные переменные обнуляются перед входом в main(), то и в случае с данными во внешнем ОЗУ EMC тоже должен быть проинициализирован до инициализации данных. В IAR это можно сделать, разместив инициализацию EMC в функции __low_level_init, которая вызывается из cstartup сразу после старта.


А как быть с вызовом функции? Ведь при вызове тоже используется стек... Или я что-то недопонимаю?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 29 2007, 18:23
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение May 2 2007, 07:41
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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
}


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

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

 


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


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