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

UDK: Общие разговоры

Demon

New member
Спасибо, чет пока не получается :), перевожу, передергиваю, наверное не во время :) хотя что то там происходит, потому что АТ прошивка слетела, но ничего не появилось, буду разбираться, заказал адаптер многоногий,
можно же прошивку полученную в АЛЛ залить XTCOMом каким нибудь?
 

pvvx

Активный участник сообщества
Добавлю эту опцию в пример hello_world_optimized, что про эту опцию думает многоуважаемый pvvx ?
Ничего не меняет. Разница в размере кода и занимаемых сегментов памятей не отличается, что свидетельствует о том что никаких изменений нет.
"Исправить" работу транслятора в UDK можно таким ухищрением:
В eagle.rom.addr.v6.ld:
Код:
PROVIDE ( dport_    = 0x3ff00000);
PROVIDE ( io2_regs_    = 0x3ff20000);
PROVIDE ( uart0_    = 0x60000000);
PROVIDE ( spi1_        = 0x60000100);
PROVIDE ( spi0_        = 0x60000200);
PROVIDE ( gpio_        = 0x60000300);
PROVIDE ( timer_    = 0x60000600);
PROVIDE ( rtc_        = 0x60000700);
PROVIDE ( iomux_    = 0x60000800);
PROVIDE ( wdt_        = 0x60000900);
PROVIDE ( uart1_    = 0x60000F00);
PROVIDE ( rtc_ram_    = 0x60001000);
PROVIDE ( rtc_mem_    = 0x60001100);
PROVIDE ( io4_regs_    = 0x60009800);
Код:
extern volatile uint32 dport_[64];        // 0x3ff00000
extern volatile uint32 io2_regs_[1536]; // 0x3ff20000
extern volatile uint32 uart0_[64];        // 0x60000000
extern volatile uint32 spi1_[64];        // 0x60000100
extern volatile uint32 spi0_[64];        // 0x60000200
extern volatile uint32 gpio_[64];        // 0x60000300
extern volatile uint32 timer_[64];        // 0x60000600
extern volatile uint32 rtc_[64];        // 0x60000700
extern volatile uint32 iomux_[64];        // 0x60000800
extern volatile uint32 wdt_[64];        // 0x60000900
extern volatile uint32 sar_[64];        // 0x60000D00
extern volatile uint32 uart1_[64];        // 0x60000F00
extern volatile uint32 rtc_ram_[64];    // 0x60001000
extern volatile uint32 rtc_mem_[192];    // 0x60001100
extern volatile uint32 io4_regs_[384];    // 0x60009800
И преписыванием всех [HASHTAG]#define[/HASHTAG] и процедур работы с I/O. Я это уже проделал с в своем "SDK".
Это значительно улучшает работу транслятора, но только с I/O регистрами. При таком подходе мы имеем всего только описанные константы адресов баз областей регистров и они объединяются в прошивке. А доступ к регистрам I/O вынуждает транслятор производить со смешением от этих базовых адресов и выходит, что ему не требуется загрузка каждый раз в одной процедуре перед обращением к регистру I/O его непосредственного адреса для работы с ним по нулевому смещению и заполнению кода программ этими константами и загрузками регистров, а он берет уже загруженный регистр (из прошлого обращения, где грузился базовый адрес блока) и транслирует команду обращения по нему со смещением. По другому ему никак, т.к. адрес знает только линковщик, а вычислять смещения UDK транслятор умеет плохо, только если указан однородный массив - ему такие опции задал сборщик UDK - использовать при обращении только нулевое смещение и каждый раз грузить указатели на адрес обращения :) Но тут ничего не поделать - сборщик UDK говорит, что он не будет исправлять ничего пока ему в рот не положат что и как у него лично в его компе исправить при трансляции компилятора и не доплатят. :) Выходит, что UDK платный и проще использовать от xtensa.
Разница Итого в драйверах по скорости и размеру кода выходит огромная.
 
