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

Добавить в UDK утилиту MemUsage

Sermus

New member
Переписал тулзу, чтобы она была консольной. Теперь можно в makefile добавить вот так:
Код:
--- Makefile.orig    Thu Mar 19 11:01:00 2015
+++ Makefile    Thu Mar 19 10:59:12 2015
@@ -218,6 +218,7 @@
$(TARGET_OUT): $(APP_AR)
     $(vecho) "LD $@"
     $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $@
+    $(Q) $(SDK_TOOLS)/memanalyzer.exe $(OBJDUMP).exe $@
     $(vecho) "Run objcopy, please wait..."
     $(Q) $(OBJCOPY) --only-section .text -O binary $@ eagle.app.v6.text.bin
     $(Q) $(OBJCOPY) --only-section .data -O binary $@ eagle.app.v6.data.bin
А в C:\Espressif\utils положить тулзу из приаттаченного архива.

В итоге при компиляции будет видно что-то вроде этого:



Видимо, это полезнее, чем WinForms приложение, которое я указал выше.
--- добавлено: 19 мар 2015 в 13:17 ---
 

Вложения

Последнее редактирование модератором:

CHERTS

Moderator
Команда форума
Переписал тулзу, чтобы она была консольной. Теперь можно в makefile добавить вот так:
Исходники бы этой тузлы, и ссылку на официального автора.
--- добавлено: 19 мар 2015 в 16:33 ---
В итоге при компиляции будет видно что-то вроде этого:
В принципе получается то же самое, если использовать xtensa-lx106-elf-objdump в Makefile, табличка только выглядит поудобнее и есть вывод Total Used RAM, Free RAM и Free IRam

Код:
$(Q) $(OBJDUMP) -h -j .data -j .rodata -j .bss -j .text -j .irom0.text $@
Сравнение вывода:

Код:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         000009f0  3ffe8000  3ffe8000  000000e0  2**4
                  CONTENTS, ALLOC, LOAD, DATA
  1 .rodata       00000454  3ffe89f0  3ffe89f0  00000ad0  2**4
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00007be0  3ffe8e48  3ffe8e48  00000f28  2**4
                  ALLOC
  3 .text         000062ce  40100000  40100000  00000f24  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  4 .irom0.text   000233ec  40240000  40240000  00007200  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
Section info:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE89F0|    2544
    rodata|           ReadOnly Data (RAM)|    3FFE89F0|    3FFE8E44|    1108
       bss|      Uninitialized Data (RAM)|    3FFE8E48|    3FFF0A28|   31712
      text|            Cached Code (IRAM)|    40100000|    401062CE|   25294
irom0_text|           Uncached Code (SPI)|    40240000|    402633EC|  144364
Total Used RAM : 35364
Free RAM : 46556
Free IRam : 7492
В принципе информативно, можно добавить в UDK, только исходники если дадите, чтобы я сам проверил и собрал.
 
Последнее редактирование модератором:

jcmvbkbc

New member
Переписал тулзу, чтобы она была консольной.
...
В итоге при компиляции будет видно что-то вроде этого:
Но зачем целое приложение, для того, что и так умеет команда size?
Код:
$ xtensa-lx106-elf-size -Ax httpd.out   
httpd.out  :   
section  size  addr   
.data  0xb1c  0x3ffe8000   
.rodata  0x15d0  0x3ffe8b20   
.bss  0x9e10  0x3ffea0f0   
.text  0x69b6  0x40100000   
.irom0.text  0x24078  0x40240000   
.comment  0x14b6  0x0   
.xtensa.info  0x38  0x0   
.xt.lit  0xfd8  0x0   
.xt.prop  0x1de38  0x0   
.debug_frame  0x978  0x0   
.debug_info  0x9e7c  0x0   
.debug_abbrev  0x21c5  0x0
.debug_loc  0x3b4b  0x0
.debug_aranges  0x5f8  0x0
.debug_line  0x6148  0x0
.debug_str  0x19fb  0x0
.debug_ranges  0x318  0x0
Total  0x6f57f
Надо только вывод погрепать от лишнего.
 

CHERTS

Moderator
Команда форума
Но зачем целое приложение, для того, что и так умеет команда size?
xtensa-lx106-elf-objdump тоже в принципе это же умеет, но вывод немного неудобен, думаю что memanalyzer.exe использует тот же xtensa-lx106-elf-objdump для получения информации + выводит её в более красивом табличном виде.
 

pvvx

Активный участник сообщества
xtensa-lx106-elf-objdump тоже в принципе это же умеет, но вывод немного неудобен, думаю что memanalyzer.exe использует тот же xtensa-lx106-elf-objdump для получения информации + выводит её в более красивом табличном виде.
И ошибается:
Его раскладка:
Код:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8AB0|    2736
    rodata|           ReadOnly Data (RAM)|    3FFE8AB0|    3FFE9D80|    4816
       bss|      Uninitialized Data (RAM)|    3FFE9D80|    3FFF1C10|   32400
      text|            Cached Code (IRAM)|    40100000|    4010683E|   26686
irom0_text|           Uncached Code (SPI)|    40240000|    4026D218|  184856
Total Used RAM : 39952
Free RAM : 41968
Free IRam : 6100
В живую, из лога при старте:
Found free IRAM: base:0x40106840, size: 6080 bytes (но тут с вычетом под мои нужды :), но явно прогой заголовок flash, помещенный в IRAM не учтен :( )
Current 'heap' size: 41696 bytes (это в user_init(), т.е. всего 2 байта куда-то дело SDK при начальной инициализации? - не поверю.)
Current 'heap' size: 39072 bytes (это уже в system_init_done_cb(xxx) - и понятно - нажрался LwIP и прочие иниты WiFi в SDK и чуток моих...)

