Как указать компилятору Arduino IDE количество SRAM ?

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

ATmega128. Подключена микросхема 64Кб внешней памяти SRAM. Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение BOB51 »

Применить соответствующую библиотеку.
Где-то упоминание попадалось... Для платформы на атмега 2560.
8)
Работа с внешней памятью данных отличается только набором адресов и линий управления.
Автоматически будут использованы адреса выше имеющихся в самом МК.
Под ассемблером не вопрос.
А вот для компилятора Си...
Особо ежли цель - заставить компилятор всю память под свои нужды использовать (включая стек),
а не просто данные туда скинуть...
:dont_know:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4053343#p4053343"]Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.[/uquote]
это может поможет:
https://www.rlocman.ru/shem/schematics.html?di=110664
А вот для компилятора Си...
несложно... надо линкеру подсказать:

Код: Выделить всё

-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8030ff
https://www.rlocman.ru/shem/schematics.html?di=71095
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение BOB51 »

Неплохо... но во внешнюю пошли только данные... стек остался во внутренней.
В принципе для ардуинки вполне себе достаточно.
8)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=4053417#p4053417"]но во внешнюю пошли только данные... стек остался во внутренней.[/uquote]
в Цэ можно творить чудеса легким движением:
-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8090ff,--defsym=__stack=0x8010ff
з.ы. а скетчи ардуино можно компилить макефайлом, который дает полное управление тем же линкером
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

Являюсь инженером-электроником. С Си знаком только через скетчи Ардуино ИДЕ. Ничего про мейкфайлы, СИстудии и линкеры не знаю. Напишите пожалуйста просто куда что вписать, чтобы компилятор Ардуино ИДЕ не ругался на превышение размера требуемой оперативной памяти. Служебные структуры типа стека пусть остаются во внутренней памяти. Все пользовательское - в наружу. Это единственное что мне пока надо. С уважением.
ПС. Видимо нужно вставить некий конфигурационный файл в папку со скетчем для компилятора. Где найти инфу как составлять такой файл ?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

чтоб не изучать мэйк файл пока такой вариант (ссылка была уже):
1) добавить распакованные файлы из архива в папку со своим скетчем
xmem.zip
(2.01 КБ) 224 скачивания
2)в скетче использовать так:
Спойлер

Код: Выделить всё

#include <xmem.h>
 
void setup() {
  // initialise the memory
  xmem::begin(false);
}
 
void loop() {
  // declare some pointers into external memory
  int *intptr=reinterpret_cast<int *>(0x2200);
  char *charptr=reinterpret_cast<char *>(0x2200);
 
  // store integers in bank 0
  xmem::setMemoryBank(0,false);
  intptr[0]=1;
  intptr[10000]=2;
  intptr[20000]=3;
 
  // store characters in bank 1
  xmem::setMemoryBank(1,false);
  charptr[0]='a';
  charptr[10000]='b';
  charptr[20000]='c';
 
  delay(1000);
}
з.ы. как добавить в ардуиновом ИДЕ дополнительные параметры линкера не знаю. но вроде можно добавлять флаги типа так:

Код: Выделить всё

Добавьте собственные флаги компилятора в platform.local.txt. Просто создайте его в том же каталоге, где находится platform.txt. Например:

compiler.c.extra_flags=
compiler.c.elf.extra_flags=
compiler.S.extra_flags=
compiler.cpp.extra_flags=-mcall-prologues -fno-split-wide-types -finline-limit=3 -ffast-math
compiler.ar.extra_flags=
compiler.objcopy.eep.extra_flags=
compiler.elf2hex.extra_flags=
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

Прошу прощения. Надо было начинать с другого конца.
Гоняю проект в Протеусе, а он как известно глючит не редко. Модель CPU - ATmega128. Процедура включения интерфейса внешнего ОЗУ

MCUCR |= (1<<SRE); // Разрешить внешний интерфейс ОЗУ
XMCRA = 0; //
//XMCRB |= (1<<XMM1)|(1<<XMM0); // PC7..PC5 released pins
XMCRB = 0; // Нам нужны Все разряды адреса

После исполнения этих команд линии Адреса, #RD, #WR, ALE активизируются. И вроде бы должны сразу работать. Но они никак не действуют при чтении-записи. Толи это глюк модели процессора, толи чего-то не хватает. Процессор как бы продолжает работать на внутренней памяти.
Вложения
Безым.png
(89.01 КБ) 192 скачивания
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