Последнее редактирование:

sherr

New member
Ну и там шьется же не 1, а 2 части при обычной прошивке. Не знаю точно, но есть вероятность, что и Reset нужно дергать дважды. Хотя тут могу врать...
Не нужно, шьёт обе части сразу, потом надо GPIO0 вернуть в <1> и опять ресет .
 

nikolz

Well-known member
Добрый день,
я правильно понял следующие результаты:
------------------------------
собираю пример help_word_cpp, получаю:
Total Used RAM : 39104 Free RAM : 42816 Free IRam : 6392
----------------------------
теперь собираем help_word_cpp_irom
-- это пример с оптимизацией - верно? получаю:
Total Used RAM : 39104 Free RAM : 42816 Free IRam : 6592
----------------------------------
Вопрос:
В результате оптимизации освободилось 200 байт. Правильно я понял?
Не могу понять сколь значимы такие ресурсы.
Буду признателен, если кто-нибудь придумает пример,
когда этих 200 байт не хватает либо на что их теперь хватит.
Спасибо
 

CHERTS

Moderator
Команда форума
Добрый день,
я правильно понял следующие результаты:
------------------------------
собираю пример help_word_cpp, получаю:
Total Used RAM : 39104 Free RAM : 42816 Free IRam : 6392
----------------------------
теперь собираем help_word_cpp_irom
-- это пример с оптимизацией - верно? получаю:
Total Used RAM : 39104 Free RAM : 42816 Free IRam : 6592
----------------------------------
Вопрос:
В результате оптимизации освободилось 200 байт. Правильно я понял?
Не могу понять сколь значимы такие ресурсы.
Буду признателен, если кто-нибудь придумает пример,
когда этих 200 байт не хватает либо на что их теперь хватит.
Спасибо
help_word_cpp и help_word_cpp_irom это по сути не оптимизация, просто в help_word_cpp_irom все по-умолчанию ложиться в IROM, в отличии от help_word_cpp, тем самым мы освобождаем IRAM для другого кода.
Для help_word_cpp 200 байт кажется мелочью, но для более существенных проектов выгода может быть гораздо больше.
 

CHERTS

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

Скажите конкретно, что исправить и я исправлю, скажите с какими опциями пересобрать GCC и я пересоберу, проблем в этом нет. Если Вы хотите часть пирога от пожертвования - нет проблем, пишите в личку, обсудим, договоримся, но вначале внесите изменения и опубликуйте их в официальном репозитарии.
Не хотите, не публикуйте, Выше право, но не нужно нести ахинею про платность UDK.
 

pvvx

Активный участник сообщества
pvvx Вы меня конечно простите, но Вы задолбали нести ахинею, что я только собираю бабло... Завидуйте молча, я Вам уже это говорил неоднократно.
Чему завидовать то? Кривому транслятору и 100 рупь пожертвований? :)
Скажите конкретно, что исправить и я исправлю, скажите с какими опциями пересобрать GCC и я пересоберу, проблем в этом нет..
Сборкой UDK я не занимаюсь. Что он делает не совсем правильно - указано до битика. Обходные решения тоже. Далее - шаг того, кто собирает UDK.
Если Вы хотите часть пирога от пожертвования - нет проблем, пишите в личку, обсудим, договоримся, но вначале внесите изменения и опубликуйте их в официальном репозитарии.
Не хотите, не публикуйте, Выше право, но не нужно нести ахинею про платность UDK.
Про платность вы сами писали - типа никто не платит... с напрашивающимся выводом (по контексту где про это писалось), что пока не оплатят ничего нового не будет :)
 

pvvx

