• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

UDK: Общие баги/глюки/проблемы

alexhi

Member
Поставил UDK 2.0.6 при компиляции пишет:
C:/Espressif/examples/blinky/Makefile:225: recipe for target 'build/app.out' failed
mingw32-make.exe: *** [build/app.out] Error -2146232576

В чем может быть дело?

Отвечу сам себе,может у кого то тоже вылезет
закоментил строку в makefile
#$(Q) $(SDK_TOOLS)/memanalyzer.exe $(OBJDUMP).exe $@
и все заработало. Почему не знаю.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Есть глюк у esptool и он проявляется при компиляции с указанием ошибки в строке 666 :)
Что-то не стыкуется с форматом int в 16-тиричом формате в elf - связана с некорректным разбором формата elf. Устраняется только изменением проекта и новой компиляцией.
Лог не прилагаю, т.к. ошибка не частая и она в глубинах обработчиков...

Так-же есть глобальная ошибка в компиляторе UDK - компиляция с опций -Os дает неработающий код для ESP8266. В основном это проявляется на больших проектах, а не в HelloWord.
И размер кода при -O2 в UDK выходит меньше, чем при -O3. Тоже странность.
 
Последнее редактирование:

alexhi

Member
Поставил UDK 2.0.6 при компиляции пишет:
C:/Espressif/examples/blinky/Makefile:225: recipe for target 'build/app.out' failed
mingw32-make.exe: *** [build/app.out] Error -2146232576

В чем может быть дело?

Отвечу сам себе,может у кого то тоже вылезет
закоментил строку в makefile
#$(Q) $(SDK_TOOLS)/memanalyzer.exe $(OBJDUMP).exe $@
и все заработало. Почему не знаю.
"Зуда" почему? сработала :) . Memanalyzer.exe не захотел работать с NET 4.0,поставил NET3.5 все заработало.(Windows XP SP3)
 

pvvx

Активный участник сообщества
Вот глюк 666 (опять поймал - никак не создать bin):
Код:
c:/Espressif/utils/esptool.exe elf2image .output/eagle/debug/image/eagle.app.v6.out -o ..//bin//
Traceback (most recent call last):
  File "esptool.py", line 666, in <module>
  File "esptool.py", line 429, in get_symbol_addr
  File "esptool.py", line 426, in _fetch_symbols
ValueError: invalid literal for int() with base 16: 'U'
../Makefile:181: recipe for target '.output/eagle/debug/bin/eagle.app.v6.bin' failed
 

jcmvbkbc

New member
Вот глюк 666 (опять поймал - никак не создать bin):
Код:
c:/Espressif/utils/esptool.exe elf2image .output/eagle/debug/image/eagle.app.v6.out -o ..//bin//
Traceback (most recent call last):
  File "esptool.py", line 666, in <module>
  File "esptool.py", line 429, in get_symbol_addr
  File "esptool.py", line 426, in _fetch_symbols
ValueError: invalid literal for int() with base 16: 'U'
../Makefile:181: recipe for target '.output/eagle/debug/bin/eagle.app.v6.bin' failed
Попробуй применить следующий дифф к функции _fetch_symbols:
Код:
diff --git a/esptool.py b/esptool.py
index 93ab071..2a83193 100755
--- a/esptool.py
+++ b/esptool.py
@@ -340,7 +340,10 @@ class ELFFile:
             sys.exit(1)
         for l in proc.stdout:
             fields = l.strip().split()
-            self.symbols[fields[2]] = int(fields[0], 16)
+            try:
+                self.symbols[fields[2]] = int(fields[0], 16)
+            except:
+                print "Ignoring "+l
     def get_symbol_addr(self, sym):
         self._fetch_symbols()
 

pvvx