CHERTS - вопрос есть:
Как создать среду (попроще) в вашем UDK, чтобы она транслировала оверлеи, загружаемые в кусочек "Free IRam" c предварительной линковкой процедур в остальную часть? Кусочки - типа dll-ек, подгружаемые из диска, размещенного в flash на 16 Meg и типа... Линковка нужна изначальная - при трансляции оверлеев :( (без таблиц в них и для них в исполняемом коде)
Это особенно требуется для удобного выбора драйверов к разным внешним микрухам к примеру галочками в WEB интерфейсе :)
 
Последнее редактирование:
  • Like
Реакции: THK

Andy Korg

Moderator
Команда форума
создать среду (попроще) в вашем UDK, чтобы она транслировала оверлеи, загружаемые в кусочек "Free IRam" c предварительной линковкой процедур в остальную часть
Поддерживаю. Но сомневаюсь, что такое возможно.
 

CHERTS

Moderator
Команда форума
Как создать среду (попроще) в вашем UDK, чтобы она транслировала оверлеи, загружаемые в кусочек "Free IRam" c предварительной линковкой процедур в остальную часть?
Я правильно понимаю, Вы хотите в iram иметь только ссылки на нужные процедуры, а сами процедуры хранить в др.области?

Это вариант не подойдет?
 

Sermus

New member
Found free IRAM: base:0x40106840, size: 6080 bytes (но тут с вычетом под мои нужды :), но явно прогой заголовок flash, помещенный в IRAM не учтен :( )
Скажите как учесть - учту.

Current 'heap' size: 41696 bytes (это в user_init(), т.е. всего 2 байта куда-то дело SDK при начальной инициализации? - не поверю.)
А в 41968 - 41696 = 272 байта поверите?

Current 'heap' size: 39072 bytes (это уже в system_init_done_cb(xxx) - и понятно - нажрался LwIP и прочие иниты WiFi в SDK и чуток моих...)
Ну тут уж извините, это к Павлу Глобе, пусть он характер динамического выделения предсказывает.
--- добавлено: 20 мар 2015 в 12:28 ---
Исходники бы этой тузлы, и ссылку на официального автора.
https://github.com/Sermus/ESP8266_memory_analyzer

Ссылки на оригинального автора у меня нет, случайно набрел на ссылку на архив, ее у указал.
 
Последнее редактирование модератором:

Sermus

New member
Да смысла дублировать нет, потом синхронизацией заморачиваться. Может просто дать ссылку на git repo?
 

CHERTS

Moderator
Команда форума
Да смысла дублировать нет, потом синхронизацией заморачиваться. Может просто дать ссылку на git repo?
Ссылку на https://github.com/Sermus/ESP8266_memory_analyzer я итак в ченджлог написал, просто я предпочитаю проверять исходники *.exe утилит, что я ложу в UDK, параноя чтоли, да и UDK вроде как опенсорсная. Ладно MemUsage.exe грохну, все равно GUI версия не сильно полезна.
 

pvvx

Активный участник сообщества
А в 41968 - 41696 = 272 байта поверите?
Замылился глаз, когда глядел - в 272 поверю :)
Я правильно понимаю, Вы хотите в iram иметь только ссылки на нужные процедуры, а сами процедуры хранить в др.области?
Нет. В iram загружать произвольный код с внешнего носителя, исполняющийся всегда по фиксированном адресу в конкретной области IRAM. Но требуется, чтобы он мог обращаться к любым процедурам в Flash без линковки. Для этого, при его трансляции, необходимо иметь все описания всех процедур/переменных и их адресов в flash от основного проекта. Данный UDK и его система транслятора это удобно и практически не может или будете собирать такие описания сто лет для каждого оверлея, а надо чтобы всё транслировалось на ходу, с перетрансляцией всех подгружаемых оверлеев в автомате...
 

pvvx

Активный участник сообщества
А почему надо грузить в iram, а не исполнять во flash?
Если возможно, то дайте ссылку на документацию по данному вопросу
Спасибо
1. Нет такой документации.
2. Модулей оверлеев может быть мульон. Исполняются они по очереди - загрузился и исполнился, затем другой. На скорость это не влияет, т.к. процесс кеширования из flash аналогичен по времени.
3. Iram выбрана по тому, что там есть пустой кусок, а память на вес золота в ESP8266.
4. Кешируемая область Flash ограничена 1 Мегабайтом и всё туда не влезет.
5. Оверлеи удобнее в некоторых случаях. Как драйверы разной аппаратуры, и для отладки, и ... Их можно загружать по сети или внешнего контроллера мульонами...
 

Victor

Administrator
Команда форума
В чем смысл данного эксперимента?
Т е что мы им хотим выяснить?
ну во-первых как работает файловая система за пределами 512k
во-вторых, у меня сейчас 5 файлов не создаются (только 3 и то третий размером 13952)
ну и создание файлов заметно замедляется по циклу.
Код:
20K1.txt        : 20480 bytes
20K2.txt        : 20480 bytes
20K3.txt        : 13952 bytes
20K4.txt        : 0 bytes
20K5.txt        : 256 bytes

-- хотя место еще есть

Total : 68021 bytes
Used  : 56977 bytes
Remain: 11044 bytes
т.е. сейчас мы безопасно можем использовать только 40-50k из 66.
Эксперимент покажет как обстоят дела с памятью бОльшего размера
 

pvvx

Активный участник сообщества
Последнее редактирование:
Сверху Снизу