Активный участник сообщества
Если возможно, поясните каким образом я могу реализовать эту оптимизацию в произвольном проекте.
Что для этого надо делать.
Спасибо
Если libc.a и libgcc.a заменены правильно (к примеру из моей свалки на libmc.a и libmgcc.a) то получаем так:
Free RAM : 39296
Free IRam : 10593
При стандартных либах libc.a и libgcc.a:
Free RAM : 39196
Free IRam : 5274
Т.е. разница в 10593 - 5274 + 39296 - 39196 = 5419 байт - это + 14% от доступной приложению памяти. При этом libc.a и libgcc.a используют другие библиотеки из SDK, а не ваш код. И в данном случае используется только минимальный комплект "очищенных" либ из SDK. При использовании стандартных либ от SDK разница будет ещё больше.
Если заменить libc.a и т.д. на библиотеку microc, то освобождается ещё больше и скорость исполнения кода увеличивается. Но с microc anakod ещё работает...
Libc.a - это для CИ, при С++ другая либа...
А что там в примере help_word_cpp в UDK - это соображения его создателя. При С++ оптимизация делается ещё больше, но уже для кода самого приложения. Часть есть и развивается в проекте ардуино-Sming
Некоторые проекты в UDK уже не влезают в IRAM без специальной libmgcc.a - пример
Перемещать коды либ libc.a, libgcc.a, ... в Flash нельзя - они используются (к примеру процедуру деления и т.д.) при запрете прерываний и "кеширования" flash в кодах помещаемых в IRAM из библиотек SDK Espressif. В связи с этим, такие предложения ведут к сложно уловимым глюкам...

Оптимизация самого транслятора, которую не хочет делать сборщик UDK дает ещё 10..20% уменьшения объему по коду и от 30% по скорости для драйверов... Он будет ссылаться на что угодно, но делать этого не станет :) Он жаждет, чтобы кто-то сделал альтернативную сборку нового UDK и все отказались от данного UDK
На что я сопротивляюсь и уже не знаю как ему ещё это донести, но он ссылается на какую-то “зависть”... :) :) :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Если я правильно понял, Вы писали,что АЦП в ESP реализован программно.
Интересно посмотреть.
Пример: https://github.com/mattcallow/esp8266-sdk/blob/master/apps/07switch/driver/adc.c
Это исходный китай-код и не очень правильный - вставлены задержки и прочее, т.к. программер из Espressif ничего не шарит в оборудовании... Данная процедура дублируется во всех SDK без изменений. Добавляется только коммутация по входу и выходу с отключением и включением WiFi...
Возможно ли увеличение разрядности за счет быстродействия и какой уровень шума предельный.
Шум никто не измерял. 14 бит дает сумма sar, которую считывает read_sar_dout() в виде 8 шт значений, если не обрезать 4 бита. https://github.com/mattcallow/esp8266-sdk/blob/master/apps/07switch/driver/adc.c#L63
Увеличение разрядности можно сделать увеличением кол-ва опросов. Оверсемплинг.
По умолчанию аппаратная скорость опроса/набора значений sar в SDK = 20кГц, но есть указания на bbpll_audio_clock, которую никто не изучал и не менял.
Время набора значений стартует после передергивания бита 1 в 0x60000D50 и ожидания исполнения - опускания трех бит 24..26 в while((SAR_BASE[20] >> 24) & 0x07); где SAR_BASE[20] это адрес 0x60000D50.
Вход sar коммутируемый к разным источникам.
Чтобы ничего не писать для анализа - в моей свалке Web есть непрерывное тестовое чтение 14 битных значений в WAV ~2 кило путем запроса http://sesp8266/adc.wav или http://aesp8266/adc.wav
Для правильной и безшумной оцифровки со стабильной дискретностью шага необходимо использовать прерывание таймера 0 и опроса готовых значений из sar в нем, а между процедурой таймера должна исполняться команда WAITI (Wait for Interrupt instruction) c запретом всех остальных прерываний на время измерения. При этом потребление модулем до 2 mA (зависит от частоты прерываний по таймеру - программный предел которых пару us и хватит для оцифровки до 500кГц, если перестроить audio pll), и никаких программных шумов в кристалле. Это возможно при своем загрузчике, отдельно от китай-SDK...
 