Активный участник сообщества
Попробуй применить следующий дифф к функции _fetch_symbols:
Буфера у питона по умолчанию не хватает. Надо что-то менять полностью. В stdout вывод длится несколько секунд :) Пока xtensa-lx106-elf-nm.exe отсортирует, пока выведет... а цикла нема.
proc.stdout.readline() тоже самое - затягивает малый кусок...
На proc.wait() висит, распечатав начало.
Я уже помучал:
Код:
    def _fetch_symbols(self):

        if self.symbols is not None:
            return
        self.symbols = {}
        try:
            tool_nm = "C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe"
            if os.getenv('XTENSA_CORE')=='lx106':
                tool_nm = "xt-nm"
            tmpsection = tempfile.mktemp(suffix=".symbol")

            proc = subprocess.Popen([tool_nm, "-g", self.name], stdout=subprocess.PIPE)
            l = ' '
            while l:
                l = proc.stdout.readline()
                fields = l.strip().split()
                if len(fields) >= 2:
                   print("Symbol %s = %s " % (fields[2], fields[0]))
                try:
                   self.symbols[fields[2]] = int(fields[0], 16)
                except ValueError as verr:
                   print("Se %s = %s ? %s" % (fields[1], fields[0], str(self.symbols)))
                   pass
                except Exception as ex:
                   print("Sy %s = %s ? %s" % (fields[1], fields[0], str(self.symbols)))
                   pass
        except OSError:
            print "Error calling "+tool_nm+", do you have Xtensa toolchain in PATH?"
            sys.exit(1)
и бросил этот кусок, надо другим методом... проще через файл... т.к. похоже, что лажает xtensa-lx106-elf-nm.exe
Это работает всегда:
Код:
cmd = 'C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe -g ' + elf_file + ' > eagle.app.sym'
#print cmd
os.system(cmd)

fp = file('./eagle.app.sym')
if fp is None:
    print "open sym file error\n"
    exit

lines = fp.readlines()

fp.close()

entry_addr = None
p = re.compile('(\w*)(\sT\s)(call_user_start)$')
for line in lines:
    m = p.search(line)
    if m != None:
        entry_addr = m.group(1)
        #entry_addr = int(entry_addr, 16)
        print entry_addr

if entry_addr is None:
    print 'no entry point!!'
    exit
:)
 
Последнее редактирование:

nikolz

Well-known member
Есть глюк у esptool и он проявляется при компиляции с указанием ошибки в строке 666 :)
Что-то не стыкуется с форматом int в 16-тиричом формате в elf - связана с некорректным разбором формата elf. Устраняется только изменением проекта и новой компиляцией.
Лог не прилагаю, т.к. ошибка не частая и она в глубинах обработчиков...

Так-же есть глобальная ошибка в компиляторе UDK - компиляция с опций -Os дает неработающий код для ESP8266. В основном это проявляется на больших проектах, а не в HelloWord.
И размер кода при -O2 в UDK выходит меньше, чем при -O3. Тоже странность.
У меня компиляция с опций -Os дает работающий код для ESP8266. А размер кода при -O2 в UDK выходит больше.
 

pvvx

Активный участник сообщества
Починил по быстрому:
Код:
    def _fetch_symbols(self):
        if self.symbols is not None:
            return
        self.symbols = {}
        fname = os.getenv('TEMP');
        if fname == None:
                  fname = '.'
        fname += '\\eagle.app.sym'
        cmd = 'C:\\Espressif\\xtensa-lx106-elf\\bin\\xtensa-lx106-elf-nm.exe -g ' + self.name + ' >'+fname
        print cmd
        os.system(cmd)
        fps = file(fname)
        if fps is None:
            print "open sym file error\n"
            exit(1)
        lines = fps.readlines()
        fps.close()
        for l in lines:
           fields = l.strip().split()
           try:
              self.symbols[fields[2]] = int(fields[0], 16)
           except ValueError as verr:
              pass  
           except Exception as ex:
              pass
Теперь работает.
 

pvvx

