Как указать компилятору Arduino IDE количество SRAM ?
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1479
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: Как указать компилятору Arduino IDE количество SRAM ?
Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
насчет скетча это к BOB51 (по ардуинам он главнюк тут на форуме
), тем более ранее выкладывалось как.
Потестил обычным Си c малок в протеусе с внешней RAM - вроде работает, хотя полностью не уверен.

Упрощенный тест:
в опциях линкера добавил:
Потестил обычным Си c малок в протеусе с внешней RAM - вроде работает, хотя полностью не уверен.
Упрощенный тест:
Спойлер
Код: Выделить всё
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>
#define BUFFER_SIZE 255
volatile uint8_t ramTest[255];
void delay_ms(uint16_t); /* Defined in asmfunc.S */
void delay_us(uint16_t); /* Defined in asmfunc.S */
int main(void)
{
uint8_t *mem;
uint8_t index;
uint8_t data=1;
delay_ms(200);
DDRA = 0b11111111;
DDRD = 0b00000000;
DDRB = 0b00000000;
DDRC = 0b11111111;
DDRG = 0b11111111;
PORTA = 0b00000000;
PORTD = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTG = 0b00000000;
ACSR = (1 << ACD);
// External memory interface enable
MCUCR |= (1<SRE);
XMCRA = 0;
//PC7..PC5 released pins
XMCRB |= (1<XMM1)|(1<XMM0);
mem = malloc(BUFFER_SIZE);
for(index = 0; index < BUFFER_SIZE; index++)
{
mem[index] = data++;
ramTest[index] = mem[index];
}
while(1);
}
Код: Выделить всё
-Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x8030ffRe: Как указать компилятору Arduino IDE количество SRAM ?
Тест не пройден, у вас на картинке AVR Data memory - U4.oleg110592 писал(а):Упрощенный тест:
Чисто, теоретически
Спойлер
Код: Выделить всё
DDRC = 0xFF;
PORTC = 0x00;
XMCRA = _BV(SRL2);
MCUCR |= (_BV(SRE) | _BV(SRW10));
uint16_t a=0;
for(uint16_t i=0x8000; i < 0xFFFF; i++){
(*((uint8_t * const) (i))) = ((uint8_t) (a++));
}
Можно адресовать с 0x1100 но это включает шину А12.
В протеусе работает.
Назад прочитать командой
Код: Выделить всё
data = (*((uint8_t * const) (address)))- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
а как же оно туда попало? Вся родная память дальше пустая. Вот эта строка туда и читает из внешней памяти:
Картинка, где явно видно адрес указателя подробнее:

Листинг похоже подтверждает:
и в map файле:
листинг маллока не приложен.
И тут пример, который упрощал (в усарт не хотелось), реально испытаный автором в железе (повтор) :
https://www.rlocman.ru/shem/schematics.html?di=71095
Код: Выделить всё
ramTest[index] = mem[index];Листинг похоже подтверждает:
Спойлер
Код: Выделить всё
mem = malloc(BUFFER_SIZE);
126: 8f ef ldi r24, 0xFF ; 255
128: 90 e0 ldi r25, 0x00 ; 0
12a: 0e 94 b6 00 call 0x16c ; 0x16c <malloc>
12e: 90 93 06 02 sts 0x0206, r25 ; 0x800206 <mem+0x1>
132: 80 93 05 02 sts 0x0205, r24 ; 0x800205 <mem>
136: 80 e0 ldi r24, 0x00 ; 0
138: 90 e0 ldi r25, 0x00 ; 0
13a: 21 e0 ldi r18, 0x01 ; 1
13c: 28 0f add r18, r24
for(index = 0; index < BUFFER_SIZE; index++)
{
mem[index] = data++;
13e: e0 91 05 02 lds r30, 0x0205 ; 0x800205 <mem>
142: f0 91 06 02 lds r31, 0x0206 ; 0x800206 <mem+0x1>
146: e8 0f add r30, r24
148: f9 1f adc r31, r25
14a: 20 83 st Z, r18
ramTest[index] = mem[index];
14c: e0 91 05 02 lds r30, 0x0205 ; 0x800205 <mem>
150: f0 91 06 02 lds r31, 0x0206 ; 0x800206 <mem+0x1>
154: e8 0f add r30, r24
156: f9 1f adc r31, r25
158: 20 81 ld r18, Z
15a: fc 01 movw r30, r24
15c: ea 5f subi r30, 0xFA ; 250
15e: fe 4f sbci r31, 0xFE ; 254
160: 20 83 st Z, r18
162: 01 96 adiw r24, 0x01 ; 1
for(index = 0; index < BUFFER_SIZE; index++)
164: 8f 3f cpi r24, 0xFF ; 255
166: 91 05 cpc r25, r1
168: 41 f7 brne .-48 ; 0x13a <main+0x4c>
16a: ff cf rjmp .-2 ; 0x16a <main+0x7c>и в map файле:
Код: Выделить всё
0x00801100 __heap_start = 0x801100
0x008030ff __heap_end = 0x8030ffИ тут пример, который упрощал (в усарт не хотелось), реально испытаный автором в железе (повтор) :
https://www.rlocman.ru/shem/schematics.html?di=71095
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4054719#p4054719"]Пока еще не освоил всех тонкостей синтаксиса С. Прошу помощи. - Как в Ардуиновском скетче написать команду записи / чтения байта в / из конкретный адрес ОЗУ ? Считаем, что адрес заведомо свободен.[/uquote]
Для простейшего теста внешней аппаратной обвязки схемы можно просто симитировать аппаратный блок в МК примитив-дрыголапом.
Это позволит исключить ошибки в настройках РСФ аппаратного блока управления внешней памятью, в том числе и "накладку адресов" в младшей части адресного пространства.
Относительно чтения/записи по конкретному адресу через Си - надо таки будет сначала аппаратный модуль управления внешним ОЗУ настроить... да и макет для проверки соорудть, чтоб в реале посмотреть. У меня для такого разве что мега8515...

Для простейшего теста внешней аппаратной обвязки схемы можно просто симитировать аппаратный блок в МК примитив-дрыголапом.
Это позволит исключить ошибки в настройках РСФ аппаратного блока управления внешней памятью, в том числе и "накладку адресов" в младшей части адресного пространства.
Относительно чтения/записи по конкретному адресу через Си - надо таки будет сначала аппаратный модуль управления внешним ОЗУ настроить... да и макет для проверки соорудть, чтоб в реале посмотреть. У меня для такого разве что мега8515...
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1479
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: Как указать компилятору Arduino IDE количество SRAM ?
Всем большое спасибо. Понял как пользоваться пойнтером *Ptr.
Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !). Надо ввести в схему цепи задержки сигналов ALE, #WR и #RD относительно сигналов адреса/данных. В роли задержки - пара инверторов. Два инвертора - повторитель. Шесть инверторов из микры (напр. 74HCT04) как раз то что требуется. Без них Протеус показывает лажу. В данном случае он не врет, логически все верно. Полагаться на супер-пупер быстродействие регистра адреса и микры памяти - опрометчивое дело. Выставил в настройках проца задержки по максимуму - оказалось недостаточно. Даташит предупреждает об этом же.
Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !). Надо ввести в схему цепи задержки сигналов ALE, #WR и #RD относительно сигналов адреса/данных. В роли задержки - пара инверторов. Два инвертора - повторитель. Шесть инверторов из микры (напр. 74HCT04) как раз то что требуется. Без них Протеус показывает лажу. В данном случае он не врет, логически все верно. Полагаться на супер-пупер быстродействие регистра адреса и микры памяти - опрометчивое дело. Выставил в настройках проца задержки по максимуму - оказалось недостаточно. Даташит предупреждает об этом же.
Re: Как указать компилятору Arduino IDE количество SRAM ?
Задержки зависят от типа ОЗУ (см. даташит) и конфигурации линий монтажа.

- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[uquote="Ariadna-on-Line",url="/forum/viewtopic.php?p=4057592#p4057592"]Что касается схемотехники - В роли регистра адреса лучше использовать 74HCT574(четыре !)[/uquote]
В папке протеуса есть примеры (для ардуинщиков много), а среди примеров есть папка AVR External Memory. Там по схеме регистр 74LS373 и память 6264, есть и диаграммы работы схемы - может есть смысл рассмотреть. Я брал эту схему, только заменил микроконтроллер атмега8515 мегой128 - программно, как выше в постах видно - протеус нормально работает.
з.ы. в протеусе есть и сама среда ардуино
В папке протеуса есть примеры (для ардуинщиков много), а среди примеров есть папка AVR External Memory. Там по схеме регистр 74LS373 и память 6264, есть и диаграммы работы схемы - может есть смысл рассмотреть. Я брал эту схему, только заменил микроконтроллер атмега8515 мегой128 - программно, как выше в постах видно - протеус нормально работает.
з.ы. в протеусе есть и сама среда ардуино
Re: Как указать компилятору Arduino IDE количество SRAM ?
То все-таки симулятор...
Соответственно допуски определенные заложены.
В реале у той же ОЗУ есть варианты с различным временем доступа,
да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается.
На котуинке, к примеру, стоит 74HC573(К1533ИР33) + UM61512AK-15/W24512AK-15 (15nS доступ)....
( у 6264 из тех, что попадались "вживую" - только 70nS...)
И то при кварце в 11,0592МГц (тактовая МК ~ 1Мгц). Выше частоту поднимать таки не рисковал - ибо там не только данные, но и исполняемая программа размещается.
В принципе... тот блок ВПД можно и с мегой8515/162й протестировать...
https://img.radiokot.ru/files/20529/2k8oskg0us.JPG
монтаж совершенно примитивный
верхняя сторона с регистром
https://img.radiokot.ru/files/20529/17kiakfs6n.jpg
нижняя сторона с собственно ОЗУшкой
https://img.radiokot.ru/files/20529/17kiakxghg.jpg
Кстати... не обязательно абсолютное соответствие старшего байта адресов у МК раскладке микросхемы памяти делать.
Можно и по принципу "как удобнее" - для МК они все равно будут последовательно считываться, несмотря на "физически размещенную чехарду".

Соответственно допуски определенные заложены.
В реале у той же ОЗУ есть варианты с различным временем доступа,
да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается.
На котуинке, к примеру, стоит 74HC573(К1533ИР33) + UM61512AK-15/W24512AK-15 (15nS доступ)....
( у 6264 из тех, что попадались "вживую" - только 70nS...)
И то при кварце в 11,0592МГц (тактовая МК ~ 1Мгц). Выше частоту поднимать таки не рисковал - ибо там не только данные, но и исполняемая программа размещается.
В принципе... тот блок ВПД можно и с мегой8515/162й протестировать...
https://img.radiokot.ru/files/20529/2k8oskg0us.JPG
монтаж совершенно примитивный
верхняя сторона с регистром
https://img.radiokot.ru/files/20529/17kiakfs6n.jpg
нижняя сторона с собственно ОЗУшкой
https://img.radiokot.ru/files/20529/17kiakxghg.jpg
Кстати... не обязательно абсолютное соответствие старшего байта адресов у МК раскладке микросхемы памяти делать.
Можно и по принципу "как удобнее" - для МК они все равно будут последовательно считываться, несмотря на "физически размещенную чехарду".
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Как указать компилятору Arduino IDE количество SRAM ?
[uquote="BOB51",url="/forum/viewtopic.php?p=4057879#p4057879"]да и прокладка трасс линий адреса/данных многое меняет - это ежли реал-макет делается[/uquote]
Andy, который реальный тест проводил (выше ссылка была) проложил трассы как попало:
но использовал
SRAM Alliance AS7C4096A 12ns 44 pin TSOP-II
Latch NXP 74AHC373 20 pin TSSOP-20
первоисточник перевода на радиолоцмане:
https://andybrown.me.uk/2011/08/28/512k ... ega-build/
з.ы. там цивильная разводка того же есть
Andy, который реальный тест проводил (выше ссылка была) проложил трассы как попало:
Спойлер

SRAM Alliance AS7C4096A 12ns 44 pin TSOP-II
Latch NXP 74AHC373 20 pin TSSOP-20
первоисточник перевода на радиолоцмане:
https://andybrown.me.uk/2011/08/28/512k ... ega-build/
з.ы. там цивильная разводка того же есть
- Ariadna-on-Line
- Это не хвост, это антенна
- Сообщения: 1479
- Зарегистрирован: Вс май 13, 2012 00:01:54
Re: Как указать компилятору Arduino IDE количество SRAM ?
Искал почему в Протеусе внешняя память не пишется, не читается. Когда ввел для задержек микру с инверторами - Протеус заработал. Об этом написано в предыдущем моем посте.
В реале наверняка придется сделать как в Протеусе, те ввести микру с инверторами. Про недостаточность задержек в процессоре упоминается в его даташите.
В реале наверняка придется сделать как в Протеусе, те ввести микру с инверторами. Про недостаточность задержек в процессоре упоминается в его даташите.