Последнее редактирование:

CHERTS

Moderator
Команда форума
Оптимизация самого транслятора, которую не хочет делать сборщик UDK дает ещё 10..20% уменьшения объему по коду и от 30% по скорости для драйверов... Он будет ссылаться на что угодно, но делать этого не станет :) Он жаждет, чтобы кто-то сделал альтернативную сборку нового UDK и все отказались от данного UDK
На что я сопротивляюсь и уже не знаю как ему ещё это донести, но он ссылается на какую-то “зависть”... :) :) :)
Почему же не хочу, очень даже хочу и немного сделал, см. новую версию DevKit v2.0.4

v2.0.4 (09.05.2015):
* Обновлен компилятор xtensa-lx106-gcc и xtensa-lx106-g++
Изменены опции сборки newlib, как следствие в прошивках увеличилось количество свободной IRAM.
Например в примере "examples\nodemcu-firmware\" на старом компиляторе Free IRam было 810 Байт, на новом Free IRam стало 2986 Байт (при отключеном LUA_USE_BUILTIN_MATH).
Так что уважаемый pvvx, не нужно нести всякую чепуху, что я стану делать или не стану, что я жажду и т.д.
Я вот месяц сижу без работы, меня сократили 31 марта, как Вы думаете, мне нужно зарабатывать и кормить семью (жену и ребенка) или ковыряться по ночам с UDK? Поэтому все Ваши умозаключения просто абсурдны.
 

aloika

Active member
Я вот месяц сижу без работы, меня сократили 31 марта
Вы сейчас работу ищете? Есть фирма, www.electrolab.ru, я там работаю, можно попробовать к нам устроиться. У нас есть очень интересные задачи. Напишите мне на karpesh@mail.ru, если интересно.
 

pvvx

Активный участник сообщества
Добрый день,
собрал в последней версии UDK nodeMCU и загрузил его в devkit
Но каково же было мое разочарование,
когда я увидел что сборка даже не на 0.9.6 а аж 0.9.5 (а я то ожидал увидеть 1.0.1)
Как бы исправить это, хотя бы на последнюю сборку на 0.9.6?
Спасибо
Только путем модификации либ. Не хватает IRAM, да самой RAM для nodeMCU с SDK от 1.0.0.
 

nikolz

Well-known member
еще получил следующее.
собираем в DevKit v2.0.4 nodeMCU загружаем в devkit -все прекрасно, heap-20320
А в последней версии nodemcu от китайцев имеем heap-20536
Как это понимать?.. мать...мать..(это эхо в интернете)
 

pvvx

Активный участник сообщества
еще получил следующее.
собираем в DevKit v2.0.4 nodeMCU загружаем в devkit -все прекрасно, heap-20320
А в последней версии nodemcu от китайцев имеем heap-20536
Как это понимать?.. мать...мать..(это эхо в интернете)
Код:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .irom0.text   0005ab96  40210000  40210000  0000bcd0  2**4
                  CONTENTS, ALLOC, LOAD, CODE
  1 .text         000074c0  40100000  40100000  00004804  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .data         00000ac8  3ffe8000  3ffe8000  000000e0  2**4
                  CONTENTS, ALLOC, LOAD, DATA
  3 .rodata       00003c54  3ffe8ad0  3ffe8ad0  00000bb0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .bss          00009c48  3ffec728  3ffec728  00004808  2**4
                  ALLOC
------------------------------------------------------------------------------
Section info:
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE8AC8|    2760
    rodata|           ReadOnly Data (RAM)|    3FFE8AD0|    3FFEC724|   15444
       bss|      Uninitialized Data (RAM)|    3FFEC728|    3FFF6370|   40008
      text|            Cached Code (IRAM)|    40100000|    401074C0|   29888