Активный участник сообщества
У меня компиляция с опций -Os дает работающий код для ESP8266. А размер кода при -O2 в UDK выходит больше.
Вам же там описано - для ваших проектов "HelloWord" это безразлично, как и последняя, уже исправленная ошибка в esptool.py. Вам хватит для os_printf("HelloWord") буфера для всех символов :)
Затем откройте online-справочник по gcc и прочитайте на какие опции отличается трансляция кода с -Os. Возможно через несколько лет придет понимание :)
Потом странслируйте код и побольше (возьмите у кого-нить) и сравните размер у -O2 + опции и -O3. Потом пишите чего нить :)
 
Последнее редактирование:

nikolz

Well-known member
Вам же там описано - для ваших проектов "HelloWord" это безразлично, как и последняя, уже исправленная ошибка в esptool.py. Вам хватит для os_printf("HelloWord") буфера для всех символов :)
Затем откройте online-справочник по gcc и прочитайте на какие опции отличается трансляция кода с -Os. Возможно через несколько лет придет понимание :)
Потом странслируйте код и побольше (возьмите у кого-нить) и сравните размер у -O2 + опции и -O3. Потом пишите чего нить :)
Это Вы очевидно с собой говорите в зеркало.
Да так и до маразма не долго.
А если Вам интересно, Что я собираю, то собираю NODEMCU китайское и памяти больше получается чем у Вас.
Но Вы продолжайте и далее беседовать с зеркалом.
Вам не привыкать.
 

nikolz

Well-known member
pvvx,
посмотрите что сделал китаец и раньше Вас.
А Вы все д-мом исходите
Вот так распределена память в NODEMCU от 27.06.2015
Все константы переброшены во флеш.
Пожалуй больше RAM уже не освободишь.
------------------------------------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8B44| 2884
rodata| ReadOnly Data (RAM)| 3FFE8B44| 3FFE8B4C| 8
bss| Uninitialized Data (RAM)| 3FFE8B50| 3FFF1A80| 36656
text| Cached Code (IRAM)| 40100000| 401079E4| 31204
irom0_text| Uncached Code (SPI)| 40210000| 4026D6EC| 382700
Total Used RAM : 39548
Free RAM : 42372
Free IRam : 1582
------------------------------------------------------------------------------
 

pvvx

Активный участник сообщества
pvvx,
посмотрите что сделал китаец и раньше Вас.
А Вы все д-мом исходите
Вот так распределена память в NODEMCU от 27.06.2015
Все константы переброшены во флеш.
Пожалуй больше RAM уже не освободишь.
------------------------------------------------------------------------------
Section info:
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE8B44| 2884
rodata| ReadOnly Data (RAM)| 3FFE8B44| 3FFE8B4C| 8
bss| Uninitialized Data (RAM)| 3FFE8B50| 3FFF1A80| 36656
text| Cached Code (IRAM)| 40100000| 401079E4| 31204
irom0_text| Uncached Code (SPI)| 40210000| 4026D6EC| 382700
Total Used RAM : 39548
Free RAM : 42372
Free IRam : 1582
------------------------------------------------------------------------------
На это вам тоже уже отвечал. Такое решение не применимо - ведет к ошибкам при чтении и записи flash. Вы же не знаете реализацию :p И она опубликована давно и у всех, кроме вас было время подумать и проверить.
Пока только мой вариант работает c тем тормозным методом прерываниям с "протектед" и восстановлением по обращению к каждому байту размешенному в flash или в IRAM.
У меня всё уже давно размещено в IRAM и ошибок, как у NodeMCU при чтении/записи Flash данный метод не вызывает :p IRAM не отключается на ходу и пока только в моих проектах её много - 48 килобайт.
Мап-файл с постепенно перерабатываемым проектом EspLua.ru лежит тут.
И отличий там больше, но мне лень даже перечислять, не то что делать. Как нибудь почуток доделаю, т.к. в других проектах многое уже реализовал, но туда не впихнул.
Основные отличия пока такие (об остальных пока умолчу - нефиг вам знать):
Общей свободной памяти больше, чем в NodeMCU, хотя используется полный SDK 1.1.2.
Загрузка до старта кода в 10 раз быстрее. Spiffs работает на 16 Мегабайт flash и тоже в десятки раз быстрее...
PS: проект EspLua был затеян для того, чтобы вынудить авторов NodeMCU хоть что-то сделать. Подвижки уже есть, но как-всегда - кривые...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Начни с себя, узнай как в твоей ОС работают пайпы, это может пригодиться в будущем.
Пипа работает в зависимости от опций задаваемых в Popen. Там задается и размер буфера и есть ли он вообще.
Так что вам уже поздно по аналогии рекомендовать "Начните с себя" :)
Факт в том, что проблема не в int(fields[0], 16), а в том что не все переменные передаются, если их много. Или конкретнее - esptool.py в связке со всем остальным имеет ошибку и исправление уже дано https://github.com/pvvx/esp8266web/blob/master/esptool.py.
 