а как чтение-запись сделано (кусочек кода).
Протеус не всесилен:
Спойлер
Features
We believe our simulation models are the most accurate and the most complete on the market today. A
summary of model capabilities is listed below:
• Supports the entire instruction set.
• Supports all port and other I/O pin operations.
• Supports all counter/timers including seperate prescalers, capture compare and PWM modes.
• Supports watchdog timer.
• Supports serial U(S)ART.
• Supports master slave SPI, USI and TWI serial interfaces.
• Supports Analogue-to-Digital Conversion (ADC) and analogue comparator modules in all modes.
• Supports all internal and external interrupt modes.
• Supports internal code and data EEPROM memory inc. code protection and data persistence.
• Internally generated processor clock for performance. Event timing accurate to one clock period.
• Provides internal consistency checks on code (e.g. execution of invalid op-codes, illegal memory accesses,
stack overflow checking, etc.).
• Fully integrated in to the VSM source level debugging system.
• Fully integrated into the Proteus Diagnostic Control System.
Limitations
The following is a listing of known limitations in the current version of the AVR® family:
x Brown-out Reset is not implemented.
x Power supply voltage changing is not supported.
x JTAG and other in-circuit debugging interfaces are not supported.
x External programming of memories is not supported.
x Electrical characteristics dependency of the temperature is not implemented.
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

Обана. Вы имеете в виду предпоследнюю строчку текста под катом ? Не поддерживается программирование внешней памяти. Видимо это оно и есть.
Ммммдя. Протеус не катит. В какой проге есть симулятор вроде Протеуса ? Придется мудрить в реале. Всем большое спасибо.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

Неоднозначно написано, но и не написано что поддерживается. Если протеус купленный - можно разрабам вопрос задать.

под линукс (Debian) есть прекрасный Simulavr
https://crafting.be/2013/09/simulavr-start/
Можно дебиан в виртуалбоксе установить (ISO-диск всего 300мБ) - гораздо быстрее виндовса устанавливается, и даже иксы/вэйланды не потребуются.
Под другие линуксы придется скомпилировать - есть исходник. Должно бы и под виндовс скомпилироваться в MinGW (Msys2).
В виндовс10 сейчас есть WSL(2) - там под внутренней убунтой должно заработать.

Внешнюю память похоже в симулавр симулировать можно:
Execution timing should be nearly accurate, different access times for internal RAM / external RAM / EEPROM and other hardware components are simulated.
https://www.nongnu.org/simulavr/features.html

Можно симулавр и под ардуино пристроить:
Running an Arduino sketch with a simulavr script
http://sgerwk.altervista.org/simulavrsc ... ulate.html
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

Оказалось - просто. Интерфейс внешней памяти, включается при обращении к адресам больше чем 4096. Протеус работает. Но записать и считать в виртуальную микру памяти - не получается. Считанные данные - фигня.

Код: Выделить всё

---
MCUCR |= (1<<SRE);              // External memory interface enable
XMCRA = 0;
XMCRB = 0;                            // Нам нужны Все разряды адреса 
---
byte* mem;                            //
   mem = (byte*)malloc(BUFFER_SIZE);    //
---
// Fill memory incrementing values
int index;
byte Data;   
for(index = 0; index < (BUFFER_SIZE + 1); index++) { 
    mem[index + Offset] = Data;
    Data++       
  }  
// Display memory block   
for(index = 0; index < (BUFFER_SIZE + 1); index++) {
    Serial.print(mem[index + Offset], HEX);
}
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

по картинке и в доке внешняя начинается с адреса 4352 (ATmega128 in non ATmega103 compatibility mode: Memory Configuration A is available)
Изображение
An optional external data SRAM can be used with the ATmega128. This SRAM will occupy an
area in the remaining address locations in the 64K address space. This area starts at the
address following the internal SRAM. The Register file, I/O, Extended I/O and Internal SRAM
occupies the lowest 4352bytes in normal mode, and the lowest 4096bytes in the ATmega103
compatibility mode (Extended I/O not present), so when using 64Kbyte (65536 bytes) of External Memory, 61184bytes of External Memory are available in normal mode, and 61440 bytes in
ATmega103 compatibility mode. See “External Memory Interface” on page 25 for details on how
to take advantage of the external memory map
Аватара пользователя
Ariadna-on-Line
Это не хвост, это антенна
Сообщения: 1479
Зарегистрирован: Вс май 13, 2012 00:01:54

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение Ariadna-on-Line »

