Как указать компилятору Arduino IDE количество SRAM ?
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1479
- Зарегистрирован: Вс май 13, 2012 00:01:54
Как указать компилятору Arduino IDE количество SRAM ?
ATmega128. Подключена микросхема 64Кб внешней памяти SRAM. Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.
Re: Как указать компилятору Arduino IDE количество SRAM ?
Применить соответствующую библиотеку.
Где-то упоминание попадалось... Для платформы на атмега 2560.
Работа с внешней памятью данных отличается только набором адресов и линий управления.
Автоматически будут использованы адреса выше имеющихся в самом МК.
Под ассемблером не вопрос.
А вот для компилятора Си...
Особо ежли цель - заставить компилятор всю память под свои нужды использовать (включая стек),
а не просто данные туда скинуть...

Где-то упоминание попадалось... Для платформы на атмега 2560.
Работа с внешней памятью данных отличается только набором адресов и линий управления.
Автоматически будут использованы адреса выше имеющихся в самом МК.
Под ассемблером не вопрос.
А вот для компилятора Си...
Особо ежли цель - заставить компилятор всю память под свои нужды использовать (включая стек),
а не просто данные туда скинуть...
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4053343#p4053343"]Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.[/uquote]
это может поможет:
https://www.rlocman.ru/shem/schematics.html?di=110664
https://www.rlocman.ru/shem/schematics.html?di=71095
это может поможет:
https://www.rlocman.ru/shem/schematics.html?di=110664
несложно... надо линкеру подсказать:А вот для компилятора Си...
Код: Выделить всё
-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8030ffRe: Как указать компилятору Arduino IDE количество SRAM ?
Неплохо... но во внешнюю пошли только данные... стек остался во внутренней.
В принципе для ардуинки вполне себе достаточно.

В принципе для ардуинки вполне себе достаточно.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[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 ?
Являюсь инженером-электроником. С Си знаком только через скетчи Ардуино ИДЕ. Ничего про мейкфайлы, СИстудии и линкеры не знаю. Напишите пожалуйста просто куда что вписать, чтобы компилятор Ардуино ИДЕ не ругался на превышение размера требуемой оперативной памяти. Служебные структуры типа стека пусть остаются во внутренней памяти. Все пользовательское - в наружу. Это единственное что мне пока надо. С уважением.
ПС. Видимо нужно вставить некий конфигурационный файл в папку со скетчем для компилятора. Где найти инфу как составлять такой файл ?
ПС. Видимо нужно вставить некий конфигурационный файл в папку со скетчем для компилятора. Где найти инфу как составлять такой файл ?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
чтоб не изучать мэйк файл пока такой вариант (ссылка была уже):
1) добавить распакованные файлы из архива в папку со своим скетчем 2)в скетче использовать так:
з.ы. как добавить в ардуиновом ИДЕ дополнительные параметры линкера не знаю. но вроде можно добавлять флаги типа так:
1) добавить распакованные файлы из архива в папку со своим скетчем 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 ?
Прошу прощения. Надо было начинать с другого конца.
Гоняю проект в Протеусе, а он как известно глючит не редко. Модель CPU - ATmega128. Процедура включения интерфейса внешнего ОЗУ
MCUCR |= (1<<SRE); // Разрешить внешний интерфейс ОЗУ
XMCRA = 0; //
//XMCRB |= (1<<XMM1)|(1<<XMM0); // PC7..PC5 released pins
XMCRB = 0; // Нам нужны Все разряды адреса
После исполнения этих команд линии Адреса, #RD, #WR, ALE активизируются. И вроде бы должны сразу работать. Но они никак не действуют при чтении-записи. Толи это глюк модели процессора, толи чего-то не хватает. Процессор как бы продолжает работать на внутренней памяти.
Гоняю проект в Протеусе, а он как известно глючит не редко. Модель 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 ?
а как чтение-запись сделано (кусочек кода).
Протеус не всесилен:
Протеус не всесилен:
Спойлер
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 ?
Обана. Вы имеете в виду предпоследнюю строчку текста под катом ? Не поддерживается программирование внешней памяти. Видимо это оно и есть.
Ммммдя. Протеус не катит. В какой проге есть симулятор вроде Протеуса ? Придется мудрить в реале. Всем большое спасибо.
Ммммдя. Протеус не катит. В какой проге есть симулятор вроде Протеуса ? Придется мудрить в реале. Всем большое спасибо.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
Неоднозначно написано, но и не написано что поддерживается. Если протеус купленный - можно разрабам вопрос задать.
под линукс (Debian) есть прекрасный Simulavr
https://crafting.be/2013/09/simulavr-start/
Можно дебиан в виртуалбоксе установить (ISO-диск всего 300мБ) - гораздо быстрее виндовса устанавливается, и даже иксы/вэйланды не потребуются.
Под другие линуксы придется скомпилировать - есть исходник. Должно бы и под виндовс скомпилироваться в MinGW (Msys2).
В виндовс10 сейчас есть WSL(2) - там под внутренней убунтой должно заработать.
Внешнюю память похоже в симулавр симулировать можно:
Можно симулавр и под ардуино пристроить:
Running an Arduino sketch with a simulavr script
http://sgerwk.altervista.org/simulavrsc ... ulate.html
под линукс (Debian) есть прекрасный Simulavr
https://crafting.be/2013/09/simulavr-start/
Можно дебиан в виртуалбоксе установить (ISO-диск всего 300мБ) - гораздо быстрее виндовса устанавливается, и даже иксы/вэйланды не потребуются.
Под другие линуксы придется скомпилировать - есть исходник. Должно бы и под виндовс скомпилироваться в MinGW (Msys2).
В виндовс10 сейчас есть WSL(2) - там под внутренней убунтой должно заработать.
Внешнюю память похоже в симулавр симулировать можно:
https://www.nongnu.org/simulavr/features.htmlExecution timing should be nearly accurate, different access times for internal RAM / external RAM / EEPROM and other hardware components are simulated.
Можно симулавр и под ардуино пристроить:
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 ?
Оказалось - просто. Интерфейс внешней памяти, включается при обращении к адресам больше чем 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 ?
по картинке и в доке внешняя начинается с адреса 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 ?
Блин, чем дальше тем страшней, толи Протеус, толи код. Затормозил делАями() код - оказалось :
1. При записи адреса равны байту данных. Не меняется байт данных - все пишется в одну ячейку !!!
2. Вызывают подозрение вызывают слишком близкие стробы ALE и #WR - это требует скоростного регистра адреса).
3. При чтении - линии AD0-AD7 не шевелятся вообще. (!!!). Находятся в 1-цах. То есть проц не меняет адреса чтения.
Команда записи - mem[index + Offset] = Data;
Команда чтения - Data = mem[index + Offset];
Этого вообще достаточно ?
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 ?
в официальной документации есть пример:
гуглоперевод
з.ы. в протеусе можно поглядеть дамп памяти, после выполнения этого примера (если он выполнится конечно)
гуглоперевод
C Code ExampleПоскольку внешняя память отображается после внутренней памяти, как показано на рисунке 11, только 60 Кбайт внешней памяти доступен по умолчанию (адресное пространство от 0x0000 до 0x10FF зарезервировано для внутренней памяти). Однако можно использовать всю внешнюю память, маскирование старших бит адреса до нуля. Это можно сделать с помощью битов XMMn и управления программно наиболее значимые биты адреса. Установив порт C на выход 0x00 и высвободив наиболее значимые биты для нормальной работы вывода порта, интерфейс памяти будет адресовать 0x0000 - 0x1FFF. См. следующие примеры кода
Код: Выделить всё
#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;
}Re: Как указать компилятору Arduino IDE количество SRAM ?
ГЫММ....oleg110592
Насчет использования ВПД...
А если без макефайлов, а только malloс?
Или непосредственно заданный адрес указателя на переменную...
Касательно режимов ВПД у АВРок...
Там множество вариантов в настройках стробов и времени доступа - надо внимательно документацию смотреть.
Не мешает узнать не установлен ли "режим совместимости с мегой 103"...
Дополнительно смотрим документацию на кристалл используемого ОЗУ (время доступа).
Стандартный регистр защелки младшего адреса там как и у mcs51 - К1533ИР33(74HC573).
Второе - как монтаж выполнен - качество линий влияет на скорость обмена.

