• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Вопросы по RAM, IRAM и прочей памяти

nikolz

Well-known member
Добрый день,
после линковки получаем инфу:
Total Used RAM : 39328
Free RAM : 42592
Free IRam : 6552
Вопросы по данной информации.
1) Всего RAM получается 81920 (это десятичный формат?) число какое-то странное (не степень двойки)
Кто-нибудь может объяснить сколько же всего RAM и почему 81920
2) Сколько IRam и чем отличается от RAM?
Если есть возможность дайте ссылку на документацию
Спасибо
 

jcmvbkbc

New member
1) Всего RAM получается 81920 (это десятичный формат?) число какое-то странное (не степень двойки)
Кто-нибудь может объяснить сколько же всего RAM и почему 81920
Всего в ядре 96КБайт памяти данных, из которых 80КБайт -- для пользователя и 64КБайт программной памяти, из которых 32КБайт -- для пользователя.
См. https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map#memory-layout

2) Сколько IRam и чем отличается от RAM?
64КБайт, из которых 32КБайт -- для пользователя.
Из IRAM можно выполнять код. Считывать/записывать данные можно только выровненными 4-байтовыми словами.
Из DRAM нельзя выполнять код. Считывать/записывать данные можно побайтно и натурально выровненными 2- и 4-байтовыми словами.
Почитать об этом можно в xtensa ISA, http://0x04.net/~mwk/doc/xtensa.pdf , главы 4.5.10 "Instruction RAM Option" и 4.5.13 "Data RAM Option".
 

pvvx

Активный участник сообщества
RAM в ESP8266 128 Килобайт.
Это указано даже в "См. https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map#memory-layout "
3FFE8000h dram0 14000h
3FFFC000h 4000h
40100000h iram1 8000h
14000h+4000h+8000h = 131072 байта (0x20000, 20000h).
Ещё есть кеш для flash.
Из 128 килобайт SDK 1.0.x дает пользователю всего 35 килобайт в пределе*. Ещё bss + стек (задействованная глубина не известна).
SDK 0.9.5 отдает пользователю до 48 килобайт в пределе*...
* - выключена WiFi и обглоданы либы SDK + незадействованный кусок iram.

У jcmvbkbc размер памяти в чипе зависит от настроения... Там он пытается скрыть от всех ещё 32кило.
А тут, выше постом, он отрезал 64 кило. :confused:
 
Последнее редактирование:

nikolz

Well-known member
pvvx,
благодарю за информацию.
RAM в ESP8266 128 Килобайт.
Из 128 килобайт SDK 1.0.x дает пользователю всего 35 килобайт в пределе*. Ещё bss + стек (задействованная глубина не известна).
SDK 0.9.5 отдает пользователю до 48 килобайт в пределе*...
* - выключена WiFi и обглоданы либы SDK + незадействованный кусок iram.
:confused:
1) Правильно ли я понимаю, что кеширование выполняется статически т е при загрузке.
или же динамически? если динамически то почему пользователю лишь 35 можноли это распеделение менять в процессе работы( перегружать кеш)
Спасибо
 

nikolz

Well-known member
Добрый день,
вопрос: Почему нельзя перезагружать лишь область пользователя без пересборки и перезагрузки всего остального?
Может есть ссылка на обсуждение данного вопроса или ответ или ссылка на документацию
Спасибо
 

pvvx

Активный участник сообщества
1) Правильно ли я понимаю, что кеширование выполняется статически т е при загрузке.
или же динамически?
Если так ставите вопрос - тогда динамически. Имеется в виду не кеш процессора (как принято считать в модели, к примеру, как у x86), а аппаратное копирование исполняемых кусков кода из flash по QSPI интерфейсу в специальную память (как swapping или Подкачка страниц у x86, но у ESP8266 она реализована аппаратно для отображения flash) . Эту память у ESP8266 и прозвали "кеш". Её размер пока не определен. Но по сопутствующим свойствам, с виду, он не большой - порядок к 32 килобайта. Уверенно сказать не могу - не копал, т.к. не столь необходимо. Эта кеш "отображает" в 1 Мегобайт области адресного пространства внешнюю flash. В стандартном исполнении модуля flash имеет 512 килобайт и два раза дублируется в данном адресном пространстве...
Почему нельзя перезагружать лишь область пользователя без пересборки и перезагрузки всего остального?
Вопрос не понятен. Без загрузки SDK доступна вся память... Библиотеки и коды SDK "отъедают" более 80 килобайт из имеющейся в чипе памяти на 128 килобайт (+ неизвестная кеш).
Про документацию и ссылки - забудьте. Их никто пока не находил :)
Стандартную модель процессора знает jcmvbkbc, но в чипе ESP8266 не всё стандартно и доков нет.
 
