Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

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

Пн июн 28, 2021 01:13:26

ATmega128. Подключена микросхема 64Кб внешней памяти SRAM. Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.

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

Пн июн 28, 2021 07:44:38

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

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

Пн июн 28, 2021 08:13:31

Как указать компилятору, что у процессора имеется не 4Kb, а именно 64 Кбайт памяти.

это может поможет:
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

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

Пн июн 28, 2021 10:37:48

Неплохо... но во внешнюю пошли только данные... стек остался во внутренней.
В принципе для ардуинки вполне себе достаточно.
8)

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

Пн июн 28, 2021 11:23:31

но во внешнюю пошли только данные... стек остался во внутренней.

в Цэ можно творить чудеса легким движением:
-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8090ff,--defsym=__stack=0x8010ff

з.ы. а скетчи ардуино можно компилить макефайлом, который дает полное управление тем же линкером

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

Пн июн 28, 2021 14:13:25

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

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

Пн июн 28, 2021 15:32:03

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

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=

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

Пн июн 28, 2021 16:45:18

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

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

После исполнения этих команд линии Адреса, #RD, #WR, ALE активизируются. И вроде бы должны сразу работать. Но они никак не действуют при чтении-записи. Толи это глюк модели процессора, толи чего-то не хватает. Процессор как бы продолжает работать на внутренней памяти.
Вложения
Безым.png
(89.01 KiB) Скачиваний: 147

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

Пн июн 28, 2021 18:20:21

а как чтение-запись сделано (кусочек кода).
Протеус не всесилен:
Спойлер
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.

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

Вт июн 29, 2021 02:07:20

Обана. Вы имеете в виду предпоследнюю строчку текста под катом ? Не поддерживается программирование внешней памяти. Видимо это оно и есть.
Ммммдя. Протеус не катит. В какой проге есть симулятор вроде Протеуса ? Придется мудрить в реале. Всем большое спасибо.

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

Вт июн 29, 2021 08:20:13

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

под линукс (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

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

Вт июн 29, 2021 18:17:45

Оказалось - просто. Интерфейс внешней памяти, включается при обращении к адресам больше чем 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);
}

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

Вт июн 29, 2021 18:46:40

по картинке и в доке внешняя начинается с адреса 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

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

Вт июн 29, 2021 21:55:08

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

Команда записи - mem[index + Offset] = Data;
Команда чтения - Data = mem[index + Offset];
Этого вообще достаточно ?

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

Ср июн 30, 2021 08:04:06

в официальной документации есть пример:
гуглоперевод
Поскольку внешняя память отображается после внутренней памяти, как показано на рисунке 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;
}

з.ы. в протеусе можно поглядеть дамп памяти, после выполнения этого примера (если он выполнится конечно)

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

Ср июн 30, 2021 10:49:34

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

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

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

Ср июн 30, 2021 11:20:56

ГЫММ....oleg110592
ВПД... А если без макефайлов, а только malloс?

(ВПД)Воинские перевозочные документы?
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

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

Ср июн 30, 2021 12:09:21

Чего язвимс то?
Внешняя Память Данных
8)

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

Ср июн 30, 2021 13:11:35

Опять домыслы. Язвят на развлекательных форумах, а тут требуется уточнение. У 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 ?

Ср июн 30, 2021 14:49:20

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