Распределение памяти esp8266
Карта памяти (адресного пространства)
Как я уже говорил выше, модель состоит из flash ROM размером 512 КБ и SoC, который, по неподтвержденным данным имеет RAM до 248 КБ.
Вообще все, что касается памяти – расположения, свойств и атрибутов сегментов – это изыскания сообщества. В оригинальной китайской документации этот вопрос почему-то обойден стороной.
Один из вариантов (имеются противоречия с другими источниками) известной на сегодняшний день карты памяти можно посмотреть здесь. Приведу лишь наиболее интересные адреса:
Внутренняя память:
Диапазон | Описание |
---|---|
3FFE8000h — 3FFFBFFFh | оперативная память для пользовательских приложений. При старте модуля может инициализироваться значениями из пользовательской прошивки. |
3FFFC000h — 3FFFFFFFh | системная оперативная память |
40000000h — 4000FFFFh | системный ROM. Отсюда стартует процессор, загружается пользовательская прошивка и здесь находятся основные системные библиотеки. |
40100000h — 4010FFFFh | оперативная память, содержит пользовательскую прошивку |
40240000h — 40271FFFh | вторая часть пользовательской прошивки. Здесь находятся код подключенных библиотек и SDK. Подмаплено к flash по адресу 40000h. |
Различные сегменты адресного пространства могут быть RAM, ROM или подмаплены непосредственно к flash. Подмапленные области кэшируются для скорости работы.
Flash:
Диапазон | Описание |
---|---|
00000h — 3DFFFh | адрес загрузки пользовательской прошивки |
40000h — 7BFFFh | адрес загрузки библиотек SDK (также может являться частью пользовательской прошивки) |
Формат прошивки
Теперь, перед тем, как перейти к процессу запуска модуля, рассмотрим формат прошивки. Для загрузки пользовательской прошивки обычно достаточно записать 2 блока данных: по адресу 00000h и 40000h. Остальные блоки могут потребовать перепрошивки для сброса конфигурации, например, при заливке новой прошивки с несовместимым форматом данных.
Блок, начинающийся с 40000h содержит простой бинарный код, который загружается и работает в неизменном виде. А вот блок, начинающийся с 00000h, представляет собой структурированные данные о находящихся в нем сегментах и выглядит следующим образом:
Смещение | Описание |
---|---|
0 | идентификатор прошивки, всегда `0xE9` |
1 | количество сегментов в прошивке |
2,3 | параметры SPI Flash |
4-7 | адрес запуска прошивки (Entry Point) |
8... | далее идут данные сегментов |
Структура сегмента:
Смещение | Описание |
---|---|
0-3 | адрес для загрузки сегмента |
4-7 | размер сегмента |
8... | далее идут данные сегмента |
Завершающий блок:
Заполнен нулями для выравнивания до границы 16 байт минус 1 байт. После этого добавляется последний байт, представляющий собой контрольную сумму данных всех сегментов, вычисляемая функцией xor над всеми байтами и константой `0xEF`.
Формат прошивки взят из описания к утилите esptool.
Процесс запуска
Теперь, вооружившись этими знаниями, рассмотрим процесс старта модуля ESP8266 с точки зрения инициализации и запуска прошивки.
При подаче питания или поступлении сигнала сброса процессор начинает выполнение инструкций с адреса 40000080h (системный ROM). По адресу 40001308h располагается процедура, которая считывает блок 00000h flash и копирует сегменты, хранящиеся в ней по заданным адресам.

На схеме этот процесс показан фиолетовым цветом. Здесь видно, что часть прошивки является исполняемым кодом, а часть инициализирует данные в ОЗУ. Зеленым обозначен блок, напрямую подмапленный в адресное пространство процессора.
После всех инициализаций управление передается по адресу, указанному в заголовке прошивки. Обычно это адрес пользовательского кода 40100000h.
Обратная связь
Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях
пишите мне на netdm@mail.ru
Добавить комментарий