Последнее редактирование:

nikolz

Well-known member
Уточняю вопросы.
1) В документации тензизы читал, что процессор имеет 2 кеша каждый может иметь несколько блоков по 128К.
Как я понимаю это и есть кеш данных и кеш команд.
Далее читал, что внешняя память команд имеет адресацию 32 разр и следовательно размер до 4Гбайт адресуется словами
внешняя память данных имеет адресацию 30 бит и размер до 1Гбайта.
Т е гарвардская архитектура .
---------------------------
Вопрос :
если я правильно понял документацию, то какие цифры имеем для ESP в терминах п 1.
----------------------------------------------------
2) Как я понимаю,
то сейчас мы при любом изменении своей программы на СИ должны собирать всю сборку в 200К или 400К (nodeMCU) и грузить в ESP.
Но как я понимаю, чтобы я ни написал в своей программе,
SDK тупо сядет на свое место в том же виде, что и без моей программы.
-------------------------------------------------
Вопрос:
Почему я не могу (или могу?) не собирать и не грузить каждый раз то,
что я не разрабатывал,
а собирать лишь свою программу и тупо грузить ее в область пользователя?
Спасибо
 

nikolz

Well-known member
Да и еще вопрос:
Если кеш занимаем динамически, то почему я не могу при запуске моей программы
убрать оттуда все лишнее для меня и освободить столько кеша для себя сколько захочу.
 

pvvx

Активный участник сообщества
В SDK, в файле линковки, дается такое распределение памяти:

dram0_0_seg : org = 0x3FFE8000, len = 0x14000
iram1_0_seg : org = 0x40100000, len = 0x8000

Кусок с 0x3FFFC000, len= 0x4000 занимают данные, используемые ROM-BIOS.
В совокупности с iram1_0_seg это и есть 128 килобайт, из которых SDKот Espressif занимает 80 кило и оставляет вам до 40 на всё (пользовательский стек и данные).

irom0_0_seg : org = 0x40240000, len = 0x32000
– это из области кэша flash и для её отображения тоже требуется память, т.к. CPUне может исполнять код из внешней последовательной flash...
Да и еще вопрос:
Если кеш занимаем динамически, то почему я не могу при запуске моей программы
убрать оттуда все лишнее для меня и освободить столько кеша для себя сколько захочу.
По тому что он аппаратный и привязан к QSPI по умолчанию. И его не много.
Команды QSPI у flash и прочее аппаратный наворот предполагают "кеширование" блоками по 64 байта. Т.е. "кеша" чипу можно иметь всего 64 байта.
Если выключить "кеширование" flash процедурой Cache_Read_Disable() из ROM-BIOS, то все коды библиотек SDK из flash будут недоступны и произойдет "протектед" при обращении в их область :)
Ошибка у многих пишущих, что bootloader, находящийся в flash, загружает всю flash. На самом деле ROM-BIOS загружает только порядком до 32 килобайт с самого начала flash кодов в область IRAM и далее ничего больше не грузиться, а включается "кеширование flash".
 
Последнее редактирование:

pvvx

Активный участник сообщества
Уточняю вопросы.
1) В документации тензизы читал, что процессор имеет 2 кеша каждый может иметь несколько блоков по 128К.
Это "может иметь в стандартной модели распространяемого дизайна от Tensilica Inc". А может не иметь :) или модель изменена, как у ESP8266.
 

pvvx