Насчет использования ВПД...
А если без макефайлов, а только malloс?
Или непосредственно заданный адрес указателя на переменную...
Касательно режимов ВПД у АВРок...
Там множество вариантов в настройках стробов и времени доступа - надо внимательно документацию смотреть.
Не мешает узнать не установлен ли "режим совместимости с мегой 103"...
Дополнительно смотрим документацию на кристалл используемого ОЗУ (время доступа).
Стандартный регистр защелки младшего адреса там как и у mcs51 - К1533ИР33(74HC573).
Второе - как монтаж выполнен - качество линий влияет на скорость обмена.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[uquote="BOB51",url="/forum/viewtopic.php?p=4054487#p4054487"]ГЫММ....oleg110592
ВПД... А если без макефайлов, а только malloс?[/uquote]
(ВПД)Воинские перевозочные документы?
malloс обсуждалось - все равно надо каким то образом указать. В ардуино иде, как выше показано, есть способ (не проверено).
ВПД... А если без макефайлов, а только malloс?[/uquote]
(ВПД)Воинские перевозочные документы?
malloс обсуждалось - все равно надо каким то образом указать. В ардуино иде, как выше показано, есть способ (не проверено).
http://microsin.net/programming/avr/avr ... alloc.htmlПеременные __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.
Re: Как указать компилятору Arduino IDE количество SRAM ?
Чего язвимс то?
Внешняя Память Данных

Внешняя Память Данных
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
Опять домыслы. Язвят на развлекательных форумах, а тут требуется уточнение. У 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.
Re: Как указать компилятору Arduino IDE количество SRAM ?
По старому - доброму Устройства Ввода-Вывода, отображенные на пространство Внешней Памяти Данных.
Попривыкали все на ШПИК ИНГЛИШ, забывая с чего начинали.

Попривыкали все на ШПИК ИНГЛИШ, забывая с чего начинали.