irom0_text|           Uncached Code (SPI)|    40210000|    4026AB96|  371606
Total Used RAM : 58212
Free RAM : 23708
Free IRam : 2898
------------------------------------------------------------------------------
Building on SDK 1.0.1 (c) pvvx :p
Всё с SDK 1.0.1 родное, Lwip и т.д.... Т.е. все фичи нового SDK должны работать. Код Си не трогал, а там тьму оптимизации можно сделать, изменил только makefile.
Не включайте сразу AP+ST, каждая отъедает от heap ~1.5кило. Включите только ST к примеру и перезагрузите модуль. Будет на 1.5 кило больше, за счет не включенной AP.
 

Вложения

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

nikolz

Well-known member
pvvx,
дело в том, что когда я собираю то тоже вижу аж FREE RAM 28692 свободного RAM,
но в nodemcu они превращаются в 20320. а в последней версии от китайцев на 216 байт больше.
--------------------------
следовательно с SDK 1.0 FREE RAM 23708 превратятся в 18700.
Вопрос: Чем лучше будет SDK 1.0( иначе сказать какие ошибки устранятся)?.
---------------------------
Если я в makefile заменю
SDK_BASE ?= c:/Espressif/ESP8266_SDK_095
на
SDK_BASE ?= c:/Espressif/ESP8266_SDK
получаю ошибки при сборке
-----------------------
Что надо исправить в makefile nodemcu чтобы собрать сSDK 1.0?
Спасибо
 

pvvx

Активный участник сообщества
дело в том, что когда я собираю то тоже вижу аж 28692 свободного RAM,
но в nodemcu они превращаются в 20320. а в последней версии от китайцев на 216 байт больше.
--------------------------
следовательно с SDK 1.0 RAM 23708 превратятся в 18700.
Это сложно сказать. Разные SDK по разному используют heap при инициализации. Новые - вроде меньше, но у них static данные уже больше занимают.
Вопрос: Чем лучше будет SDK 1.0( иначе сказать какие ошибки устранятся)?.
Около сотен глобальных ошибок по сравнению с SDK 0.9.5... Изменены методы, добавок много, но много ненужных никому - типа китайских плюсиков и галочек что у них теперь это есть, и встроено навечно и не выковырять, хотя исходники этих добавок лежат в примерах к Lwip и т.д. прилепляются без изменений кода - просто вставкой файлов исходников :) Так-же туда, в китай-SDK всунуты примеры, которые надо немного править, чтобы они работали правильно. Но это не сделано - им лиш-бы впихнуть до предела и в либах бездарно лежат куски, которые не работают. Пример - netio.c + netio.h, ping.h + ping.c, ... от оф.примеров к Lwip. В последний SDK они всунули громадный mdns - он тоже есть в опен-сорцах :)
Что надо исправить в makefile nodemcu чтобы собрать сSDK 1.0?
Многое :).
 
Последнее редактирование:

pvvx

Активный участник сообщества
pvvx,
а можно одним файлом?
или сколько файлов грузить? и с каких адресов?
спасибо
Всё же указано в ld и в названии файлов. Я базу ld не менял, менял только eagle.rom.addr.v6.ld - с побольше описанными функциями и данными от ROM-BIOS....
0x00000 ->0x00000.bin, 0x10000->0x10000.bin, 0x7c000->esp_init_data_default.bin, 0x7e000->blank.bin
Так указано в make и у меня загрузилось :) Написало:
NodeMCU 0.9.5 build 20150318 powered by Lua 5.1.4
Hello, world.
>
Больше я ничего не проверял :) У меня нет программ загрузчиков и правки Lua...
0.9.5 прописано в коде [HASHTAG]#define[/HASHTAG] NODE_VERSION "NodeMCU 0.9.5" [HASHTAG]#define[/HASHTAG] BUILD_DATE "build 20150318"
Как реально спросить версию SDK в Lua я не знаю. С момента 0.9.5 это (запрос версии) в SDK изменено. Теперь это лежит строкой в сегменте rodata: 1.0.1 Apr 24 2015 19:31:11
 
Последнее редактирование:
Сверху Снизу