Активный участник сообщества
Вопрос:
Почему я не могу (или могу?) не собирать и не грузить каждый раз то,
что я не разрабатывал,
а собирать лишь свою программу и тупо грузить ее в область пользователя?
По тому, что это никому не надо. Всем почему-то требуется SDK и без него они жить не могут :) Я (и другие) давал примеры к UDK и как грузить свой код только в iram (в основном для отладки), чтобы не прошивать flash. Ищите по форуму.
Вы вроде тоже не можете без NodeMCU :)
2) Как я понимаю,
то сейчас мы при любом изменении своей программы на СИ должны собирать всю сборку в 200К или 400К (nodeMCU) и грузить в ESP.
Но как я понимаю, чтобы я ни написал в своей программе,
SDK тупо сядет на свое место в том же виде, что и без моей программы.
А ваша программа обращается к кодам в SDK? Кто ей укажет адреса процедур в flash без линковки?
И такой "область пользователя" не существует. Код может исполняться процессором только из IRAM или "кешируемой области flash" в 1 Мегабайт. Чтобы это изменить требуется полнейшая документация по чипу ESP8266, а не по базовому дизайну от Tensilica Inc на ядро CPU (теперь = Cadence).
 
Последнее редактирование:

jcmvbkbc

New member
1) читал, что процессор имеет 2 кеша каждый может иметь несколько блоков по 128К.
Как я понимаю это и есть кеш данных и кеш команд.
Понимаете правильно, но у данного процессорного ядра нет кеша. Совсем.
То что называют "кешем флэш" -- это не процессорный кеш, это какой-то внешний IP-блок управляемый через регистры отображенные в память.

Вопрос :
если я правильно понял документацию, то какие цифры имеем для ESP в терминах п 1.
0, 0.

Почему я не могу (или могу?) не собирать и не грузить каждый раз то,
что я не разрабатывал,
а собирать лишь свою программу и тупо грузить ее в область пользователя?
Потому что вашей программе нужны внешние подпрограммы. Это можно было бы решить динамическим связыванием, но пока никто этим, кажется, не озаботился.
 

jcmvbkbc

New member
Но дело в том( если я не ошибаюсь) эти программы уже статически сидят в памяти.
В ROM лежит небольшой набор функций, и с ними вы действительно линкуетесь статически. Но во FLASH лежит только то, что вы туда прошили.
А прошить всё физически невозможно: суммарный объём только секций .text в либах espressif из SDK 1.0.1 -- почти 300КБ.
Да, можно сделать конструктор, позволяющий прошить нужное подмножество функций/данных SDK и потом линковать свой код с тем что прошито статически.
Но в чём цель этого упражнения?
 

JustACat

Moderator
Команда форума
кроме того при быстрой загрузке своего можно отлаживать меняя код практически налету
Ах, мечты-мечты... Bs тут уже в теме про Sming об этом мечтали. (ну, я то есть)
Я хотел, чтобы там все не линковалось и не грузилось каждый раз... Но мне сказали - что так надо.
По тому, что это никому не надо.
Вы не правы, очень надо... Но увы, не все могут... Мне вот, например, на все это тупо не хватает познаний. Да, все можно изучить и понять (я считаю), на это нужно лишь время и желание. Но вот как раз со временем тоже не всегда хорошо... В общем, молча (в тряпочку) мечтаю.
 

jcmvbkbc

New member
цель не грузить каждый раз при исправлении ошибок все 200-400 кбайт
а грузить лишь свое 1-2 кбайт в результате время исправления ошибок в десятки раз меньше
400 * 1024 * 10 / 115200 = 35 секунд чистого времени загрузки. Предположим, что больше ничего времени при прошивке не отнимает.
В десятки раз меньше -- это 3.5 секунды и меньше. У вас часто бывают ошибки, на диагностику и исправление которых достаточно 3.5 секунды?
 

JustACat

Moderator
Команда форума
jcmvbkbc, не хочу спорить и влезать (может не в свое дело), но разница между 35 и 3.5 секунды при загрузке - огромная.
Я это говорю как человек, привыкший к другой парадигме разработки (неправильной конечно): я пишу много на PHP (сайты) и часто бывает (когда времени мало, либо устал, либо мало ли еще что и думать не хочется/не получается/некогда/делаешь на автомате) что разработка происходит по принципу: написал - нажал F5 в браузере (по сути запустил программу) - посмотрел на результат - тут же внес 1-2 изменения (например, в цвет, или формат вывода какой) - сохранил - снова F5 - посмотрел - и так по кругу может быть много раз :)
Так вот, если бы в этой цепочке у меня при нажатии F5 каждый раз пришлось ждать по 35 секунд (вместо 3.5), я бы, наверное - повесился.
Ну или да - стал бы писать аккуратнее, больше продумывая в уме, прогоняя код опять же в голове (в принципе так конечно правильнее и я в общем-то это умею, но не всегда хочу :-Р )
Вот, такие дела :)