Последнее редактирование:

jcmvbkbc

New member
Пипа работает в зависимости от опций задаваемых в Popen. Там задается и размер буфера и есть ли он вообще.
Факт в том, что проблема не в int(fields[0], 16), а в том что не все переменные передаются, если их много.
С невозмутимым видом нести ахинею -- это не талант.
Неумение отличать пайпы ОС от обёрток языка -- это, наверно, от неумения читать. Незнание того, на что влияет размер буфера языка можно списать на общую необразованность.
А говорить о фактах, даже не удосужившись заглянуть в вывод nm, чтобы увидеть как отображаются weak-символы (подсказка:
Код:
402620d0 A _irom0_text_end
40240000 A _irom0_text_start
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
) -- это п****больство.

pvvx, ты п****бол?
 

pvvx

Активный участник сообщества
С невозмутимым видом нести ахинею -- это не талант.
Неумение отличать пайпы ОС от обёрток языка -- это, наверно, от неумения читать. Незнание того, на что влияет размер буфера языка можно списать на общую необразованность.
А говорить о фактах, даже не удосужившись заглянуть в вывод nm, чтобы увидеть как отображаются weak-символы (подсказка:
Код:
402620d0 A _irom0_text_end
40240000 A _irom0_text_start
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
) -- это п****больство.

pvvx, ты п****бол?
Сделайте вывод символов в питоне и поймете что вы дебил :)
proc = subprocess.Popen([tool_nm, '-g', self.name], stdout=subprocess.PIPE)
 
Последнее редактирование:

jcmvbkbc

New member
pvvx, ты свои правки в апстрим предложи, вместо того чтобы с дебилом пререкаться
 

pvvx

Активный участник сообщества
pvvx, ты свои правки в апстрим предложи, вместо того чтобы с дебилом пререкаться
Я и так дал работающий вариант. Вам что-то не нравится?
Проблема была объявлена и решена. Решений может быть множество.
И в таблице есть и undefined symbols = U - это на котором спотыкалось в примере к объявлению ошибки :p
 
Последнее редактирование:

jcmvbkbc

New member
Я и так дал работающий вариант. Вам что-то не нравится?
Мне не нравится твоё хитрож***е п****больство.
И в таблице есть и undefined symbols = U - это на котором спотыкалось в примере к объявлению ошибки
Вот молодец, теперь осталось признать, что с пайпами все было в порядке с самого начала -- и ты на пути к выздоровлению.
 

pvvx

Активный участник сообщества
Вот молодец, теперь осталось признать, что с пайпами все было в порядке с самого начала -- и ты на пути к выздоровлению.
class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None,creationflags=0)
Выздоравливайте :)
Первым делом было вставлено:
Код:
            try:
               self.symbols[fields[2]] = int(fields[0], 16)
            except ValueError as verr:
               pass  
            except Exception as ex:
               pass
 
Сверху Снизу