Блин, чем дальше тем страшней, толи Протеус, толи код. Затормозил делАями() код - оказалось :
1. При записи адреса равны байту данных. Не меняется байт данных - все пишется в одну ячейку !!!
2. Вызывают подозрение вызывают слишком близкие стробы ALE и #WR - это требует скоростного регистра адреса).
3. При чтении - линии AD0-AD7 не шевелятся вообще. (!!!). Находятся в 1-цах. То есть проц не меняет адреса чтения.

Команда записи - mem[index + Offset] = Data;
Команда чтения - Data = mem[index + Offset];
Этого вообще достаточно ?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

в официальной документации есть пример:
гуглоперевод
Поскольку внешняя память отображается после внутренней памяти, как показано на рисунке 11, только 60 Кбайт внешней памяти доступен по умолчанию (адресное пространство от 0x0000 до 0x10FF зарезервировано для внутренней памяти). Однако можно использовать всю внешнюю память, маскирование старших бит адреса до нуля. Это можно сделать с помощью битов XMMn и управления программно наиболее значимые биты адреса. Установив порт C на выход 0x00 и высвободив наиболее значимые биты для нормальной работы вывода порта, интерфейс памяти будет адресовать 0x0000 - 0x1FFF. См. следующие примеры кода
C Code Example

Код: Выделить всё

#define OFFSET 0x2000
void XRAM_example(void)
{
  unsigned char *p = (unsigned char *) (OFFSET + 1);
  DDRC = 0xFF;
  PORTC = 0x00;
  XMCRB = (1<<XMM1) | (1<<XMM0);
  *p = 0xaa;
  XMCRB = 0x00;
  *p = 0x55;
}
з.ы. в протеусе можно поглядеть дамп памяти, после выполнения этого примера (если он выполнится конечно)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение BOB51 »

ГЫММ....oleg110592
Насчет использования ВПД...
А если без макефайлов, а только malloс?
Или непосредственно заданный адрес указателя на переменную...
:roll:

Касательно режимов ВПД у АВРок...
Там множество вариантов в настройках стробов и времени доступа - надо внимательно документацию смотреть.
Не мешает узнать не установлен ли "режим совместимости с мегой 103"...
Дополнительно смотрим документацию на кристалл используемого ОЗУ (время доступа).
Стандартный регистр защелки младшего адреса там как и у mcs51 - К1533ИР33(74HC573).
Второе - как монтаж выполнен - качество линий влияет на скорость обмена.
8)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=4054487#p4054487"]ГЫММ....oleg110592
ВПД... А если без макефайлов, а только malloс?[/uquote]
(ВПД)Воинские перевозочные документы?
malloс обсуждалось - все равно надо каким то образом указать. В ардуино иде, как выше показано, есть способ (не проверено).
Переменные __malloc_heap_start и __malloc_heap_end могут использоваться для ограничения функции malloc(), чтобы она работала в определенной области памяти. Эти переменные статически инициализируются для указания на начало кучи __heap_start и конец кучи __heap_end соответственно, where __heap_start заполняется линкером для указания области вне .bss, и __heap_end устанавливается в 0, чем подразумевается для malloc(), что куча находится ниже стека (стек расположен в более старших адресах, чем куча).

Если куча перенесена в external RAM, то __malloc_heap_end должна быть настроена соответствующим образом. Это можно сделать либо во время выполнения кода (run-time), путем записи значения в эту переменную, или это может быть реализовано автоматически во время линковки (link-time), путем настройки значения символа __heap_end.
http://microsin.net/programming/avr/avr ... alloc.html
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение BOB51 »

Чего язвимс то?
Внешняя Память Данных
8)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение oleg110592 »

Опять домыслы. Язвят на развлекательных форумах, а тут требуется уточнение. У mega128 по документации External Memory Interface.
With all the features the External Memory Interface provides, it is well suited to operate as an
interface to memory devices such as External SRAM and Flash, and peripherals such as LCDdisplay, A/D, and D/A.
т.е. не только память данных можно подключать, а и флэш и пр. периферию...
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как указать компилятору Arduino IDE количество SRAM ?

Сообщение BOB51 »

По старому - доброму Устройства Ввода-Вывода, отображенные на пространство Внешней Памяти Данных.
Попривыкали все на ШПИК ИНГЛИШ, забывая с чего начинали.
8)
Ответить

Вернуться в «Arduino»