Хотя да, понятное дело, что разработка под WEB и embed разработка под всякие железки - это не одно и то же, и бывают часто такие вещи, когда сборка может длиться даже десятки минут (ну или сколько там)... Так что да...

Но если была бы возможность сократить время сборки/загрузки и запуска кода хоть на сколько-то - то эту возможность нужно использовать. Это реально дает много возможностей.
 

pvvx

Активный участник сообщества
разница между 35 и 3.5 секунды при загрузке - огромная.
Сейчас, при загрузке прошивки из Eclipse (230400 Baud) с трансляцией изменений в паре CИ файлов уходит Build Finished (took 2s.36ms) и Build Finished (took 17s.687ms). Т.е. 20 секунд и это не заморачивает. Пока грузиться необходимо ещё обдумать что и как тестить, да что нового вписал. Часто даже не смотрю что там прошилось, а пишу новый вариант, т.к. нажать "прошить" ничего не значит, кроме мелкого переключения задачи мозгу - а то ли вписал и не надо ли ещё чего вписать для правильного теста, или всё ли исправления внесены... Во время прошивки из Eclipse, редактор то работает :)
А сборка диска для WEB и его передача в flash по HTTP происходит быстрее поиска кнопки "странслить и залить" мышей по экрану и ещё сообразить, в каком окне идет отладка WEB страниц :)
Канал отладки UART к модулю при этом всегда включен на отдельный COM порт и не требует переключений. Он иногда висит открытым по несколько суток в компе, т.к. везде стоят бесперебойники и это комп я не выключаю... :)
Действие таким методом всегда дает непродуктивный и кривой код на выходе. :p
Т.е. так поступают, когда некогда и нет желания заниматься поиском правильного алгоритма.
Мне модулей и их flash не жалко - их десятки и модули вставляются в разъем. Пока ни один не протерся до дырки. Т.е. можно включить постоянную авто-перезапись при открытом проекте в Eclipse. Токо останавливать для теста надо... :)
 
Последнее редактирование:

JustACat

Moderator
Команда форума
pvvx,
перед вами я давно преклоняюсь в общем-то (даже если вдруг вам это не нравится :-Р ), то есть уважаю и в некотором роде считаю эталоном.
Но, как я уже заметил - не все так как вы могут, умеют и/или хотят программировать (причины могут быть разные).

Я зачастую шью код, чтобы проверить какую-то мелочь: например, как строчка у меня в UART выведется (или еще куда, на экран, например, подцепленный к МК графика какая-то, UI и т.п.).
И, доводя до совершенства, иногда, делаю несколько циклов таких с мизерными правками, не требующими вообще никакого обдумывания, сдвигая то туда на пару пикселей, то сюда, то добавив запятую, то убрав и т.д., и т.п.
И хорошо. если у вас все это позволяет мозг сделать прямо в воображении, выдавая на выходе код, но я, увы, такими способностями не обладаю. Мне нужно видеть, чтобы понять - нравится оно мне или требует доработки.
И вот в таких ситуациях заливка по 20 секунд - это печаль...

Причем, заметьте, я повторюсь: я ни в коем разе не утверждаю, что мой подход к программированию правильный. Скорее наверняка наоборот, я во многом не прав. Но речь не о правоте в данном случае, а о простой хотелке: хотелке, чтобы по возможности компиляция и прошивка занимала как можно меньше времени. В идеале, я лично хотел бы ждать 3-5 секунд (на весь процесс от нажатия F9 до запуска на чипе) - не более. Вот это было бы супер.

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

Но мы с вами сейчас тут опять такой оффтоп разводим, ужасть просто :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
В идеале, я лично хотел бы ждать 3-5 секунд (на весь процесс от нажатия F9 до запуска на чипе) - не более. Вот это было бы супер.
Но тут немного о другом тема - о памяти. А реализация того, что вы хотите делается не сверх сложно.
Ну и с памятью и того что вы хотите -всё это включает в себя реализация методов оверлеев (тема о них была поднята в UDK). Но поддержать никто не захотел.
Но, со временем, если ESP не забросят, то это обязательно будет реализовано в кай-то степени кем-либо. Без это дороги далее у модуля нет.
 
Сверху Снизу