mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
feat(idf_monitor): move idf_monitor to separate repo
This commit is contained in:
parent
4e2c6ac993
commit
3e3533f918
3
.gitignore
vendored
3
.gitignore
vendored
@ -61,9 +61,6 @@ tools/test_apps/**/build_*_*/
|
|||||||
tools/test_apps/**/sdkconfig
|
tools/test_apps/**/sdkconfig
|
||||||
tools/test_apps/**/sdkconfig.old
|
tools/test_apps/**/sdkconfig.old
|
||||||
|
|
||||||
# IDF monitor test
|
|
||||||
tools/test_idf_monitor/outputs
|
|
||||||
|
|
||||||
TEST_LOGS
|
TEST_LOGS
|
||||||
|
|
||||||
# gcov coverage reports
|
# gcov coverage reports
|
||||||
|
@ -146,18 +146,6 @@ test_certificate_bundle_on_host:
|
|||||||
- cd components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/
|
- cd components/mbedtls/esp_crt_bundle/test_gen_crt_bundle/
|
||||||
- ./test_gen_crt_bundle.py
|
- ./test_gen_crt_bundle.py
|
||||||
|
|
||||||
test_idf_monitor:
|
|
||||||
extends: .host_test_template
|
|
||||||
artifacts:
|
|
||||||
# save artifacts always in order to access results which were retried without consequent failure
|
|
||||||
when: always
|
|
||||||
paths:
|
|
||||||
- tools/test_idf_monitor/outputs/*
|
|
||||||
expire_in: 1 week
|
|
||||||
script:
|
|
||||||
- eval $($IDF_PATH/tools/idf_tools.py export)
|
|
||||||
- cd ${IDF_PATH}/tools/test_idf_monitor
|
|
||||||
- ./run_test_idf_monitor.py
|
|
||||||
|
|
||||||
test_idf_size:
|
test_idf_size:
|
||||||
extends: .host_test_template
|
extends: .host_test_template
|
||||||
|
@ -129,9 +129,7 @@
|
|||||||
- "tools/esp_app_trace/**/*"
|
- "tools/esp_app_trace/**/*"
|
||||||
- "tools/ldgen/**/*"
|
- "tools/ldgen/**/*"
|
||||||
|
|
||||||
- "tools/idf_monitor_base/*"
|
|
||||||
- "tools/idf_monitor.py"
|
- "tools/idf_monitor.py"
|
||||||
- "tools/test_idf_monitor/**/*"
|
|
||||||
|
|
||||||
- "tools/idf.py"
|
- "tools/idf.py"
|
||||||
- "tools/idf_py_actions/**/*"
|
- "tools/idf_py_actions/**/*"
|
||||||
|
@ -11,14 +11,12 @@ repos:
|
|||||||
# 1 - some file extensions
|
# 1 - some file extensions
|
||||||
# 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always)
|
# 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always)
|
||||||
# 3 - any directory named 'testdata'
|
# 3 - any directory named 'testdata'
|
||||||
# 4 - IDF monitor test data
|
# 4 - protobuf auto-generated files
|
||||||
# 5 - protobuf auto-generated files
|
|
||||||
exclude: &whitespace_excludes |
|
exclude: &whitespace_excludes |
|
||||||
(?x)^(
|
(?x)^(
|
||||||
.+\.(md|rst|map|bin)|
|
.+\.(md|rst|map|bin)|
|
||||||
.+test.*\/.*expected.*|
|
.+test.*\/.*expected.*|
|
||||||
.+\/testdata\/.+|
|
.+\/testdata\/.+|
|
||||||
.+test_idf_monitor\/tests\/.+|
|
|
||||||
.*_pb2.py|
|
.*_pb2.py|
|
||||||
.*.pb-c.h|
|
.*.pb-c.h|
|
||||||
.*.pb-c.c|
|
.*.pb-c.c|
|
||||||
|
@ -89,7 +89,7 @@ You don't need to run `idf.py build` before running `idf.py flash`, `idf.py flas
|
|||||||
|
|
||||||
## Viewing Serial Output
|
## Viewing Serial Output
|
||||||
|
|
||||||
The `idf.py monitor` target uses the [idf_monitor tool](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html) to display serial output from Espressif SoCs. idf_monitor also has a range of features to decode crash output and interact with the device. [Check the documentation page for details](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html).
|
The `idf.py monitor` target uses the [esp-idf-monitor tool](https://github.com/espressif/esp-idf-monitor) to display serial output from Espressif SoCs. esp-idf-monitor also has a range of features to decode crash output and interact with the device. [Check the documentation page for details](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/idf-monitor.html).
|
||||||
|
|
||||||
Exit the monitor by typing Ctrl-].
|
Exit the monitor by typing Ctrl-].
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ endif()
|
|||||||
set(ESPTOOLPY ${python} "$ENV{ESPTOOL_WRAPPER}" "${CMAKE_CURRENT_LIST_DIR}/esptool/esptool.py" --chip ${chip_model})
|
set(ESPTOOLPY ${python} "$ENV{ESPTOOL_WRAPPER}" "${CMAKE_CURRENT_LIST_DIR}/esptool/esptool.py" --chip ${chip_model})
|
||||||
set(ESPSECUREPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espsecure.py")
|
set(ESPSECUREPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espsecure.py")
|
||||||
set(ESPEFUSEPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espefuse.py")
|
set(ESPEFUSEPY ${python} "${CMAKE_CURRENT_LIST_DIR}/esptool/espefuse.py")
|
||||||
set(ESPMONITOR ${python} "${idf_path}/tools/idf_monitor.py")
|
set(ESPMONITOR ${python} -m esp_idf_monitor)
|
||||||
set(ESPTOOLPY_CHIP "${chip_model}")
|
set(ESPTOOLPY_CHIP "${chip_model}")
|
||||||
|
|
||||||
if(NOT CONFIG_APP_BUILD_TYPE_RAM AND CONFIG_APP_BUILD_GENERATE_BINARIES)
|
if(NOT CONFIG_APP_BUILD_TYPE_RAM AND CONFIG_APP_BUILD_GENERATE_BINARIES)
|
||||||
|
@ -4,7 +4,7 @@ IDF Monitor
|
|||||||
|
|
||||||
:link_to_translation:`zh_CN:[中文]`
|
:link_to_translation:`zh_CN:[中文]`
|
||||||
|
|
||||||
IDF Monitor is mainly a serial terminal program which relays serial data to and from the target device's serial port. It also provides some IDF-specific features.
|
IDF Monitor uses the esp-idf-monitor_ package as a serial terminal program which relays serial data to and from the target device's serial port. It also provides some IDF-specific features.
|
||||||
|
|
||||||
IDF Monitor can be launched from an IDF project by running ``idf.py monitor``.
|
IDF Monitor can be launched from an IDF project by running ``idf.py monitor``.
|
||||||
|
|
||||||
@ -182,12 +182,12 @@ To decode each address, IDF Monitor runs the following command in the background
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Set environment variable ``ESP_MONITOR_DECODE`` to ``0`` or call idf_monitor.py with specific command line option: ``idf_monitor.py --disable-address-decoding`` to disable address decoding.
|
Set environment variable ``ESP_MONITOR_DECODE`` to ``0`` or call esp_idf_monitor with specific command line option: ``python -m esp_idf_monitor --disable-address-decoding`` to disable address decoding.
|
||||||
|
|
||||||
Target Reset on Connection
|
Target Reset on Connection
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
By default, IDF Monitor will reset the target when connecting to it. The reset of the target chip is performed using the DTR and RTS serial lines. To prevent IDF Monitor from automatically resetting the target on connection, call IDF Monitor with the ``--no-reset`` option (e.g., ``idf_monitor.py --no-reset``).
|
By default, IDF Monitor will reset the target when connecting to it. The reset of the target chip is performed using the DTR and RTS serial lines. To prevent IDF Monitor from automatically resetting the target on connection, call IDF Monitor with the ``--no-reset`` option (e.g., ``idf.py monitor --no-reset``).
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -281,6 +281,7 @@ Issues Observed on Windows
|
|||||||
- When "gdb" is run, it might stall for a short time before it begins communicating with the GDBStub.
|
- When "gdb" is run, it might stall for a short time before it begins communicating with the GDBStub.
|
||||||
|
|
||||||
.. _addr2line: https://sourceware.org/binutils/docs/binutils/addr2line.html
|
.. _addr2line: https://sourceware.org/binutils/docs/binutils/addr2line.html
|
||||||
|
.. _esp-idf-monitor: https://github.com/espressif/esp-idf-monitor
|
||||||
.. _gdb: https://sourceware.org/gdb/download/onlinedocs/
|
.. _gdb: https://sourceware.org/gdb/download/onlinedocs/
|
||||||
.. _pySerial: https://github.com/pyserial/pyserial
|
.. _pySerial: https://github.com/pyserial/pyserial
|
||||||
.. _miniterm: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.miniterm
|
.. _miniterm: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.miniterm
|
||||||
|
@ -21,7 +21,7 @@ Line editing feature lets users compose commands by typing them, erasing symbols
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
This feature relies on ANSI escape sequence support in the terminal application. As such, serial monitors which display raw UART data can not be used together with the line editing library. If you see ``[6n`` or similar escape sequence when running :example:`system/console` example instead of a command prompt (e.g. ``esp>`` ), it means that the serial monitor does not support escape sequences. Programs which are known to work are GNU screen, minicom, and idf_monitor.py (which can be invoked using ``idf.py monitor`` from project directory).
|
This feature relies on ANSI escape sequence support in the terminal application. As such, serial monitors which display raw UART data can not be used together with the line editing library. If you see ``[6n`` or similar escape sequence when running :example:`system/console` example instead of a command prompt (e.g. ``esp>`` ), it means that the serial monitor does not support escape sequences. Programs which are known to work are GNU screen, minicom, and esp-idf-monitor (which can be invoked using ``idf.py monitor`` from project directory).
|
||||||
|
|
||||||
Here is an overview of functions provided by `linenoise <https://github.com/antirez/linenoise>`_ library.
|
Here is an overview of functions provided by `linenoise <https://github.com/antirez/linenoise>`_ library.
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
cd build
|
cd build
|
||||||
python $IDF_PATH/components/esptool_py/esptool/esptool.py -p $1 write_flash @flash_project_args
|
python $IDF_PATH/components/esptool_py/esptool/esptool.py -p $1 write_flash @flash_project_args
|
||||||
python $IDF_PATH/tools/idf_monitor.py -p $1 idf_as_lib.elf
|
python -m esp_idf_monitor -p $1 idf_as_lib.elf
|
||||||
|
@ -129,7 +129,7 @@ esp32>
|
|||||||
|
|
||||||
The ``initialize_console()`` function in the example configures some aspects of UART relevant to the operation of the console.
|
The ``initialize_console()`` function in the example configures some aspects of UART relevant to the operation of the console.
|
||||||
|
|
||||||
- **Line Endings**: The default line endings are configured to match those expected/generated by common serial monitor programs, such as `screen`, `minicom`, and the `idf_monitor.py` included in the SDK. The default behavior for these commands are:
|
- **Line Endings**: The default line endings are configured to match those expected/generated by common serial monitor programs, such as `screen`, `minicom`, and the `esp-idf-monitor` included in the SDK. The default behavior for these commands are:
|
||||||
- When 'enter' key is pressed on the keyboard, `CR` (0x13) code is sent to the serial device.
|
- When 'enter' key is pressed on the keyboard, `CR` (0x13) code is sent to the serial device.
|
||||||
- To move the cursor to the beginning of the next line, serial device needs to send `CR LF` (0x13 0x10) sequence.
|
- To move the cursor to the beginning of the next line, serial device needs to send `CR LF` (0x13 0x10) sequence.
|
||||||
|
|
||||||
|
@ -1720,7 +1720,6 @@ tools/test_apps/system/panic/panic_tests.py
|
|||||||
tools/test_apps/system/panic/test_panic_util/test_panic_util.py
|
tools/test_apps/system/panic/test_panic_util/test_panic_util.py
|
||||||
tools/test_apps/system/startup/app_test.py
|
tools/test_apps/system/startup/app_test.py
|
||||||
tools/test_apps/system/startup/main/test_startup_main.c
|
tools/test_apps/system/startup/main/test_startup_main.c
|
||||||
tools/test_idf_monitor/dummy.c
|
|
||||||
tools/unit-test-app/components/test_utils/ccomp_timer.c
|
tools/unit-test-app/components/test_utils/ccomp_timer.c
|
||||||
tools/unit-test-app/components/test_utils/include/ccomp_timer.h
|
tools/unit-test-app/components/test_utils/include/ccomp_timer.h
|
||||||
tools/unit-test-app/components/test_utils/private_include/ccomp_timer_impl.h
|
tools/unit-test-app/components/test_utils/private_include/ccomp_timer_impl.h
|
||||||
|
@ -109,7 +109,6 @@ tools/mkuf2.py
|
|||||||
tools/python_version_checker.py
|
tools/python_version_checker.py
|
||||||
tools/set-submodules-to-github.sh
|
tools/set-submodules-to-github.sh
|
||||||
tools/test_apps/system/no_embedded_paths/check_for_file_paths.py
|
tools/test_apps/system/no_embedded_paths/check_for_file_paths.py
|
||||||
tools/test_idf_monitor/run_test_idf_monitor.py
|
|
||||||
tools/test_idf_py/test_hints.py
|
tools/test_idf_py/test_hints.py
|
||||||
tools/test_idf_py/test_idf_py.py
|
tools/test_idf_py/test_idf_py.py
|
||||||
tools/test_idf_size/test.sh
|
tools/test_idf_size/test.sh
|
||||||
|
@ -211,8 +211,6 @@ tools/test_apps/system/panic/app_test.py
|
|||||||
tools/test_apps/system/panic/panic_tests.py
|
tools/test_apps/system/panic/panic_tests.py
|
||||||
tools/test_apps/system/panic/test_panic_util/test_panic_util.py
|
tools/test_apps/system/panic/test_panic_util/test_panic_util.py
|
||||||
tools/test_apps/system/startup/app_test.py
|
tools/test_apps/system/startup/app_test.py
|
||||||
tools/test_idf_monitor/idf_monitor_wrapper.py
|
|
||||||
tools/test_idf_monitor/run_test_idf_monitor.py
|
|
||||||
tools/test_idf_py/extra_path/some_ext.py
|
tools/test_idf_py/extra_path/some_ext.py
|
||||||
tools/test_idf_py/idf_ext.py
|
tools/test_idf_py/idf_ext.py
|
||||||
tools/test_idf_py/test_idf_extensions/test_ext/test_extension.py
|
tools/test_idf_py/test_idf_extensions/test_ext/test_extension.py
|
||||||
|
@ -104,7 +104,7 @@ function(paths_with_spaces_to_list variable_name)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
#
|
#
|
||||||
# Output the built components to the user. Generates files for invoking idf_monitor.py
|
# Output the built components to the user. Generates files for invoking esp_idf_monitor
|
||||||
# that doubles as an overview of some of the more important build properties.
|
# that doubles as an overview of some of the more important build properties.
|
||||||
#
|
#
|
||||||
function(__project_info test_components)
|
function(__project_info test_components)
|
||||||
|
370
tools/idf_monitor.py
Executable file → Normal file
370
tools/idf_monitor.py
Executable file → Normal file
@ -1,377 +1,11 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#
|
#
|
||||||
# esp-idf serial output monitor tool. Does some helpful things:
|
# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||||
# - Looks up hex addresses in ELF file with addr2line
|
|
||||||
# - Reset ESP32 via serial RTS line (Ctrl-T Ctrl-R)
|
|
||||||
# - Run flash build target to rebuild and flash entire project (Ctrl-T Ctrl-F)
|
|
||||||
# - Run app-flash build target to rebuild and flash app only (Ctrl-T Ctrl-A)
|
|
||||||
# - If gdbstub output is detected, gdb is automatically loaded
|
|
||||||
# - If core dump output is detected, it is converted to a human-readable report
|
|
||||||
# by espcoredump.py.
|
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
# Contains elements taken from miniterm "Very simple serial terminal" which
|
|
||||||
# is part of pySerial. https://github.com/pyserial/pyserial
|
|
||||||
# (C)2002-2015 Chris Liechti <cliechti@gmx.net>
|
|
||||||
#
|
|
||||||
# Originally released under BSD-3-Clause license.
|
|
||||||
#
|
|
||||||
|
|
||||||
import codecs
|
|
||||||
import io
|
|
||||||
import os
|
|
||||||
import queue
|
|
||||||
import re
|
|
||||||
import shlex
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
from typing import Any, List, Optional, Type, Union
|
|
||||||
|
|
||||||
import serial
|
|
||||||
import serial.tools.list_ports
|
|
||||||
# Windows console stuff
|
|
||||||
from idf_monitor_base.ansi_color_converter import get_converter
|
|
||||||
from idf_monitor_base.argument_parser import get_parser
|
|
||||||
from idf_monitor_base.console_parser import ConsoleParser
|
|
||||||
from idf_monitor_base.console_reader import ConsoleReader
|
|
||||||
from idf_monitor_base.constants import (CTRL_C, CTRL_H, DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX,
|
|
||||||
ESPPORT_ENVIRON, EVENT_QUEUE_TIMEOUT, GDB_EXIT_TIMEOUT,
|
|
||||||
GDB_UART_CONTINUE_COMMAND, LAST_LINE_THREAD_INTERVAL, MAKEFLAGS_ENVIRON,
|
|
||||||
PANIC_DECODE_DISABLE, PANIC_IDLE, TAG_CMD, TAG_KEY, TAG_SERIAL,
|
|
||||||
TAG_SERIAL_FLUSH)
|
|
||||||
from idf_monitor_base.coredump import COREDUMP_DECODE_INFO, CoreDump
|
|
||||||
from idf_monitor_base.exceptions import SerialStopException
|
|
||||||
from idf_monitor_base.gdbhelper import GDBHelper
|
|
||||||
from idf_monitor_base.line_matcher import LineMatcher
|
|
||||||
from idf_monitor_base.logger import Logger
|
|
||||||
from idf_monitor_base.output_helpers import normal_print, yellow_print
|
|
||||||
from idf_monitor_base.serial_handler import SerialHandler, SerialHandlerNoElf, run_make
|
|
||||||
from idf_monitor_base.serial_reader import LinuxReader, SerialReader
|
|
||||||
from idf_monitor_base.web_socket_client import WebSocketClient
|
|
||||||
from serial.tools import miniterm
|
|
||||||
|
|
||||||
key_description = miniterm.key_description
|
|
||||||
|
|
||||||
|
|
||||||
class Monitor:
|
|
||||||
"""
|
|
||||||
Monitor application base class.
|
|
||||||
|
|
||||||
This was originally derived from miniterm.Miniterm, but it turned out to be easier to write from scratch for this
|
|
||||||
purpose.
|
|
||||||
|
|
||||||
Main difference is that all event processing happens in the main thread, not the worker threads.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
serial_instance, # type: serial.Serial
|
|
||||||
elf_file, # type: str
|
|
||||||
print_filter, # type: str
|
|
||||||
make='make', # type: str
|
|
||||||
encrypted=False, # type: bool
|
|
||||||
reset=True, # type: bool
|
|
||||||
toolchain_prefix=DEFAULT_TOOLCHAIN_PREFIX, # type: str
|
|
||||||
eol='CRLF', # type: str
|
|
||||||
decode_coredumps=COREDUMP_DECODE_INFO, # type: str
|
|
||||||
decode_panic=PANIC_DECODE_DISABLE, # type: str
|
|
||||||
target='esp32', # type: str
|
|
||||||
websocket_client=None, # type: Optional[WebSocketClient]
|
|
||||||
enable_address_decoding=True, # type: bool
|
|
||||||
timestamps=False, # type: bool
|
|
||||||
timestamp_format='', # type: str
|
|
||||||
force_color=False # type: bool
|
|
||||||
):
|
|
||||||
self.event_queue = queue.Queue() # type: queue.Queue
|
|
||||||
self.cmd_queue = queue.Queue() # type: queue.Queue
|
|
||||||
self.console = miniterm.Console()
|
|
||||||
# if the variable is set ANSI will be printed even if we do not print to terminal
|
|
||||||
sys.stderr = get_converter(sys.stderr, decode_output=True, force_color=force_color)
|
|
||||||
self.console.output = get_converter(self.console.output, force_color=force_color)
|
|
||||||
self.console.byte_output = get_converter(self.console.byte_output, force_color=force_color)
|
|
||||||
|
|
||||||
self.elf_file = elf_file or ''
|
|
||||||
self.elf_exists = os.path.exists(self.elf_file)
|
|
||||||
self.logger = Logger(self.elf_file, self.console, timestamps, timestamp_format, b'', enable_address_decoding,
|
|
||||||
toolchain_prefix)
|
|
||||||
|
|
||||||
self.coredump = CoreDump(decode_coredumps, self.event_queue, self.logger, websocket_client,
|
|
||||||
self.elf_file) if self.elf_exists else None
|
|
||||||
|
|
||||||
# allow for possibility the "make" arg is a list of arguments (for idf.py)
|
|
||||||
self.make = make if os.path.exists(make) else shlex.split(make) # type: Any[Union[str, List[str]], str]
|
|
||||||
self.target = target
|
|
||||||
|
|
||||||
# testing hook - data from serial can make exit the monitor
|
|
||||||
if isinstance(self, SerialMonitor):
|
|
||||||
socket_mode = serial_instance.port.startswith('socket://')
|
|
||||||
self.serial = serial_instance
|
|
||||||
self.serial_reader = SerialReader(self.serial, self.event_queue, reset)
|
|
||||||
|
|
||||||
self.gdb_helper = GDBHelper(toolchain_prefix, websocket_client, self.elf_file, self.serial.port,
|
|
||||||
self.serial.baudrate) if self.elf_exists else None
|
|
||||||
|
|
||||||
else:
|
|
||||||
socket_mode = False
|
|
||||||
self.serial = subprocess.Popen([self.elf_file], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.STDOUT)
|
|
||||||
self.serial_reader = LinuxReader(self.serial, self.event_queue)
|
|
||||||
|
|
||||||
self.gdb_helper = None
|
|
||||||
|
|
||||||
cls = SerialHandler if self.elf_exists else SerialHandlerNoElf
|
|
||||||
self.serial_handler = cls(b'', socket_mode, self.logger, decode_panic, PANIC_IDLE, b'', target,
|
|
||||||
False, False, self.serial, encrypted, reset, self.elf_file)
|
|
||||||
|
|
||||||
self.console_parser = ConsoleParser(eol)
|
|
||||||
self.console_reader = ConsoleReader(self.console, self.event_queue, self.cmd_queue, self.console_parser,
|
|
||||||
socket_mode)
|
|
||||||
|
|
||||||
self._line_matcher = LineMatcher(print_filter)
|
|
||||||
|
|
||||||
# internal state
|
|
||||||
self._invoke_processing_last_line_timer = None # type: Optional[threading.Timer]
|
|
||||||
|
|
||||||
def __enter__(self) -> None:
|
|
||||||
""" Use 'with self' to temporarily disable monitoring behaviour """
|
|
||||||
self.serial_reader.stop()
|
|
||||||
self.console_reader.stop()
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def run_make(self, target: str) -> None:
|
|
||||||
with self:
|
|
||||||
run_make(target, self.make, self.console, self.console_parser, self.event_queue, self.cmd_queue,
|
|
||||||
self.logger)
|
|
||||||
|
|
||||||
def _pre_start(self) -> None:
|
|
||||||
self.console_reader.start()
|
|
||||||
self.serial_reader.start()
|
|
||||||
|
|
||||||
def main_loop(self) -> None:
|
|
||||||
self._pre_start()
|
|
||||||
|
|
||||||
try:
|
|
||||||
while self.console_reader.alive and self.serial_reader.alive:
|
|
||||||
try:
|
|
||||||
self._main_loop()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
yellow_print('To exit from IDF monitor please use \"Ctrl+]\". Alternatively, you can use Ctrl-T Ctrl-X to exit.')
|
|
||||||
self.serial_write(codecs.encode(CTRL_C))
|
|
||||||
except SerialStopException:
|
|
||||||
normal_print('Stopping condition has been received\n')
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
self.console_reader.stop()
|
|
||||||
self.serial_reader.stop()
|
|
||||||
self.logger.stop_logging()
|
|
||||||
# Cancelling _invoke_processing_last_line_timer is not
|
|
||||||
# important here because receiving empty data doesn't matter.
|
|
||||||
self._invoke_processing_last_line_timer = None
|
|
||||||
except Exception: # noqa
|
|
||||||
pass
|
|
||||||
normal_print('\n')
|
|
||||||
|
|
||||||
def serial_write(self, *args: str, **kwargs: str) -> None:
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def check_gdb_stub_and_run(self, line: bytes) -> None:
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def invoke_processing_last_line(self) -> None:
|
|
||||||
self.event_queue.put((TAG_SERIAL_FLUSH, b''), False)
|
|
||||||
|
|
||||||
def _main_loop(self) -> None:
|
|
||||||
try:
|
|
||||||
item = self.cmd_queue.get_nowait()
|
|
||||||
except queue.Empty:
|
|
||||||
try:
|
|
||||||
item = self.event_queue.get(timeout=EVENT_QUEUE_TIMEOUT)
|
|
||||||
except queue.Empty:
|
|
||||||
return
|
|
||||||
|
|
||||||
event_tag, data = item
|
|
||||||
if event_tag == TAG_CMD:
|
|
||||||
self.serial_handler.handle_commands(data, self.target, self.run_make, self.console_reader,
|
|
||||||
self.serial_reader)
|
|
||||||
elif event_tag == TAG_KEY:
|
|
||||||
self.serial_write(codecs.encode(data))
|
|
||||||
elif event_tag == TAG_SERIAL:
|
|
||||||
self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump,
|
|
||||||
self.gdb_helper, self._line_matcher,
|
|
||||||
self.check_gdb_stub_and_run)
|
|
||||||
if self._invoke_processing_last_line_timer is not None:
|
|
||||||
self._invoke_processing_last_line_timer.cancel()
|
|
||||||
self._invoke_processing_last_line_timer = threading.Timer(LAST_LINE_THREAD_INTERVAL,
|
|
||||||
self.invoke_processing_last_line)
|
|
||||||
self._invoke_processing_last_line_timer.start()
|
|
||||||
# If no further data is received in the next short period
|
|
||||||
# of time then the _invoke_processing_last_line_timer
|
|
||||||
# generates an event which will result in the finishing of
|
|
||||||
# the last line. This is fix for handling lines sent
|
|
||||||
# without EOL.
|
|
||||||
# finalizing the line when coredump is in progress causes decoding issues
|
|
||||||
# the espcoredump loader uses empty line as a sign for end-of-coredump
|
|
||||||
# line is finalized only for non coredump data
|
|
||||||
elif event_tag == TAG_SERIAL_FLUSH:
|
|
||||||
self.serial_handler.handle_serial_input(data, self.console_parser, self.coredump,
|
|
||||||
self.gdb_helper, self._line_matcher,
|
|
||||||
self.check_gdb_stub_and_run,
|
|
||||||
finalize_line=not self.coredump or not self.coredump.in_progress)
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Bad event data %r' % ((event_tag, data),))
|
|
||||||
|
|
||||||
|
|
||||||
class SerialMonitor(Monitor):
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
|
|
||||||
""" Use 'with self' to temporarily disable monitoring behaviour """
|
|
||||||
self.console_reader.start()
|
|
||||||
if self.elf_exists:
|
|
||||||
self.serial_reader.gdb_exit = self.gdb_helper.gdb_exit # write gdb_exit flag
|
|
||||||
self.serial_reader.start()
|
|
||||||
|
|
||||||
def _pre_start(self) -> None:
|
|
||||||
super()._pre_start()
|
|
||||||
if self.elf_exists:
|
|
||||||
self.gdb_helper.gdb_exit = False
|
|
||||||
self.serial_handler.start_cmd_sent = False
|
|
||||||
|
|
||||||
def serial_write(self, *args: str, **kwargs: str) -> None:
|
|
||||||
self.serial: serial.Serial
|
|
||||||
try:
|
|
||||||
self.serial.write(*args, **kwargs)
|
|
||||||
except serial.SerialException:
|
|
||||||
pass # this shouldn't happen, but sometimes port has closed in serial thread
|
|
||||||
except UnicodeEncodeError:
|
|
||||||
pass # this can happen if a non-ascii character was passed, ignoring
|
|
||||||
|
|
||||||
def check_gdb_stub_and_run(self, line: bytes) -> None: # type: ignore # The base class one is a None value
|
|
||||||
if self.gdb_helper and self.gdb_helper.check_gdb_stub_trigger(line):
|
|
||||||
with self: # disable console control
|
|
||||||
self.gdb_helper.run_gdb()
|
|
||||||
|
|
||||||
def _main_loop(self) -> None:
|
|
||||||
if self.elf_exists and self.gdb_helper.gdb_exit:
|
|
||||||
self.gdb_helper.gdb_exit = False
|
|
||||||
time.sleep(GDB_EXIT_TIMEOUT)
|
|
||||||
# Continue the program after exit from the GDB
|
|
||||||
self.serial_write(codecs.encode(GDB_UART_CONTINUE_COMMAND))
|
|
||||||
self.serial_handler.start_cmd_sent = True
|
|
||||||
|
|
||||||
super()._main_loop()
|
|
||||||
|
|
||||||
|
|
||||||
class LinuxMonitor(Monitor):
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore
|
|
||||||
""" Use 'with self' to temporarily disable monitoring behaviour """
|
|
||||||
self.console_reader.start()
|
|
||||||
self.serial_reader.start()
|
|
||||||
|
|
||||||
def serial_write(self, *args: str, **kwargs: str) -> None:
|
|
||||||
self.serial.stdin.write(*args, **kwargs)
|
|
||||||
self.serial.stdin.flush()
|
|
||||||
|
|
||||||
def check_gdb_stub_and_run(self, line: bytes) -> None:
|
|
||||||
return # fake function for linux target
|
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
|
||||||
parser = get_parser()
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# The port name is changed in cases described in the following lines. Use a local argument and
|
|
||||||
# avoid the modification of args.port.
|
|
||||||
port = args.port
|
|
||||||
|
|
||||||
# GDB uses CreateFile to open COM port, which requires the COM name to be r'\\.\COMx' if the COM
|
|
||||||
# number is larger than 10
|
|
||||||
if os.name == 'nt' and port.startswith('COM'):
|
|
||||||
port = port.replace('COM', r'\\.\COM')
|
|
||||||
yellow_print('--- WARNING: GDB cannot open serial ports accessed as COMx')
|
|
||||||
yellow_print('--- Using %s instead...' % port)
|
|
||||||
elif port.startswith('/dev/tty.') and sys.platform == 'darwin':
|
|
||||||
port = port.replace('/dev/tty.', '/dev/cu.')
|
|
||||||
yellow_print('--- WARNING: Serial ports accessed as /dev/tty.* will hang gdb if launched.')
|
|
||||||
yellow_print('--- Using %s instead...' % port)
|
|
||||||
|
|
||||||
if isinstance(args.elf_file, io.BufferedReader):
|
|
||||||
elf_file = args.elf_file.name
|
|
||||||
args.elf_file.close() # don't need this as a file
|
|
||||||
else:
|
|
||||||
elf_file = args.elf_file
|
|
||||||
|
|
||||||
# remove the parallel jobserver arguments from MAKEFLAGS, as any
|
|
||||||
# parent make is only running 1 job (monitor), so we can re-spawn
|
|
||||||
# all of the child makes we need (the -j argument remains part of
|
|
||||||
# MAKEFLAGS)
|
|
||||||
try:
|
|
||||||
makeflags = os.environ[MAKEFLAGS_ENVIRON]
|
|
||||||
makeflags = re.sub(r'--jobserver[^ =]*=[0-9,]+ ?', '', makeflags)
|
|
||||||
os.environ[MAKEFLAGS_ENVIRON] = makeflags
|
|
||||||
except KeyError:
|
|
||||||
pass # not running a make jobserver
|
|
||||||
|
|
||||||
ws = WebSocketClient(args.ws) if args.ws else None
|
|
||||||
try:
|
|
||||||
cls: Type[Monitor]
|
|
||||||
if args.target == 'linux':
|
|
||||||
serial_instance = None
|
|
||||||
cls = LinuxMonitor
|
|
||||||
yellow_print('--- idf_monitor on linux ---')
|
|
||||||
else:
|
|
||||||
serial_instance = serial.serial_for_url(port, args.baud, do_not_open=True)
|
|
||||||
serial_instance.dtr = False
|
|
||||||
serial_instance.rts = False
|
|
||||||
|
|
||||||
# Pass the actual used port to callee of idf_monitor (e.g. idf.py/cmake) through `ESPPORT` environment
|
|
||||||
# variable.
|
|
||||||
# Note that the port must be original port argument without any replacement done in IDF Monitor (idf.py
|
|
||||||
# has a check for this).
|
|
||||||
# To make sure the key as well as the value are str type, by the requirements of subprocess
|
|
||||||
espport_val = str(args.port)
|
|
||||||
os.environ.update({ESPPORT_ENVIRON: espport_val})
|
|
||||||
|
|
||||||
cls = SerialMonitor
|
|
||||||
yellow_print('--- idf_monitor on {p.name} {p.baudrate} ---'.format(p=serial_instance))
|
|
||||||
|
|
||||||
monitor = cls(serial_instance,
|
|
||||||
elf_file,
|
|
||||||
args.print_filter,
|
|
||||||
args.make,
|
|
||||||
args.encrypted,
|
|
||||||
not args.no_reset,
|
|
||||||
args.toolchain_prefix,
|
|
||||||
args.eol,
|
|
||||||
args.decode_coredumps,
|
|
||||||
args.decode_panic,
|
|
||||||
args.target,
|
|
||||||
ws,
|
|
||||||
not args.disable_address_decoding,
|
|
||||||
args.timestamps,
|
|
||||||
args.timestamp_format,
|
|
||||||
args.force_color)
|
|
||||||
|
|
||||||
yellow_print('--- Quit: {} | Menu: {} | Help: {} followed by {} ---'.format(
|
|
||||||
key_description(monitor.console_parser.exit_key),
|
|
||||||
key_description(monitor.console_parser.menu_key),
|
|
||||||
key_description(monitor.console_parser.menu_key),
|
|
||||||
key_description(CTRL_H)))
|
|
||||||
if args.print_filter != DEFAULT_PRINT_FILTER:
|
|
||||||
yellow_print('--- Print filter: {} ---'.format(args.print_filter))
|
|
||||||
monitor.main_loop()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
finally:
|
|
||||||
if ws:
|
|
||||||
ws.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
sys.exit(subprocess.run([sys.executable, '-m', 'esp_idf_monitor'] + sys.argv[1:]).returncode)
|
||||||
|
@ -1,120 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import ctypes
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from io import TextIOBase
|
|
||||||
from typing import Any, Optional, TextIO, Union
|
|
||||||
|
|
||||||
from .output_helpers import ANSI_NORMAL
|
|
||||||
|
|
||||||
STD_OUTPUT_HANDLE = -11
|
|
||||||
STD_ERROR_HANDLE = -12
|
|
||||||
|
|
||||||
# wincon.h values
|
|
||||||
FOREGROUND_INTENSITY = 8
|
|
||||||
FOREGROUND_GREY = 7
|
|
||||||
|
|
||||||
# matches the ANSI color change sequences that IDF sends
|
|
||||||
RE_ANSI_COLOR = re.compile(b'\033\\[([01]);3([0-7])m')
|
|
||||||
|
|
||||||
# list mapping the 8 ANSI colors (the indexes) to Windows Console colors
|
|
||||||
ANSI_TO_WINDOWS_COLOR = [0, 4, 2, 6, 1, 5, 3, 7]
|
|
||||||
|
|
||||||
if os.name == 'nt':
|
|
||||||
GetStdHandle = ctypes.windll.kernel32.GetStdHandle # type: ignore
|
|
||||||
SetConsoleTextAttribute = ctypes.windll.kernel32.SetConsoleTextAttribute # type: ignore
|
|
||||||
|
|
||||||
|
|
||||||
def get_converter(orig_output_method=None, decode_output=False, force_color=False):
|
|
||||||
# type: (Any[TextIO, Optional[TextIOBase]], bool, bool) -> Union[ANSIColorConverter, Optional[TextIOBase]]
|
|
||||||
"""
|
|
||||||
Returns an ANSIColorConverter on Windows and the original output method (orig_output_method) on other platforms.
|
|
||||||
The ANSIColorConverter with decode_output=True will decode the bytes before passing them to the output
|
|
||||||
The ANSIColorConverter with force_color=True will be forced to convert ANSI in windows format
|
|
||||||
"""
|
|
||||||
if os.name == 'nt':
|
|
||||||
return ANSIColorConverter(orig_output_method, decode_output, force_color)
|
|
||||||
return orig_output_method
|
|
||||||
|
|
||||||
|
|
||||||
class ANSIColorConverter(object):
|
|
||||||
"""Class to wrap a file-like output stream, intercept ANSI color codes,
|
|
||||||
and convert them into calls to Windows SetConsoleTextAttribute.
|
|
||||||
|
|
||||||
Doesn't support all ANSI terminal code escape sequences, only the sequences IDF uses.
|
|
||||||
|
|
||||||
Ironically, in Windows this console output is normally wrapped by winpty which will then detect the console text
|
|
||||||
color changes and convert these back to ANSI color codes for MSYS' terminal to display. However this is the
|
|
||||||
least-bad working solution, as winpty doesn't support any "passthrough" mode for raw output.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, output=None, decode_output=False, force_color=False):
|
|
||||||
# type: (TextIOBase, bool, bool) -> None
|
|
||||||
self.output = output
|
|
||||||
self.decode_output = decode_output
|
|
||||||
self.handle = GetStdHandle(STD_ERROR_HANDLE if self.output == sys.stderr else STD_OUTPUT_HANDLE)
|
|
||||||
self.matched = b''
|
|
||||||
self.force_color = force_color # always print ANSI for colors if true
|
|
||||||
|
|
||||||
def _output_write(self, data): # type: (Union[str, bytes]) -> None
|
|
||||||
try:
|
|
||||||
if self.decode_output:
|
|
||||||
self.output.write(data.decode()) # type: ignore
|
|
||||||
else:
|
|
||||||
self.output.write(data) # type: ignore
|
|
||||||
except (IOError, OSError):
|
|
||||||
# Windows 10 bug since the Fall Creators Update, sometimes writing to console randomly throws
|
|
||||||
# an exception (however, the character is still written to the screen)
|
|
||||||
# Ref https://github.com/espressif/esp-idf/issues/1163
|
|
||||||
#
|
|
||||||
# Also possible for Windows to throw an OSError error if the data is invalid for the console
|
|
||||||
# (garbage bytes, etc)
|
|
||||||
pass
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
# In case of double byte Unicode characters display '?'
|
|
||||||
self.output.write('?') # type: ignore
|
|
||||||
|
|
||||||
def write(self, data): # type: ignore
|
|
||||||
if isinstance(data, bytes):
|
|
||||||
data = bytearray(data)
|
|
||||||
else:
|
|
||||||
data = bytearray(data, 'utf-8')
|
|
||||||
for b in data:
|
|
||||||
b = bytes([b])
|
|
||||||
length = len(self.matched)
|
|
||||||
|
|
||||||
if b == b'\033': # ESC
|
|
||||||
self._output_write(self.matched)
|
|
||||||
self.matched = b
|
|
||||||
elif (length == 1 and b == b'[') or (1 < length < 7):
|
|
||||||
self.matched += b
|
|
||||||
if not self.force_color and self.matched == ANSI_NORMAL.encode('latin-1'): # reset console
|
|
||||||
# Flush is required only with Python3 - switching color before it is printed would mess up the console
|
|
||||||
self.flush()
|
|
||||||
SetConsoleTextAttribute(self.handle, FOREGROUND_GREY)
|
|
||||||
self.matched = b''
|
|
||||||
elif self.force_color or len(self.matched) == 7: # could be an ANSI sequence
|
|
||||||
m = re.match(RE_ANSI_COLOR, self.matched)
|
|
||||||
if m is not None:
|
|
||||||
color = ANSI_TO_WINDOWS_COLOR[int(m.group(2))]
|
|
||||||
if m.group(1) == b'1':
|
|
||||||
color |= FOREGROUND_INTENSITY
|
|
||||||
# Flush is required only with Python3 - switching color before it is printed would mess up the console
|
|
||||||
self.flush()
|
|
||||||
SetConsoleTextAttribute(self.handle, color)
|
|
||||||
else:
|
|
||||||
self._output_write(self.matched) # not an ANSI color code, display verbatim
|
|
||||||
self.matched = b''
|
|
||||||
else:
|
|
||||||
self._output_write(b)
|
|
||||||
self.matched = b''
|
|
||||||
|
|
||||||
def flush(self): # type: () -> None
|
|
||||||
try:
|
|
||||||
self.output.flush() # type: ignore
|
|
||||||
except OSError:
|
|
||||||
# Account for Windows Console refusing to accept garbage bytes (serial noise, etc)
|
|
||||||
pass
|
|
@ -1,123 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
|
|
||||||
from .constants import DEFAULT_PRINT_FILTER, DEFAULT_TOOLCHAIN_PREFIX, PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE
|
|
||||||
from .coredump import COREDUMP_DECODE_DISABLE, COREDUMP_DECODE_INFO
|
|
||||||
|
|
||||||
|
|
||||||
def get_parser(): # type: () -> argparse.ArgumentParser
|
|
||||||
parser = argparse.ArgumentParser('idf_monitor - a serial output monitor for esp-idf')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--port', '-p',
|
|
||||||
help='Serial port device',
|
|
||||||
default=os.environ.get('ESPTOOL_PORT', '/dev/ttyUSB0')
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--no-reset',
|
|
||||||
help='Do not reset the chip on monitor startup',
|
|
||||||
action='store_true'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--disable-address-decoding', '-d',
|
|
||||||
help="Don't print lines about decoded addresses from the application ELF file",
|
|
||||||
action='store_true',
|
|
||||||
default=os.getenv('ESP_MONITOR_DECODE') == '0'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--baud', '-b',
|
|
||||||
help='Serial port baud rate',
|
|
||||||
type=int,
|
|
||||||
default=os.getenv('IDF_MONITOR_BAUD', os.getenv('MONITORBAUD', 115200)))
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--make', '-m',
|
|
||||||
help='Command to run make',
|
|
||||||
type=str, default='make')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--encrypted',
|
|
||||||
help='Use encrypted targets while running make',
|
|
||||||
action='store_true')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--toolchain-prefix',
|
|
||||||
help='Triplet prefix to add before cross-toolchain names',
|
|
||||||
default=DEFAULT_TOOLCHAIN_PREFIX)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--eol',
|
|
||||||
choices=['CR', 'LF', 'CRLF'],
|
|
||||||
type=lambda c: c.upper(),
|
|
||||||
help='End of line to use when sending to the serial port',
|
|
||||||
default='CR')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'elf_file', help='ELF file of application',
|
|
||||||
type=lambda f: open(f, 'rb') if os.path.exists(f) else f'{f}',
|
|
||||||
nargs='?'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--print_filter',
|
|
||||||
help='Filtering string',
|
|
||||||
default=DEFAULT_PRINT_FILTER)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--decode-coredumps',
|
|
||||||
choices=[COREDUMP_DECODE_INFO, COREDUMP_DECODE_DISABLE],
|
|
||||||
default=COREDUMP_DECODE_INFO,
|
|
||||||
help='Handling of core dumps found in serial output'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--decode-panic',
|
|
||||||
choices=[PANIC_DECODE_BACKTRACE, PANIC_DECODE_DISABLE],
|
|
||||||
default=PANIC_DECODE_DISABLE,
|
|
||||||
help='Handling of panic handler info found in serial output'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--target',
|
|
||||||
help='Target name (used when stack dump decoding is enabled)',
|
|
||||||
default=os.environ.get('IDF_TARGET', 'esp32')
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--revision',
|
|
||||||
help='Revision of the target',
|
|
||||||
type=int,
|
|
||||||
default=0
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--ws',
|
|
||||||
default=os.environ.get('ESP_IDF_MONITOR_WS', None),
|
|
||||||
help='WebSocket URL for communicating with IDE tools for debugging purposes'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--timestamps',
|
|
||||||
help='Add timestamp for each line',
|
|
||||||
default=False,
|
|
||||||
action='store_true')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--timestamp-format',
|
|
||||||
default=os.environ.get('ESP_IDF_MONITOR_TIMESTAMP_FORMAT', '%Y-%m-%d %H:%M:%S'),
|
|
||||||
help='Set a strftime()-compatible timestamp format'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--force-color',
|
|
||||||
help='Always colored monitor output, even if output is redirected.',
|
|
||||||
default=False,
|
|
||||||
action='store_true')
|
|
||||||
|
|
||||||
return parser
|
|
@ -1,59 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
#
|
|
||||||
# This file contains values (e.g. delay time, ...) that are different for each chip for a particular action.
|
|
||||||
# If adding a new device, set only values that are different from the default, e.g.:
|
|
||||||
# 'esp32s2': {
|
|
||||||
# 0: {
|
|
||||||
# 'reset': 0.35,
|
|
||||||
# }
|
|
||||||
# },
|
|
||||||
#
|
|
||||||
# for more information see the method "handle_commands" in idf_monitor.py
|
|
||||||
|
|
||||||
|
|
||||||
conf = {
|
|
||||||
# the default values were previously hardcoded in idf_monitor.py (taken from esptool.py)
|
|
||||||
'default': {
|
|
||||||
0: {
|
|
||||||
'reset': 0.2,
|
|
||||||
'enter_boot_set': 0.1,
|
|
||||||
'enter_boot_unset': 0.05,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'esp32': {
|
|
||||||
0: {
|
|
||||||
'reset': 0.2,
|
|
||||||
'enter_boot_set': 1.3,
|
|
||||||
'enter_boot_unset': 0.45,
|
|
||||||
},
|
|
||||||
100: {
|
|
||||||
'reset': 0.2,
|
|
||||||
'enter_boot_set': 0.1,
|
|
||||||
'enter_boot_unset': 0.05,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_chip_config(chip, revision=0):
|
|
||||||
# type: (str, int) -> dict
|
|
||||||
|
|
||||||
# If the config is not set in the `conf` dict for a specific chip, the `default` will be used.
|
|
||||||
# In case if only some values are specified, others are used from the `default`.
|
|
||||||
# If chip is set in `conf` but the specific revision R is missing,
|
|
||||||
# the values from highest revision lower than R are used.
|
|
||||||
# If some fields are missing, they will be taken from next lower revision or from the `default`.
|
|
||||||
default = dict(conf['default'][0])
|
|
||||||
rev_number = int(revision)
|
|
||||||
if chip not in conf.keys():
|
|
||||||
return default
|
|
||||||
chip_revisions = sorted(list(conf[chip].keys()), key=int)
|
|
||||||
for rev in chip_revisions:
|
|
||||||
if int(rev) > rev_number:
|
|
||||||
break
|
|
||||||
for key in conf[chip][rev].keys():
|
|
||||||
default[key] = conf[chip][rev][key]
|
|
||||||
|
|
||||||
return default
|
|
@ -1,148 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import queue
|
|
||||||
import textwrap
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from serial.tools import miniterm
|
|
||||||
|
|
||||||
from .constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, CMD_STOP,
|
|
||||||
CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, CTRL_A, CTRL_F, CTRL_H, CTRL_I, CTRL_L, CTRL_P,
|
|
||||||
CTRL_R, CTRL_RBRACKET, CTRL_T, CTRL_X, CTRL_Y, TAG_CMD, TAG_KEY, __version__)
|
|
||||||
from .output_helpers import red_print
|
|
||||||
|
|
||||||
key_description = miniterm.key_description
|
|
||||||
|
|
||||||
|
|
||||||
def prompt_next_action(reason, console, console_parser, event_queue, cmd_queue):
|
|
||||||
# type: (str, miniterm.Console, ConsoleParser, queue.Queue, queue.Queue) -> None
|
|
||||||
console.setup() # set up console to trap input characters
|
|
||||||
try:
|
|
||||||
red_print('--- {}'.format(reason))
|
|
||||||
red_print(console_parser.get_next_action_text())
|
|
||||||
|
|
||||||
k = CTRL_T # ignore CTRL-T here, so people can muscle-memory Ctrl-T Ctrl-F, etc.
|
|
||||||
while k == CTRL_T:
|
|
||||||
k = console.getkey()
|
|
||||||
finally:
|
|
||||||
console.cleanup()
|
|
||||||
ret = console_parser.parse_next_action_key(k)
|
|
||||||
if ret is not None:
|
|
||||||
cmd = ret[1]
|
|
||||||
if cmd == CMD_STOP:
|
|
||||||
# the stop command should be handled last
|
|
||||||
event_queue.put(ret)
|
|
||||||
else:
|
|
||||||
cmd_queue.put(ret)
|
|
||||||
|
|
||||||
|
|
||||||
class ConsoleParser(object):
|
|
||||||
|
|
||||||
def __init__(self, eol='CRLF'): # type: (str) -> None
|
|
||||||
self.translate_eol = {
|
|
||||||
'CRLF': lambda c: c.replace('\n', '\r\n'),
|
|
||||||
'CR': lambda c: c.replace('\n', '\r'),
|
|
||||||
'LF': lambda c: c.replace('\r', '\n'),
|
|
||||||
}[eol]
|
|
||||||
self.menu_key = CTRL_T
|
|
||||||
self.exit_key = CTRL_RBRACKET
|
|
||||||
self._pressed_menu_key = False
|
|
||||||
|
|
||||||
def parse(self, key): # type: (str) -> Optional[tuple]
|
|
||||||
ret = None
|
|
||||||
if self._pressed_menu_key:
|
|
||||||
ret = self._handle_menu_key(key)
|
|
||||||
elif key == self.menu_key:
|
|
||||||
self._pressed_menu_key = True
|
|
||||||
elif key == self.exit_key:
|
|
||||||
ret = (TAG_CMD, CMD_STOP)
|
|
||||||
else:
|
|
||||||
key = self.translate_eol(key)
|
|
||||||
ret = (TAG_KEY, key)
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def _handle_menu_key(self, c): # type: (str) -> Optional[tuple]
|
|
||||||
ret = None
|
|
||||||
if c == self.exit_key or c == self.menu_key: # send verbatim
|
|
||||||
ret = (TAG_KEY, c)
|
|
||||||
elif c in [CTRL_H, 'h', 'H', '?']:
|
|
||||||
red_print(self.get_help_text())
|
|
||||||
elif c == CTRL_R: # Reset device via RTS
|
|
||||||
ret = (TAG_CMD, CMD_RESET)
|
|
||||||
elif c == CTRL_F: # Recompile & upload
|
|
||||||
ret = (TAG_CMD, CMD_MAKE)
|
|
||||||
elif c in [CTRL_A, 'a', 'A']: # Recompile & upload app only
|
|
||||||
# "CTRL-A" cannot be captured with the default settings of the Windows command line, therefore, "A" can be used
|
|
||||||
# instead
|
|
||||||
ret = (TAG_CMD, CMD_APP_FLASH)
|
|
||||||
elif c == CTRL_Y: # Toggle output display
|
|
||||||
ret = (TAG_CMD, CMD_OUTPUT_TOGGLE)
|
|
||||||
elif c == CTRL_L: # Toggle saving output into file
|
|
||||||
ret = (TAG_CMD, CMD_TOGGLE_LOGGING)
|
|
||||||
elif c in [CTRL_I, 'i', 'I']: # Toggle printing timestamps
|
|
||||||
ret = (TAG_CMD, CMD_TOGGLE_TIMESTAMPS)
|
|
||||||
elif c == CTRL_P:
|
|
||||||
# to fast trigger pause without press menu key
|
|
||||||
ret = (TAG_CMD, CMD_ENTER_BOOT)
|
|
||||||
elif c in [CTRL_X, 'x', 'X']: # Exiting from within the menu
|
|
||||||
ret = (TAG_CMD, CMD_STOP)
|
|
||||||
else:
|
|
||||||
red_print('--- unknown menu character {} --'.format(key_description(c)))
|
|
||||||
|
|
||||||
self._pressed_menu_key = False
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def get_help_text(self): # type: () -> str
|
|
||||||
text = """\
|
|
||||||
--- idf_monitor ({version}) - ESP-IDF monitor tool
|
|
||||||
--- based on miniterm from pySerial
|
|
||||||
---
|
|
||||||
--- {exit:8} Exit program
|
|
||||||
--- {menu:8} Menu escape key, followed by:
|
|
||||||
--- Menu keys:
|
|
||||||
--- {menu:14} Send the menu character itself to remote
|
|
||||||
--- {exit:14} Send the exit character itself to remote
|
|
||||||
--- {reset:14} Reset target board via RTS line
|
|
||||||
--- {makecmd:14} Build & flash project
|
|
||||||
--- {appmake:14} Build & flash app only
|
|
||||||
--- {output:14} Toggle output display
|
|
||||||
--- {log:14} Toggle saving output into file
|
|
||||||
--- {timestamps:14} Toggle printing timestamps
|
|
||||||
--- {pause:14} Reset target into bootloader to pause app via RTS line
|
|
||||||
--- {menuexit:14} Exit program
|
|
||||||
""".format(version=__version__,
|
|
||||||
exit=key_description(self.exit_key),
|
|
||||||
menu=key_description(self.menu_key),
|
|
||||||
reset=key_description(CTRL_R),
|
|
||||||
makecmd=key_description(CTRL_F),
|
|
||||||
appmake=key_description(CTRL_A) + ' (or A)',
|
|
||||||
output=key_description(CTRL_Y),
|
|
||||||
log=key_description(CTRL_L),
|
|
||||||
timestamps=key_description(CTRL_I) + ' (or I)',
|
|
||||||
pause=key_description(CTRL_P),
|
|
||||||
menuexit=key_description(CTRL_X) + ' (or X)')
|
|
||||||
return textwrap.dedent(text)
|
|
||||||
|
|
||||||
def get_next_action_text(self): # type: () -> str
|
|
||||||
text = """\
|
|
||||||
--- Press {} to exit monitor.
|
|
||||||
--- Press {} to build & flash project.
|
|
||||||
--- Press {} to build & flash app.
|
|
||||||
--- Press any other key to resume monitor (resets target).
|
|
||||||
""".format(key_description(self.exit_key),
|
|
||||||
key_description(CTRL_F),
|
|
||||||
key_description(CTRL_A))
|
|
||||||
return textwrap.dedent(text)
|
|
||||||
|
|
||||||
def parse_next_action_key(self, c): # type: (str) -> Optional[tuple]
|
|
||||||
ret = None
|
|
||||||
if c == self.exit_key:
|
|
||||||
ret = (TAG_CMD, CMD_STOP)
|
|
||||||
elif c == CTRL_F: # Recompile & upload
|
|
||||||
ret = (TAG_CMD, CMD_MAKE)
|
|
||||||
elif c in [CTRL_A, 'a', 'A']: # Recompile & upload app only
|
|
||||||
# "CTRL-A" cannot be captured with the default settings of the Windows command line, therefore, "A" can be used
|
|
||||||
# instead
|
|
||||||
ret = (TAG_CMD, CMD_APP_FLASH)
|
|
||||||
return ret
|
|
@ -1,86 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import queue
|
|
||||||
import time
|
|
||||||
|
|
||||||
from serial.tools.miniterm import Console
|
|
||||||
|
|
||||||
from .console_parser import ConsoleParser
|
|
||||||
from .constants import CMD_STOP, TAG_CMD
|
|
||||||
from .stoppable_thread import StoppableThread
|
|
||||||
|
|
||||||
|
|
||||||
class ConsoleReader(StoppableThread):
|
|
||||||
""" Read input keys from the console and push them to the queue,
|
|
||||||
until stopped.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, console, event_queue, cmd_queue, parser, test_mode):
|
|
||||||
# type: (Console, queue.Queue, queue.Queue, ConsoleParser, bool) -> None
|
|
||||||
super(ConsoleReader, self).__init__()
|
|
||||||
self.console = console
|
|
||||||
self.event_queue = event_queue
|
|
||||||
self.cmd_queue = cmd_queue
|
|
||||||
self.parser = parser
|
|
||||||
self.test_mode = test_mode
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
# type: () -> None
|
|
||||||
self.console.setup()
|
|
||||||
try:
|
|
||||||
while self.alive:
|
|
||||||
try:
|
|
||||||
if os.name == 'nt':
|
|
||||||
# Windows kludge: because the console.cancel() method doesn't
|
|
||||||
# seem to work to unblock getkey() on the Windows implementation.
|
|
||||||
#
|
|
||||||
# So we only call getkey() if we know there's a key waiting for us.
|
|
||||||
import msvcrt
|
|
||||||
while not msvcrt.kbhit() and self.alive: # type: ignore
|
|
||||||
time.sleep(0.1)
|
|
||||||
if not self.alive:
|
|
||||||
break
|
|
||||||
elif self.test_mode:
|
|
||||||
# In testing mode the stdin is connected to PTY but is not used for input anything. For PTY
|
|
||||||
# the canceling by fcntl.ioctl isn't working and would hang in self.console.getkey().
|
|
||||||
# Therefore, we avoid calling it.
|
|
||||||
while self.alive:
|
|
||||||
time.sleep(0.1)
|
|
||||||
break
|
|
||||||
c = self.console.getkey()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
c = '\x03'
|
|
||||||
if c is not None:
|
|
||||||
ret = self.parser.parse(c)
|
|
||||||
if ret is not None:
|
|
||||||
(tag, cmd) = ret
|
|
||||||
# stop command should be executed last
|
|
||||||
if tag == TAG_CMD and cmd != CMD_STOP:
|
|
||||||
self.cmd_queue.put(ret)
|
|
||||||
else:
|
|
||||||
self.event_queue.put(ret)
|
|
||||||
|
|
||||||
finally:
|
|
||||||
self.console.cleanup()
|
|
||||||
|
|
||||||
def _cancel(self):
|
|
||||||
# type: () -> None
|
|
||||||
if os.name == 'posix' and not self.test_mode:
|
|
||||||
# this is the way cancel() is implemented in pyserial 3.3 or newer,
|
|
||||||
# older pyserial (3.1+) has cancellation implemented via 'select',
|
|
||||||
# which does not work when console sends an escape sequence response
|
|
||||||
#
|
|
||||||
# even older pyserial (<3.1) does not have this method
|
|
||||||
#
|
|
||||||
# on Windows there is a different (also hacky) fix, applied above.
|
|
||||||
#
|
|
||||||
# note that TIOCSTI is not implemented in WSL / bash-on-Windows.
|
|
||||||
# TODO: introduce some workaround to make it work there.
|
|
||||||
#
|
|
||||||
# Note: This would throw exception in testing mode when the stdin is connected to PTY.
|
|
||||||
import fcntl
|
|
||||||
import termios
|
|
||||||
fcntl.ioctl(self.console.fd, termios.TIOCSTI, b'\0')
|
|
@ -1,77 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
|
|
||||||
# Control-key characters
|
|
||||||
CTRL_A = '\x01'
|
|
||||||
CTRL_B = '\x02'
|
|
||||||
CTRL_C = '\x03'
|
|
||||||
CTRL_F = '\x06'
|
|
||||||
CTRL_H = '\x08'
|
|
||||||
CTRL_I = '\x09'
|
|
||||||
CTRL_R = '\x12'
|
|
||||||
CTRL_T = '\x14'
|
|
||||||
CTRL_Y = '\x19'
|
|
||||||
CTRL_P = '\x10'
|
|
||||||
CTRL_X = '\x18'
|
|
||||||
CTRL_L = '\x0c'
|
|
||||||
CTRL_RBRACKET = '\x1d' # Ctrl+]
|
|
||||||
|
|
||||||
# Command parsed from console inputs
|
|
||||||
CMD_STOP = 1
|
|
||||||
CMD_RESET = 2
|
|
||||||
CMD_MAKE = 3
|
|
||||||
CMD_APP_FLASH = 4
|
|
||||||
CMD_OUTPUT_TOGGLE = 5
|
|
||||||
CMD_TOGGLE_LOGGING = 6
|
|
||||||
CMD_ENTER_BOOT = 7
|
|
||||||
CMD_TOGGLE_TIMESTAMPS = 8
|
|
||||||
|
|
||||||
# Tags for tuples in queues
|
|
||||||
TAG_KEY = 0
|
|
||||||
TAG_SERIAL = 1
|
|
||||||
TAG_SERIAL_FLUSH = 2
|
|
||||||
TAG_CMD = 3
|
|
||||||
|
|
||||||
__version__ = '1.1'
|
|
||||||
|
|
||||||
# paths to scripts
|
|
||||||
PANIC_OUTPUT_DECODE_SCRIPT = os.path.join(os.path.dirname(__file__), '..', 'gdb_panic_server.py')
|
|
||||||
|
|
||||||
# regex matches an potential address
|
|
||||||
ADDRESS_RE = re.compile(r'0x[0-9a-f]{8}', re.IGNORECASE)
|
|
||||||
|
|
||||||
DEFAULT_TOOLCHAIN_PREFIX = 'xtensa-esp32-elf-'
|
|
||||||
|
|
||||||
DEFAULT_PRINT_FILTER = ''
|
|
||||||
|
|
||||||
# panic handler related messages
|
|
||||||
PANIC_START = r'Core \s*\d+ register dump:'
|
|
||||||
PANIC_END = b'ELF file SHA256:'
|
|
||||||
PANIC_STACK_DUMP = b'Stack memory:'
|
|
||||||
|
|
||||||
# panic handler decoding states
|
|
||||||
PANIC_IDLE = 0
|
|
||||||
PANIC_READING = 1
|
|
||||||
|
|
||||||
# panic handler decoding options
|
|
||||||
PANIC_DECODE_DISABLE = 'disable'
|
|
||||||
PANIC_DECODE_BACKTRACE = 'backtrace'
|
|
||||||
|
|
||||||
EVENT_QUEUE_TIMEOUT = 0.03 # timeout before raising queue.Empty exception in case of empty event queue
|
|
||||||
|
|
||||||
ESPPORT_ENVIRON = str('ESPPORT')
|
|
||||||
MAKEFLAGS_ENVIRON = 'MAKEFLAGS'
|
|
||||||
|
|
||||||
GDB_UART_CONTINUE_COMMAND = '+$c#63'
|
|
||||||
GDB_EXIT_TIMEOUT = 0.3 # time delay between exit and writing GDB_UART_CONTINUE_COMMAND
|
|
||||||
|
|
||||||
# workaround for data sent without EOL
|
|
||||||
# if no data received during the time, last line is considered finished
|
|
||||||
LAST_LINE_THREAD_INTERVAL = 0.1
|
|
||||||
|
|
||||||
MINIMAL_EN_LOW_DELAY = 0.005
|
|
||||||
RECONNECT_DELAY = 0.5 # timeout between reconnect tries
|
|
||||||
CHECK_ALIVE_FLAG_TIMEOUT = 0.25 # timeout for checking alive flags (currently used by serial reader)
|
|
@ -1,132 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
import io
|
|
||||||
import os
|
|
||||||
import queue
|
|
||||||
import tempfile
|
|
||||||
from contextlib import contextmanager, redirect_stdout
|
|
||||||
from typing import Generator
|
|
||||||
|
|
||||||
from .constants import TAG_KEY
|
|
||||||
from .logger import Logger
|
|
||||||
from .output_helpers import yellow_print
|
|
||||||
from .web_socket_client import WebSocketClient
|
|
||||||
|
|
||||||
# coredump related messages
|
|
||||||
COREDUMP_UART_START = b'================= CORE DUMP START ================='
|
|
||||||
COREDUMP_UART_END = b'================= CORE DUMP END ================='
|
|
||||||
COREDUMP_UART_PROMPT = b'Press Enter to print core dump to UART...'
|
|
||||||
|
|
||||||
# coredump states
|
|
||||||
COREDUMP_IDLE = 0
|
|
||||||
COREDUMP_READING = 1
|
|
||||||
COREDUMP_DONE = 2
|
|
||||||
|
|
||||||
# coredump decoding options
|
|
||||||
COREDUMP_DECODE_DISABLE = 'disable'
|
|
||||||
COREDUMP_DECODE_INFO = 'info'
|
|
||||||
|
|
||||||
|
|
||||||
class CoreDump:
|
|
||||||
def __init__(self, decode_coredumps, event_queue, logger, websocket_client, elf_file):
|
|
||||||
# type: (str, queue.Queue, Logger, WebSocketClient, str) -> None
|
|
||||||
|
|
||||||
self._coredump_buffer = b''
|
|
||||||
self._decode_coredumps = decode_coredumps
|
|
||||||
self.event_queue = event_queue
|
|
||||||
self._reading_coredump = COREDUMP_IDLE
|
|
||||||
self.logger = logger
|
|
||||||
self.websocket_client = websocket_client
|
|
||||||
self.elf_file = elf_file
|
|
||||||
|
|
||||||
@property
|
|
||||||
def in_progress(self) -> bool:
|
|
||||||
return bool(self._coredump_buffer)
|
|
||||||
|
|
||||||
def _process_coredump(self): # type: () -> None
|
|
||||||
if self._decode_coredumps != COREDUMP_DECODE_INFO:
|
|
||||||
raise NotImplementedError('process_coredump: %s not implemented' % self._decode_coredumps)
|
|
||||||
coredump_file = None
|
|
||||||
# On Windows, the temporary file can't be read unless it is closed.
|
|
||||||
# Set delete=False and delete the file manually later.
|
|
||||||
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as coredump_file:
|
|
||||||
coredump_file.write(self._coredump_buffer)
|
|
||||||
coredump_file.flush()
|
|
||||||
|
|
||||||
if self.websocket_client:
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
yellow_print('Communicating through WebSocket')
|
|
||||||
self.websocket_client.send({'event': 'coredump',
|
|
||||||
'file': coredump_file.name,
|
|
||||||
'prog': self.elf_file})
|
|
||||||
yellow_print('Waiting for debug finished event')
|
|
||||||
self.websocket_client.wait([('event', 'debug_finished')])
|
|
||||||
yellow_print('Communications through WebSocket is finished')
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
import esp_coredump
|
|
||||||
except ImportError as e:
|
|
||||||
yellow_print('Failed to parse core dump info: '
|
|
||||||
'Module {} is not installed \n\n'.format(e.name))
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
self.logger.print(COREDUMP_UART_START + b'\n')
|
|
||||||
self.logger.print(self._coredump_buffer)
|
|
||||||
# end line will be printed in handle_serial_input
|
|
||||||
else:
|
|
||||||
coredump = esp_coredump.CoreDump(core=coredump_file.name, core_format='b64', prog=self.elf_file)
|
|
||||||
f = io.StringIO()
|
|
||||||
with redirect_stdout(f):
|
|
||||||
coredump.info_corefile()
|
|
||||||
output = f.getvalue()
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
self.logger.print(output.encode('utf-8'))
|
|
||||||
self.logger.output_enabled = False # Will be reenabled in check_coredump_trigger_after_print
|
|
||||||
if coredump_file is not None:
|
|
||||||
try:
|
|
||||||
os.unlink(coredump_file.name)
|
|
||||||
except OSError as e:
|
|
||||||
yellow_print('Couldn\'t remote temporary core dump file ({})'.format(e))
|
|
||||||
|
|
||||||
def _check_coredump_trigger_before_print(self, line): # type: (bytes) -> None
|
|
||||||
if self._decode_coredumps == COREDUMP_DECODE_DISABLE:
|
|
||||||
return
|
|
||||||
if COREDUMP_UART_PROMPT in line:
|
|
||||||
yellow_print('Initiating core dump!')
|
|
||||||
self.event_queue.put((TAG_KEY, '\n'))
|
|
||||||
return
|
|
||||||
if COREDUMP_UART_START in line:
|
|
||||||
yellow_print('Core dump started (further output muted)')
|
|
||||||
self._reading_coredump = COREDUMP_READING
|
|
||||||
self._coredump_buffer = b''
|
|
||||||
self.logger.output_enabled = False
|
|
||||||
return
|
|
||||||
if COREDUMP_UART_END in line:
|
|
||||||
self._reading_coredump = COREDUMP_DONE
|
|
||||||
yellow_print('\nCore dump finished!')
|
|
||||||
self._process_coredump()
|
|
||||||
return
|
|
||||||
if self._reading_coredump == COREDUMP_READING:
|
|
||||||
kb = 1024
|
|
||||||
buffer_len_kb = len(self._coredump_buffer) // kb
|
|
||||||
self._coredump_buffer += line.replace(b'\r', b'') + b'\n'
|
|
||||||
new_buffer_len_kb = len(self._coredump_buffer) // kb
|
|
||||||
if new_buffer_len_kb > buffer_len_kb:
|
|
||||||
yellow_print('Received %3d kB...' % new_buffer_len_kb, newline='\r')
|
|
||||||
|
|
||||||
def _check_coredump_trigger_after_print(self): # type: () -> None
|
|
||||||
if self._decode_coredumps == COREDUMP_DECODE_DISABLE:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Re-enable output after the last line of core dump has been consumed
|
|
||||||
if not self.logger.output_enabled and self._reading_coredump == COREDUMP_DONE:
|
|
||||||
self._reading_coredump = COREDUMP_IDLE
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
self._coredump_buffer = b''
|
|
||||||
|
|
||||||
@contextmanager
|
|
||||||
def check(self, line): # type: (bytes) -> Generator
|
|
||||||
self._check_coredump_trigger_before_print(line)
|
|
||||||
try:
|
|
||||||
yield
|
|
||||||
finally:
|
|
||||||
self._check_coredump_trigger_after_print()
|
|
@ -1,8 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
class SerialStopException(Exception):
|
|
||||||
"""
|
|
||||||
This exception is used for stopping the IDF monitor in testing mode.
|
|
||||||
"""
|
|
||||||
pass
|
|
@ -1,134 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import tempfile
|
|
||||||
|
|
||||||
from .constants import PANIC_OUTPUT_DECODE_SCRIPT
|
|
||||||
from .logger import Logger
|
|
||||||
from .output_helpers import normal_print, red_print, yellow_print
|
|
||||||
from .web_socket_client import WebSocketClient
|
|
||||||
|
|
||||||
|
|
||||||
class GDBHelper:
|
|
||||||
def __init__(self, toolchain_prefix, websocket_client, elf_file, port, baud_rate):
|
|
||||||
# type: (str, WebSocketClient, str, int, int) -> None
|
|
||||||
self._gdb_buffer = b'' # type: bytes
|
|
||||||
self._gdb_exit = False # type: bool
|
|
||||||
self.toolchain_prefix = toolchain_prefix
|
|
||||||
self.websocket_client = websocket_client
|
|
||||||
self.elf_file = elf_file
|
|
||||||
self.port = port
|
|
||||||
self.baud_rate = baud_rate
|
|
||||||
|
|
||||||
@property
|
|
||||||
def gdb_buffer(self): # type: () -> bytes
|
|
||||||
return self._gdb_buffer
|
|
||||||
|
|
||||||
@gdb_buffer.setter
|
|
||||||
def gdb_buffer(self, value): # type: (bytes) -> None
|
|
||||||
self._gdb_buffer = value
|
|
||||||
|
|
||||||
@property
|
|
||||||
def gdb_exit(self): # type: () -> bool
|
|
||||||
return self._gdb_exit
|
|
||||||
|
|
||||||
@gdb_exit.setter
|
|
||||||
def gdb_exit(self, value): # type: (bool) -> None
|
|
||||||
self._gdb_exit = value
|
|
||||||
|
|
||||||
def run_gdb(self):
|
|
||||||
# type: () -> None
|
|
||||||
normal_print('')
|
|
||||||
try:
|
|
||||||
cmd = ['%sgdb' % self.toolchain_prefix,
|
|
||||||
'-ex', 'set serial baud %d' % self.baud_rate,
|
|
||||||
'-ex', 'target remote %s' % self.port,
|
|
||||||
self.elf_file]
|
|
||||||
# Here we handling GDB as a process
|
|
||||||
# Open GDB process
|
|
||||||
try:
|
|
||||||
process = subprocess.Popen(cmd, cwd='.')
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
# We ignore Ctrl+C interrupt form external process abd wait response util GDB will be finished.
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
process.wait()
|
|
||||||
break
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass # We ignore the Ctrl+C
|
|
||||||
self.gdb_exit = True
|
|
||||||
except OSError as e:
|
|
||||||
red_print('%s: %s' % (' '.join(cmd), e))
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass # happens on Windows, maybe other OSes
|
|
||||||
finally:
|
|
||||||
try:
|
|
||||||
# on Linux, maybe other OSes, gdb sometimes seems to be alive even after wait() returns...
|
|
||||||
process.terminate()
|
|
||||||
except Exception: # noqa
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
# also on Linux, maybe other OSes, gdb sometimes exits uncleanly and breaks the tty mode
|
|
||||||
subprocess.call(['stty', 'sane'])
|
|
||||||
except Exception: # noqa
|
|
||||||
pass # don't care if there's no stty, we tried...
|
|
||||||
|
|
||||||
def check_gdb_stub_trigger(self, line):
|
|
||||||
# type: (bytes) -> bool
|
|
||||||
line = self.gdb_buffer + line
|
|
||||||
self.gdb_buffer = b''
|
|
||||||
m = re.search(b'\\$(T..)#(..)', line) # look for a gdb "reason" for a break
|
|
||||||
if m is not None:
|
|
||||||
try:
|
|
||||||
chsum = sum(ord(bytes([p])) for p in m.group(1)) & 0xFF
|
|
||||||
calc_chsum = int(m.group(2), 16)
|
|
||||||
except ValueError: # payload wasn't valid hex digits
|
|
||||||
return False
|
|
||||||
if chsum == calc_chsum:
|
|
||||||
if self.websocket_client:
|
|
||||||
yellow_print('Communicating through WebSocket')
|
|
||||||
self.websocket_client.send({'event': 'gdb_stub',
|
|
||||||
'port': self.port,
|
|
||||||
'prog': self.elf_file})
|
|
||||||
yellow_print('Waiting for debug finished event')
|
|
||||||
self.websocket_client.wait([('event', 'debug_finished')])
|
|
||||||
yellow_print('Communications through WebSocket is finished')
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
red_print('Malformed gdb message... calculated checksum %02x received %02x' % (chsum, calc_chsum))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def process_panic_output(self, panic_output, logger, target): # type: (bytes, Logger, str) -> None
|
|
||||||
panic_output_file = None
|
|
||||||
try:
|
|
||||||
# On Windows, the temporary file can't be read unless it is closed.
|
|
||||||
# Set delete=False and delete the file manually later.
|
|
||||||
with tempfile.NamedTemporaryFile(mode='wb', delete=False) as panic_output_file:
|
|
||||||
panic_output_file.write(panic_output)
|
|
||||||
panic_output_file.flush()
|
|
||||||
cmd = [self.toolchain_prefix + 'gdb',
|
|
||||||
'--batch', '-n',
|
|
||||||
self.elf_file,
|
|
||||||
'-ex', "target remote | \"{python}\" \"{script}\" --target {target} \"{output_file}\""
|
|
||||||
.format(python=sys.executable,
|
|
||||||
script=PANIC_OUTPUT_DECODE_SCRIPT,
|
|
||||||
target=target,
|
|
||||||
output_file=panic_output_file.name),
|
|
||||||
'-ex', 'bt']
|
|
||||||
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
|
|
||||||
yellow_print('\nBacktrace:\n\n')
|
|
||||||
logger.print(output) # noqa: E999
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
yellow_print('Failed to run gdb_panic_server.py script: {}\n{}\n\n'.format(e, e.output))
|
|
||||||
logger.print(panic_output)
|
|
||||||
finally:
|
|
||||||
if panic_output_file is not None:
|
|
||||||
try:
|
|
||||||
os.unlink(panic_output_file.name)
|
|
||||||
except OSError as e:
|
|
||||||
yellow_print('Couldn\'t remove temporary panic output file ({})'.format(e))
|
|
@ -1,60 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
|
|
||||||
class LineMatcher(object):
|
|
||||||
"""
|
|
||||||
Assembles a dictionary of filtering rules based on the --print_filter
|
|
||||||
argument of idf_monitor. Then later it is used to match lines and
|
|
||||||
determine whether they should be shown on screen or not.
|
|
||||||
"""
|
|
||||||
LEVEL_N = 0
|
|
||||||
LEVEL_E = 1
|
|
||||||
LEVEL_W = 2
|
|
||||||
LEVEL_I = 3
|
|
||||||
LEVEL_D = 4
|
|
||||||
LEVEL_V = 5
|
|
||||||
|
|
||||||
level = {'N': LEVEL_N, 'E': LEVEL_E, 'W': LEVEL_W, 'I': LEVEL_I, 'D': LEVEL_D,
|
|
||||||
'V': LEVEL_V, '*': LEVEL_V, '': LEVEL_V}
|
|
||||||
|
|
||||||
def __init__(self, print_filter):
|
|
||||||
# type: (str) -> None
|
|
||||||
self._dict = dict()
|
|
||||||
self._re = re.compile(r'^(?:\033\[[01];?[0-9]+m?)?([EWIDV]) \([0-9]+\) ([^:]+): ')
|
|
||||||
items = print_filter.split()
|
|
||||||
if len(items) == 0:
|
|
||||||
self._dict['*'] = self.LEVEL_V # default is to print everything
|
|
||||||
for f in items:
|
|
||||||
s = f.split(r':')
|
|
||||||
if len(s) == 1:
|
|
||||||
# specifying no warning level defaults to verbose level
|
|
||||||
lev = self.LEVEL_V
|
|
||||||
elif len(s) == 2:
|
|
||||||
if len(s[0]) == 0:
|
|
||||||
raise ValueError('No tag specified in filter ' + f)
|
|
||||||
try:
|
|
||||||
lev = self.level[s[1].upper()]
|
|
||||||
except KeyError:
|
|
||||||
raise ValueError('Unknown warning level in filter ' + f)
|
|
||||||
else:
|
|
||||||
raise ValueError('Missing ":" in filter ' + f)
|
|
||||||
self._dict[s[0]] = lev
|
|
||||||
|
|
||||||
def match(self, line):
|
|
||||||
# type: (str) -> bool
|
|
||||||
try:
|
|
||||||
m = self._re.search(line)
|
|
||||||
if m:
|
|
||||||
lev = self.level[m.group(1)]
|
|
||||||
if m.group(2) in self._dict:
|
|
||||||
return self._dict[m.group(2)] >= lev
|
|
||||||
return self._dict.get('*', self.LEVEL_N) >= lev
|
|
||||||
except (KeyError, IndexError):
|
|
||||||
# Regular line written with something else than ESP_LOG*
|
|
||||||
# or an empty line.
|
|
||||||
pass
|
|
||||||
# We need something more than "*.N" for printing.
|
|
||||||
return self._dict.get('*', self.LEVEL_N) > self.LEVEL_N
|
|
@ -1,127 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import datetime
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
from typing import BinaryIO, Callable, Optional, Union # noqa: F401
|
|
||||||
|
|
||||||
from serial.tools import miniterm # noqa: F401
|
|
||||||
|
|
||||||
from .constants import ADDRESS_RE
|
|
||||||
from .output_helpers import lookup_pc_address, red_print, yellow_print
|
|
||||||
from .pc_address_matcher import PcAddressMatcher
|
|
||||||
|
|
||||||
|
|
||||||
class Logger:
|
|
||||||
def __init__(self, elf_file, console, timestamps, timestamp_format, pc_address_buffer, enable_address_decoding,
|
|
||||||
toolchain_prefix):
|
|
||||||
# type: (str, miniterm.Console, bool, str, bytes, bool, str) -> None
|
|
||||||
self.log_file = None # type: Optional[BinaryIO]
|
|
||||||
self._output_enabled = True # type: bool
|
|
||||||
self.elf_file = elf_file
|
|
||||||
self.console = console
|
|
||||||
self.timestamps = timestamps
|
|
||||||
self.timestamp_format = timestamp_format
|
|
||||||
self._pc_address_buffer = pc_address_buffer
|
|
||||||
self.enable_address_decoding = enable_address_decoding
|
|
||||||
self.toolchain_prefix = toolchain_prefix
|
|
||||||
self.pc_address_matcher = PcAddressMatcher(self.elf_file) if enable_address_decoding else None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def pc_address_buffer(self): # type: () -> bytes
|
|
||||||
return self._pc_address_buffer
|
|
||||||
|
|
||||||
@pc_address_buffer.setter
|
|
||||||
def pc_address_buffer(self, value): # type: (bytes) -> None
|
|
||||||
self._pc_address_buffer = value
|
|
||||||
|
|
||||||
@property
|
|
||||||
def output_enabled(self): # type: () -> bool
|
|
||||||
return self._output_enabled
|
|
||||||
|
|
||||||
@output_enabled.setter
|
|
||||||
def output_enabled(self, value): # type: (bool) -> None
|
|
||||||
self._output_enabled = value
|
|
||||||
|
|
||||||
@property
|
|
||||||
def log_file(self): # type: () -> Optional[BinaryIO]
|
|
||||||
return self._log_file
|
|
||||||
|
|
||||||
@log_file.setter
|
|
||||||
def log_file(self, value): # type: (Optional[BinaryIO]) -> None
|
|
||||||
self._log_file = value
|
|
||||||
|
|
||||||
def toggle_logging(self): # type: () -> None
|
|
||||||
if self._log_file:
|
|
||||||
self.stop_logging()
|
|
||||||
else:
|
|
||||||
self.start_logging()
|
|
||||||
|
|
||||||
def toggle_timestamps(self): # type: () -> None
|
|
||||||
self.timestamps = not self.timestamps
|
|
||||||
|
|
||||||
def start_logging(self): # type: () -> None
|
|
||||||
if not self._log_file:
|
|
||||||
name = 'log.{}.{}.txt'.format(os.path.splitext(os.path.basename(self.elf_file))[0],
|
|
||||||
datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
|
|
||||||
try:
|
|
||||||
self.log_file = open(name, 'wb+')
|
|
||||||
yellow_print('\nLogging is enabled into file {}'.format(name))
|
|
||||||
except Exception as e: # noqa
|
|
||||||
red_print('\nLog file {} cannot be created: {}'.format(name, e))
|
|
||||||
|
|
||||||
def stop_logging(self): # type: () -> None
|
|
||||||
if self._log_file:
|
|
||||||
try:
|
|
||||||
name = self._log_file.name
|
|
||||||
self._log_file.close()
|
|
||||||
yellow_print('\nLogging is disabled and file {} has been closed'.format(name))
|
|
||||||
except Exception as e: # noqa
|
|
||||||
red_print('\nLog file cannot be closed: {}'.format(e))
|
|
||||||
finally:
|
|
||||||
self._log_file = None
|
|
||||||
|
|
||||||
def print(self, string, console_printer=None): # noqa: E999
|
|
||||||
# type: (Union[str, bytes], Optional[Callable]) -> None
|
|
||||||
if console_printer is None:
|
|
||||||
console_printer = self.console.write_bytes
|
|
||||||
|
|
||||||
if self.timestamps and (self._output_enabled or self._log_file):
|
|
||||||
t = datetime.datetime.now().strftime(self.timestamp_format)
|
|
||||||
# "string" is not guaranteed to be a full line. Timestamps should be only at the beginning of lines.
|
|
||||||
if isinstance(string, type(u'')):
|
|
||||||
search_patt = '\n'
|
|
||||||
replacement = '\n' + t + ' '
|
|
||||||
else:
|
|
||||||
search_patt = b'\n' # type: ignore
|
|
||||||
replacement = b'\n' + t.encode('ascii') + b' ' # type: ignore
|
|
||||||
string = string.replace(search_patt, replacement) # type: ignore
|
|
||||||
if self._output_enabled:
|
|
||||||
console_printer(string)
|
|
||||||
if self._log_file:
|
|
||||||
try:
|
|
||||||
if isinstance(string, type(u'')):
|
|
||||||
string = string.encode() # type: ignore
|
|
||||||
self._log_file.write(string) # type: ignore
|
|
||||||
except Exception as e:
|
|
||||||
red_print('\nCannot write to file: {}'.format(e))
|
|
||||||
# don't fill-up the screen with the previous errors (probably consequent prints would fail also)
|
|
||||||
self.stop_logging()
|
|
||||||
|
|
||||||
def output_toggle(self): # type: () -> None
|
|
||||||
self.output_enabled = not self.output_enabled
|
|
||||||
yellow_print('\nToggle output display: {}, Type Ctrl-T Ctrl-Y to show/disable output again.'.format(
|
|
||||||
self.output_enabled))
|
|
||||||
|
|
||||||
def handle_possible_pc_address_in_line(self, line): # type: (bytes) -> None
|
|
||||||
line = self._pc_address_buffer + line
|
|
||||||
self._pc_address_buffer = b''
|
|
||||||
if not self.enable_address_decoding:
|
|
||||||
return
|
|
||||||
for m in re.finditer(ADDRESS_RE, line.decode(errors='ignore')):
|
|
||||||
num = m.group()
|
|
||||||
if self.pc_address_matcher.is_executable_address(int(num, 16)):
|
|
||||||
translation = lookup_pc_address(num, self.toolchain_prefix, self.elf_file)
|
|
||||||
if translation:
|
|
||||||
self.print(translation, console_printer=yellow_print)
|
|
@ -1,41 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
from typing import BinaryIO, Callable, Optional, Union # noqa: F401
|
|
||||||
|
|
||||||
# ANSI terminal codes (if changed, regular expressions in LineMatcher need to be updated)
|
|
||||||
ANSI_RED = '\033[1;31m'
|
|
||||||
ANSI_YELLOW = '\033[0;33m'
|
|
||||||
ANSI_NORMAL = '\033[0m'
|
|
||||||
|
|
||||||
|
|
||||||
def color_print(message, color, newline='\n'): # type: (str, str, Optional[str]) -> None
|
|
||||||
""" Print a message to stderr with colored highlighting """
|
|
||||||
sys.stderr.write('%s%s%s%s' % (color, message, ANSI_NORMAL, newline))
|
|
||||||
sys.stderr.flush()
|
|
||||||
|
|
||||||
|
|
||||||
def normal_print(message): # type: (str) -> None
|
|
||||||
sys.stderr.write(ANSI_NORMAL + message)
|
|
||||||
|
|
||||||
|
|
||||||
def yellow_print(message, newline='\n'): # type: (str, Optional[str]) -> None
|
|
||||||
color_print(message, ANSI_YELLOW, newline)
|
|
||||||
|
|
||||||
|
|
||||||
def red_print(message, newline='\n'): # type: (str, Optional[str]) -> None
|
|
||||||
color_print(message, ANSI_RED, newline)
|
|
||||||
|
|
||||||
|
|
||||||
def lookup_pc_address(pc_addr, toolchain_prefix, elf_file): # type: (str, str, str) -> Optional[str]
|
|
||||||
cmd = ['%saddr2line' % toolchain_prefix, '-pfiaC', '-e', elf_file, pc_addr]
|
|
||||||
|
|
||||||
try:
|
|
||||||
translation = subprocess.check_output(cmd, cwd='.')
|
|
||||||
if b'?? ??:0' not in translation:
|
|
||||||
return translation.decode()
|
|
||||||
except OSError as e:
|
|
||||||
red_print('%s: %s' % (' '.join(cmd), e))
|
|
||||||
return None
|
|
@ -1,60 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
from elftools.elf.constants import SH_FLAGS
|
|
||||||
from elftools.elf.elffile import ELFFile
|
|
||||||
|
|
||||||
|
|
||||||
class PcAddressMatcher(object):
|
|
||||||
"""
|
|
||||||
Class for detecting potential addresses which will consequently run through the external addr2line command to
|
|
||||||
identify and print information about it.
|
|
||||||
|
|
||||||
The input to this class is the path to the ELF file. Addresses of sections with executable flag are stored and
|
|
||||||
used later for lookup.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, elf_path): # type: (str) -> None
|
|
||||||
self.intervals = []
|
|
||||||
try:
|
|
||||||
with open(elf_path, 'rb') as f:
|
|
||||||
# Is this an ELF file?
|
|
||||||
elf_magic = f.read(4)
|
|
||||||
if elf_magic != b'\x7fELF':
|
|
||||||
# Probably not an ELF file
|
|
||||||
# (could be Mach-O format on macOS, for example)
|
|
||||||
raise NotImplementedError()
|
|
||||||
f.seek(0)
|
|
||||||
|
|
||||||
elf = ELFFile(f)
|
|
||||||
|
|
||||||
for section in elf.iter_sections():
|
|
||||||
if section['sh_flags'] & SH_FLAGS.SHF_EXECINSTR:
|
|
||||||
start = section['sh_addr']
|
|
||||||
size = section['sh_size']
|
|
||||||
end = start + size
|
|
||||||
self.intervals.append((start, end))
|
|
||||||
|
|
||||||
except FileNotFoundError:
|
|
||||||
# ELF file is just an optional argument
|
|
||||||
pass
|
|
||||||
except NotImplementedError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# sort them in order to have faster lookup
|
|
||||||
self.intervals = sorted(self.intervals)
|
|
||||||
|
|
||||||
def is_executable_address(self, addr): # type: (int) -> bool
|
|
||||||
"""
|
|
||||||
Returns True/False if "addr" is in one of the ELF sections with executable flag set.
|
|
||||||
"""
|
|
||||||
|
|
||||||
for start, end in self.intervals:
|
|
||||||
if start > addr:
|
|
||||||
# The intervals are sorted. This means that loop can end because all remaining intervals starts are
|
|
||||||
# greater than the current start
|
|
||||||
return False
|
|
||||||
if start <= addr < end:
|
|
||||||
return True
|
|
||||||
|
|
||||||
return False
|
|
@ -1,265 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import hashlib
|
|
||||||
import os
|
|
||||||
import queue # noqa: F401
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
import time
|
|
||||||
from typing import Callable, Optional
|
|
||||||
|
|
||||||
import serial # noqa: F401
|
|
||||||
from serial.tools import miniterm # noqa: F401
|
|
||||||
|
|
||||||
from .chip_specific_config import get_chip_config
|
|
||||||
from .console_parser import ConsoleParser, prompt_next_action # noqa: F401
|
|
||||||
from .console_reader import ConsoleReader # noqa: F401
|
|
||||||
from .constants import (CMD_APP_FLASH, CMD_ENTER_BOOT, CMD_MAKE, CMD_OUTPUT_TOGGLE, CMD_RESET, CMD_STOP,
|
|
||||||
CMD_TOGGLE_LOGGING, CMD_TOGGLE_TIMESTAMPS, PANIC_DECODE_DISABLE, PANIC_END, PANIC_IDLE,
|
|
||||||
PANIC_READING, PANIC_STACK_DUMP, PANIC_START)
|
|
||||||
from .coredump import CoreDump
|
|
||||||
from .exceptions import SerialStopException
|
|
||||||
from .gdbhelper import GDBHelper
|
|
||||||
from .line_matcher import LineMatcher
|
|
||||||
from .logger import Logger
|
|
||||||
from .output_helpers import yellow_print
|
|
||||||
from .serial_reader import Reader
|
|
||||||
|
|
||||||
|
|
||||||
def get_sha256(filename, block_size=65536): # type: (str, int) -> str
|
|
||||||
sha256 = hashlib.sha256()
|
|
||||||
with open(filename, 'rb') as f:
|
|
||||||
for block in iter(lambda: f.read(block_size), b''):
|
|
||||||
sha256.update(block)
|
|
||||||
return sha256.hexdigest()
|
|
||||||
|
|
||||||
|
|
||||||
def run_make(target, make, console, console_parser, event_queue, cmd_queue, logger):
|
|
||||||
# type: (str, str, miniterm.Console, ConsoleParser, queue.Queue, queue.Queue, Logger) -> None
|
|
||||||
if isinstance(make, list):
|
|
||||||
popen_args = make + [target]
|
|
||||||
else:
|
|
||||||
popen_args = [make, target]
|
|
||||||
yellow_print('Running %s...' % ' '.join(popen_args))
|
|
||||||
p = subprocess.Popen(popen_args, env=os.environ)
|
|
||||||
try:
|
|
||||||
p.wait()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
p.wait()
|
|
||||||
if p.returncode != 0:
|
|
||||||
prompt_next_action('Build failed', console, console_parser, event_queue, cmd_queue)
|
|
||||||
else:
|
|
||||||
logger.output_enabled = True
|
|
||||||
|
|
||||||
|
|
||||||
class SerialHandler:
|
|
||||||
"""
|
|
||||||
The class is responsible for buffering serial input and performing corresponding commands.
|
|
||||||
"""
|
|
||||||
def __init__(self, last_line_part, serial_check_exit, logger, decode_panic, reading_panic, panic_buffer, target,
|
|
||||||
force_line_print, start_cmd_sent, serial_instance, encrypted, reset, elf_file):
|
|
||||||
# type: (bytes, bool, Logger, str, int, bytes,str, bool, bool, serial.Serial, bool, bool, str) -> None
|
|
||||||
self._last_line_part = last_line_part
|
|
||||||
self._serial_check_exit = serial_check_exit
|
|
||||||
self.logger = logger
|
|
||||||
self._decode_panic = decode_panic
|
|
||||||
self._reading_panic = reading_panic
|
|
||||||
self._panic_buffer = panic_buffer
|
|
||||||
self.target = target
|
|
||||||
self._force_line_print = force_line_print
|
|
||||||
self.start_cmd_sent = start_cmd_sent
|
|
||||||
self.serial_instance = serial_instance
|
|
||||||
self.encrypted = encrypted
|
|
||||||
self.reset = reset
|
|
||||||
self.elf_file = elf_file
|
|
||||||
|
|
||||||
def handle_serial_input(self, data, console_parser, coredump, gdb_helper, line_matcher,
|
|
||||||
check_gdb_stub_and_run, finalize_line=False):
|
|
||||||
# type: (bytes, ConsoleParser, CoreDump, Optional[GDBHelper], LineMatcher, Callable, bool) -> None
|
|
||||||
# Remove "+" after Continue command
|
|
||||||
if self.start_cmd_sent:
|
|
||||||
self.start_cmd_sent = False
|
|
||||||
pos = data.find(b'+')
|
|
||||||
if pos != -1:
|
|
||||||
data = data[(pos + 1):]
|
|
||||||
|
|
||||||
sp = data.split(b'\n')
|
|
||||||
if self._last_line_part != b'':
|
|
||||||
# add unprocessed part from previous "data" to the first line
|
|
||||||
sp[0] = self._last_line_part + sp[0]
|
|
||||||
self._last_line_part = b''
|
|
||||||
if sp[-1] != b'':
|
|
||||||
# last part is not a full line
|
|
||||||
self._last_line_part = sp.pop()
|
|
||||||
for line in sp:
|
|
||||||
if line == b'':
|
|
||||||
continue
|
|
||||||
if self._serial_check_exit and line == console_parser.exit_key.encode('latin-1'):
|
|
||||||
raise SerialStopException()
|
|
||||||
if gdb_helper:
|
|
||||||
self.check_panic_decode_trigger(line, gdb_helper)
|
|
||||||
with coredump.check(line):
|
|
||||||
if self._force_line_print or line_matcher.match(line.decode(errors='ignore')):
|
|
||||||
self.logger.print(line + b'\n')
|
|
||||||
self.compare_elf_sha256(line.decode(errors='ignore'))
|
|
||||||
self.logger.handle_possible_pc_address_in_line(line)
|
|
||||||
check_gdb_stub_and_run(line)
|
|
||||||
self._force_line_print = False
|
|
||||||
# Now we have the last part (incomplete line) in _last_line_part. By
|
|
||||||
# default we don't touch it and just wait for the arrival of the rest
|
|
||||||
# of the line. But after some time when we didn't received it we need
|
|
||||||
# to make a decision.
|
|
||||||
force_print_or_matched = any((
|
|
||||||
self._force_line_print,
|
|
||||||
(finalize_line and line_matcher.match(self._last_line_part.decode(errors='ignore')))
|
|
||||||
))
|
|
||||||
if self._last_line_part != b'' and force_print_or_matched:
|
|
||||||
self._force_line_print = True
|
|
||||||
self.logger.print(self._last_line_part)
|
|
||||||
self.logger.handle_possible_pc_address_in_line(self._last_line_part)
|
|
||||||
check_gdb_stub_and_run(self._last_line_part)
|
|
||||||
# It is possible that the incomplete line cuts in half the PC
|
|
||||||
# address. A small buffer is kept and will be used the next time
|
|
||||||
# handle_possible_pc_address_in_line is invoked to avoid this problem.
|
|
||||||
# ADDRESS_RE matches 10 character long addresses. Therefore, we
|
|
||||||
# keep the last 9 characters.
|
|
||||||
self.logger.pc_address_buffer = self._last_line_part[-9:]
|
|
||||||
# GDB sequence can be cut in half also. GDB sequence is 7
|
|
||||||
# characters long, therefore, we save the last 6 characters.
|
|
||||||
if gdb_helper:
|
|
||||||
gdb_helper.gdb_buffer = self._last_line_part[-6:]
|
|
||||||
self._last_line_part = b''
|
|
||||||
# else: keeping _last_line_part and it will be processed the next time
|
|
||||||
# handle_serial_input is invoked
|
|
||||||
|
|
||||||
def check_panic_decode_trigger(self, line, gdb_helper): # type: (bytes, GDBHelper) -> None
|
|
||||||
if self._decode_panic == PANIC_DECODE_DISABLE:
|
|
||||||
return
|
|
||||||
|
|
||||||
if self._reading_panic == PANIC_IDLE and re.search(PANIC_START, line.decode('ascii', errors='ignore')):
|
|
||||||
self._reading_panic = PANIC_READING
|
|
||||||
yellow_print('Stack dump detected')
|
|
||||||
|
|
||||||
if self._reading_panic == PANIC_READING and PANIC_STACK_DUMP in line:
|
|
||||||
self.logger.output_enabled = False
|
|
||||||
|
|
||||||
if self._reading_panic == PANIC_READING:
|
|
||||||
self._panic_buffer += line.replace(b'\r', b'') + b'\n'
|
|
||||||
|
|
||||||
if self._reading_panic == PANIC_READING and PANIC_END in line:
|
|
||||||
self._reading_panic = PANIC_IDLE
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
gdb_helper.process_panic_output(self._panic_buffer, self.logger, self.target)
|
|
||||||
self._panic_buffer = b''
|
|
||||||
|
|
||||||
def compare_elf_sha256(self, line): # type: (str) -> None
|
|
||||||
elf_sha256_matcher = re.compile(
|
|
||||||
r'ELF file SHA256:\s+(?P<sha256_flashed>[a-z0-9]+)'
|
|
||||||
)
|
|
||||||
file_sha256_flashed_match = re.search(elf_sha256_matcher, line)
|
|
||||||
if not file_sha256_flashed_match:
|
|
||||||
return
|
|
||||||
file_sha256_flashed = file_sha256_flashed_match.group('sha256_flashed')
|
|
||||||
if not os.path.exists(self.elf_file):
|
|
||||||
yellow_print(f'ELF file not found. '
|
|
||||||
f"You need to build & flash the project before running 'monitor', "
|
|
||||||
f'and the binary on the device must match the one in the build directory exactly. ')
|
|
||||||
else:
|
|
||||||
file_sha256_build = get_sha256(self.elf_file)
|
|
||||||
if file_sha256_flashed not in f'{file_sha256_build}':
|
|
||||||
yellow_print(f'Warning: checksum mismatch between flashed and built applications. '
|
|
||||||
f'Checksum of built application is {file_sha256_build}')
|
|
||||||
|
|
||||||
def handle_commands(self, cmd, chip, run_make_func, console_reader, serial_reader):
|
|
||||||
# type: (int, str, Callable, ConsoleReader, Reader) -> None
|
|
||||||
config = get_chip_config(chip)
|
|
||||||
reset_delay = config['reset']
|
|
||||||
enter_boot_set = config['enter_boot_set']
|
|
||||||
enter_boot_unset = config['enter_boot_unset']
|
|
||||||
|
|
||||||
high = False
|
|
||||||
low = True
|
|
||||||
|
|
||||||
if chip == 'linux':
|
|
||||||
if cmd in [CMD_RESET,
|
|
||||||
CMD_MAKE,
|
|
||||||
CMD_APP_FLASH,
|
|
||||||
CMD_ENTER_BOOT]:
|
|
||||||
yellow_print('linux target does not support this command')
|
|
||||||
return
|
|
||||||
|
|
||||||
if cmd == CMD_STOP:
|
|
||||||
console_reader.stop()
|
|
||||||
serial_reader.stop()
|
|
||||||
elif cmd == CMD_RESET:
|
|
||||||
self.serial_instance.setRTS(low) # EN=LOW, chip in reset
|
|
||||||
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
|
|
||||||
time.sleep(reset_delay)
|
|
||||||
self.serial_instance.setRTS(high) # EN=HIGH, chip out of reset
|
|
||||||
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
|
|
||||||
self.logger.output_enabled = True
|
|
||||||
elif cmd == CMD_MAKE:
|
|
||||||
run_make_func('encrypted-flash' if self.encrypted else 'flash')
|
|
||||||
elif cmd == CMD_APP_FLASH:
|
|
||||||
run_make_func('encrypted-app-flash' if self.encrypted else 'app-flash')
|
|
||||||
elif cmd == CMD_OUTPUT_TOGGLE:
|
|
||||||
self.logger.output_toggle()
|
|
||||||
elif cmd == CMD_TOGGLE_LOGGING:
|
|
||||||
self.logger.toggle_logging()
|
|
||||||
elif cmd == CMD_TOGGLE_TIMESTAMPS:
|
|
||||||
self.logger.toggle_timestamps()
|
|
||||||
elif cmd == CMD_ENTER_BOOT:
|
|
||||||
yellow_print('Pause app (enter bootloader mode), press Ctrl-T Ctrl-R to restart')
|
|
||||||
self.serial_instance.setDTR(high) # IO0=HIGH
|
|
||||||
self.serial_instance.setRTS(low) # EN=LOW, chip in reset
|
|
||||||
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
|
|
||||||
time.sleep(enter_boot_set) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.1
|
|
||||||
self.serial_instance.setDTR(low) # IO0=LOW
|
|
||||||
self.serial_instance.setRTS(high) # EN=HIGH, chip out of reset
|
|
||||||
self.serial_instance.setDTR(self.serial_instance.dtr) # usbser.sys workaround
|
|
||||||
time.sleep(enter_boot_unset) # timeouts taken from esptool.py, includes esp32r0 workaround. defaults: 0.05
|
|
||||||
self.serial_instance.setDTR(high) # IO0=HIGH, done
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Bad command data %d' % cmd) # type: ignore
|
|
||||||
|
|
||||||
|
|
||||||
class SerialHandlerNoElf(SerialHandler):
|
|
||||||
# This method avoids using 'gdb_helper,' 'coredump' and 'handle_possible_pc_address_in_line'
|
|
||||||
# where the elf file is required to be passed
|
|
||||||
def handle_serial_input(self, data, console_parser, coredump, gdb_helper, line_matcher,
|
|
||||||
check_gdb_stub_and_run, finalize_line=False):
|
|
||||||
# type: (bytes, ConsoleParser, CoreDump, Optional[GDBHelper], LineMatcher, Callable, bool) -> None
|
|
||||||
|
|
||||||
if self.start_cmd_sent:
|
|
||||||
self.start_cmd_sent = False
|
|
||||||
pos = data.find(b'+')
|
|
||||||
if pos != -1:
|
|
||||||
data = data[(pos + 1):]
|
|
||||||
|
|
||||||
sp = data.split(b'\n')
|
|
||||||
if self._last_line_part != b'':
|
|
||||||
# add unprocessed part from previous "data" to the first line
|
|
||||||
sp[0] = self._last_line_part + sp[0]
|
|
||||||
self._last_line_part = b''
|
|
||||||
if sp[-1] != b'':
|
|
||||||
# last part is not a full line
|
|
||||||
self._last_line_part = sp.pop()
|
|
||||||
for line in sp:
|
|
||||||
if line == b'':
|
|
||||||
continue
|
|
||||||
if self._serial_check_exit and line == console_parser.exit_key.encode('latin-1'):
|
|
||||||
raise SerialStopException()
|
|
||||||
|
|
||||||
self.logger.print(line + b'\n')
|
|
||||||
self.compare_elf_sha256(line.decode(errors='ignore'))
|
|
||||||
self._force_line_print = False
|
|
||||||
|
|
||||||
force_print_or_matched = any((
|
|
||||||
self._force_line_print,
|
|
||||||
(finalize_line and line_matcher.match(self._last_line_part.decode(errors='ignore')))
|
|
||||||
))
|
|
||||||
|
|
||||||
if self._last_line_part != b'' and force_print_or_matched:
|
|
||||||
self._force_line_print = True
|
|
||||||
self.logger.print(self._last_line_part)
|
|
@ -1,126 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import queue
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
|
|
||||||
import serial
|
|
||||||
|
|
||||||
from .constants import CHECK_ALIVE_FLAG_TIMEOUT, MINIMAL_EN_LOW_DELAY, RECONNECT_DELAY, TAG_SERIAL
|
|
||||||
from .output_helpers import red_print, yellow_print
|
|
||||||
from .stoppable_thread import StoppableThread
|
|
||||||
|
|
||||||
|
|
||||||
class Reader(StoppableThread):
|
|
||||||
""" Output Reader base class """
|
|
||||||
|
|
||||||
|
|
||||||
class SerialReader(Reader):
|
|
||||||
""" Read serial data from the serial port and push to the
|
|
||||||
event queue, until stopped.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, serial_instance, event_queue, reset):
|
|
||||||
# type: (serial.Serial, queue.Queue, bool) -> None
|
|
||||||
super(SerialReader, self).__init__()
|
|
||||||
self.baud = serial_instance.baudrate
|
|
||||||
self.serial = serial_instance
|
|
||||||
self.event_queue = event_queue
|
|
||||||
self.gdb_exit = False
|
|
||||||
self.reset = reset
|
|
||||||
if not hasattr(self.serial, 'cancel_read'):
|
|
||||||
# enable timeout for checking alive flag,
|
|
||||||
# if cancel_read not available
|
|
||||||
self.serial.timeout = CHECK_ALIVE_FLAG_TIMEOUT
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
# type: () -> None
|
|
||||||
if not self.serial.is_open:
|
|
||||||
self.serial.baudrate = self.baud
|
|
||||||
# We can come to this thread at startup or from external application line GDB.
|
|
||||||
# If we come from GDB we would like to continue to run without reset.
|
|
||||||
|
|
||||||
high = False
|
|
||||||
low = True
|
|
||||||
|
|
||||||
self.serial.dtr = low # Non reset state
|
|
||||||
self.serial.rts = high # IO0=HIGH
|
|
||||||
self.serial.dtr = self.serial.dtr # usbser.sys workaround
|
|
||||||
# Current state not reset the target!
|
|
||||||
self.serial.open()
|
|
||||||
if not self.gdb_exit and self.reset:
|
|
||||||
self.serial.dtr = high # Set dtr to reset state (affected by rts)
|
|
||||||
self.serial.rts = low # Set rts/dtr to the reset state
|
|
||||||
self.serial.dtr = self.serial.dtr # usbser.sys workaround
|
|
||||||
|
|
||||||
# Add a delay to meet the requirements of minimal EN low time (2ms for ESP32-C3)
|
|
||||||
time.sleep(MINIMAL_EN_LOW_DELAY)
|
|
||||||
elif not self.reset:
|
|
||||||
self.serial.setDTR(high) # IO0=HIGH, default state
|
|
||||||
self.gdb_exit = False
|
|
||||||
self.serial.rts = high # Set rts/dtr to the working state
|
|
||||||
self.serial.dtr = self.serial.dtr # usbser.sys workaround
|
|
||||||
try:
|
|
||||||
while self.alive:
|
|
||||||
try:
|
|
||||||
data = self.serial.read(self.serial.in_waiting or 1)
|
|
||||||
except (serial.serialutil.SerialException, IOError) as e:
|
|
||||||
data = b''
|
|
||||||
# self.serial.open() was successful before, therefore, this is an issue related to
|
|
||||||
# the disappearance of the device
|
|
||||||
red_print(e)
|
|
||||||
yellow_print('Waiting for the device to reconnect', newline='')
|
|
||||||
self.serial.close()
|
|
||||||
while self.alive: # so that exiting monitor works while waiting
|
|
||||||
try:
|
|
||||||
time.sleep(RECONNECT_DELAY)
|
|
||||||
if not self.reset:
|
|
||||||
self.serial.dtr = low # Non reset state
|
|
||||||
self.serial.rts = high # IO0=HIGH
|
|
||||||
self.serial.dtr = self.serial.dtr # usbser.sys workaround
|
|
||||||
self.serial.open()
|
|
||||||
break # device connected
|
|
||||||
except serial.serialutil.SerialException:
|
|
||||||
yellow_print('.', newline='')
|
|
||||||
sys.stderr.flush()
|
|
||||||
yellow_print('') # go to new line
|
|
||||||
if data:
|
|
||||||
self.event_queue.put((TAG_SERIAL, data), False)
|
|
||||||
finally:
|
|
||||||
self.serial.close()
|
|
||||||
|
|
||||||
def _cancel(self):
|
|
||||||
# type: () -> None
|
|
||||||
if hasattr(self.serial, 'cancel_read'):
|
|
||||||
try:
|
|
||||||
self.serial.cancel_read()
|
|
||||||
except Exception: # noqa
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class LinuxReader(Reader):
|
|
||||||
""" Read data from the subprocess that runs runnable and push to the
|
|
||||||
event queue, until stopped.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, process, event_queue):
|
|
||||||
# type: (subprocess.Popen, queue.Queue) -> None
|
|
||||||
super().__init__()
|
|
||||||
self.proc = process
|
|
||||||
self.event_queue = event_queue
|
|
||||||
|
|
||||||
self._stdout = iter(self.proc.stdout.readline, b'') # type: ignore
|
|
||||||
|
|
||||||
def run(self): # type: () -> None
|
|
||||||
try:
|
|
||||||
while self.alive:
|
|
||||||
for line in self._stdout:
|
|
||||||
if line:
|
|
||||||
self.event_queue.put((TAG_SERIAL, line), False)
|
|
||||||
finally:
|
|
||||||
self.proc.terminate()
|
|
||||||
|
|
||||||
def _cancel(self): # type: () -> None
|
|
||||||
self.proc.terminate()
|
|
@ -1,57 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import threading
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
|
|
||||||
class StoppableThread(object):
|
|
||||||
"""
|
|
||||||
Provide a Thread-like class which can be 'cancelled' via a subclass-provided
|
|
||||||
cancellation method.
|
|
||||||
|
|
||||||
Can be started and stopped multiple times.
|
|
||||||
|
|
||||||
Isn't an instance of type Thread because Python Thread objects can only be run once
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
# type: () -> None
|
|
||||||
self._thread = None # type: Optional[threading.Thread]
|
|
||||||
|
|
||||||
@property
|
|
||||||
def alive(self):
|
|
||||||
# type: () -> bool
|
|
||||||
"""
|
|
||||||
Is 'alive' whenever the internal thread object exists
|
|
||||||
"""
|
|
||||||
return self._thread is not None
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
# type: () -> None
|
|
||||||
if self._thread is None:
|
|
||||||
self._thread = threading.Thread(target=self._run_outer)
|
|
||||||
self._thread.start()
|
|
||||||
|
|
||||||
def _cancel(self):
|
|
||||||
# type: () -> None
|
|
||||||
pass # override to provide cancellation functionality
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
# type: () -> None
|
|
||||||
pass # override for the main thread behaviour
|
|
||||||
|
|
||||||
def _run_outer(self):
|
|
||||||
# type: () -> None
|
|
||||||
try:
|
|
||||||
self.run()
|
|
||||||
finally:
|
|
||||||
self._thread = None
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
# type: () -> None
|
|
||||||
if self._thread is not None:
|
|
||||||
old_thread = self._thread
|
|
||||||
self._thread = None
|
|
||||||
self._cancel()
|
|
||||||
old_thread.join()
|
|
@ -1,98 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import json
|
|
||||||
import time
|
|
||||||
|
|
||||||
from .output_helpers import red_print, yellow_print
|
|
||||||
|
|
||||||
try:
|
|
||||||
import websocket
|
|
||||||
except ImportError:
|
|
||||||
# This is needed for IDE integration only.
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class WebSocketClient(object):
|
|
||||||
"""
|
|
||||||
WebSocket client used to advertise debug events to WebSocket server by sending and receiving JSON-serialized
|
|
||||||
dictionaries.
|
|
||||||
|
|
||||||
Advertisement of debug event:
|
|
||||||
{'event': 'gdb_stub', 'port': '/dev/ttyUSB1', 'prog': 'build/elf_file'} for GDB Stub, or
|
|
||||||
{'event': 'coredump', 'file': '/tmp/xy', 'prog': 'build/elf_file'} for coredump,
|
|
||||||
where 'port' is the port for the connected device, 'prog' is the full path to the ELF file and 'file' is the
|
|
||||||
generated coredump file.
|
|
||||||
|
|
||||||
Expected end of external debugging:
|
|
||||||
{'event': 'debug_finished'}
|
|
||||||
"""
|
|
||||||
|
|
||||||
RETRIES = 3
|
|
||||||
CONNECTION_RETRY_DELAY = 1
|
|
||||||
|
|
||||||
def __init__(self, url): # type: (str) -> None
|
|
||||||
self.url = url
|
|
||||||
self._connect()
|
|
||||||
|
|
||||||
def _connect(self): # type: () -> None
|
|
||||||
"""
|
|
||||||
Connect to WebSocket server at url
|
|
||||||
"""
|
|
||||||
|
|
||||||
self.close()
|
|
||||||
for _ in range(self.RETRIES):
|
|
||||||
try:
|
|
||||||
self.ws = websocket.create_connection(self.url)
|
|
||||||
break # success
|
|
||||||
except NameError:
|
|
||||||
raise RuntimeError('Please install the websocket_client package for IDE integration!')
|
|
||||||
except Exception as e: # noqa
|
|
||||||
red_print('WebSocket connection error: {}'.format(e))
|
|
||||||
time.sleep(self.CONNECTION_RETRY_DELAY)
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Cannot connect to WebSocket server')
|
|
||||||
|
|
||||||
def close(self): # type: () -> None
|
|
||||||
try:
|
|
||||||
self.ws.close()
|
|
||||||
except AttributeError:
|
|
||||||
# Not yet connected
|
|
||||||
pass
|
|
||||||
except Exception as e: # noqa
|
|
||||||
red_print('WebSocket close error: {}'.format(e))
|
|
||||||
|
|
||||||
def send(self, payload_dict): # type: (dict) -> None
|
|
||||||
"""
|
|
||||||
Serialize payload_dict in JSON format and send it to the server
|
|
||||||
"""
|
|
||||||
for _ in range(self.RETRIES):
|
|
||||||
try:
|
|
||||||
self.ws.send(json.dumps(payload_dict))
|
|
||||||
yellow_print('WebSocket sent: {}'.format(payload_dict))
|
|
||||||
break
|
|
||||||
except Exception as e: # noqa
|
|
||||||
red_print('WebSocket send error: {}'.format(e))
|
|
||||||
self._connect()
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Cannot send to WebSocket server')
|
|
||||||
|
|
||||||
def wait(self, expect_iterable): # type: (list) -> None
|
|
||||||
"""
|
|
||||||
Wait until a dictionary in JSON format is received from the server with all (key, value) tuples from
|
|
||||||
expect_iterable.
|
|
||||||
"""
|
|
||||||
for _ in range(self.RETRIES):
|
|
||||||
try:
|
|
||||||
r = self.ws.recv()
|
|
||||||
except Exception as e:
|
|
||||||
red_print('WebSocket receive error: {}'.format(e))
|
|
||||||
self._connect()
|
|
||||||
continue
|
|
||||||
obj = json.loads(r)
|
|
||||||
if all([k in obj and obj[k] == v for k, v in expect_iterable]):
|
|
||||||
yellow_print('WebSocket received: {}'.format(obj))
|
|
||||||
break
|
|
||||||
red_print('WebSocket expected: {}, received: {}'.format(dict(expect_iterable), obj))
|
|
||||||
else:
|
|
||||||
raise RuntimeError('Cannot receive from WebSocket server')
|
|
@ -5,10 +5,9 @@ import json
|
|||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
from typing import Any, Dict, List
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
import click
|
import click
|
||||||
from idf_monitor_base.output_helpers import yellow_print
|
|
||||||
from idf_py_actions.global_options import global_options
|
from idf_py_actions.global_options import global_options
|
||||||
from idf_py_actions.tools import (PropertyDict, RunTool, ensure_build_directory, get_default_serial_port,
|
from idf_py_actions.tools import (PropertyDict, RunTool, ensure_build_directory, get_default_serial_port,
|
||||||
get_sdkconfig_value, run_target)
|
get_sdkconfig_value, run_target)
|
||||||
@ -33,6 +32,12 @@ PORT = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def yellow_print(message, newline='\n'): # type: (str, Optional[str]) -> None
|
||||||
|
"""Print a message to stderr with yellow highlighting """
|
||||||
|
sys.stderr.write('%s%s%s%s' % ('\033[0;33m', message, '\033[0m', newline))
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
|
||||||
def action_extensions(base_actions: Dict, project_path: str) -> Dict:
|
def action_extensions(base_actions: Dict, project_path: str) -> Dict:
|
||||||
def _get_project_desc(ctx: click.core.Context, args: PropertyDict) -> Any:
|
def _get_project_desc(ctx: click.core.Context, args: PropertyDict) -> Any:
|
||||||
desc_path = os.path.join(args.build_dir, 'project_description.json')
|
desc_path = os.path.join(args.build_dir, 'project_description.json')
|
||||||
@ -81,7 +86,7 @@ def action_extensions(base_actions: Dict, project_path: str) -> Dict:
|
|||||||
def monitor(action: str, ctx: click.core.Context, args: PropertyDict, print_filter: str, monitor_baud: str, encrypted: bool,
|
def monitor(action: str, ctx: click.core.Context, args: PropertyDict, print_filter: str, monitor_baud: str, encrypted: bool,
|
||||||
no_reset: bool, timestamps: bool, timestamp_format: str, force_color: bool) -> None:
|
no_reset: bool, timestamps: bool, timestamp_format: str, force_color: bool) -> None:
|
||||||
"""
|
"""
|
||||||
Run idf_monitor.py to watch build output
|
Run esp_idf_monitor to watch build output
|
||||||
"""
|
"""
|
||||||
project_desc = _get_project_desc(ctx, args)
|
project_desc = _get_project_desc(ctx, args)
|
||||||
elf_file = os.path.join(args.build_dir, project_desc['app_elf'])
|
elf_file = os.path.join(args.build_dir, project_desc['app_elf'])
|
||||||
|
@ -10,6 +10,7 @@ idf-component-manager
|
|||||||
esp-coredump
|
esp-coredump
|
||||||
esptool
|
esptool
|
||||||
esp-idf-kconfig
|
esp-idf-kconfig
|
||||||
|
esp-idf-monitor
|
||||||
|
|
||||||
# gdb extensions dependencies
|
# gdb extensions dependencies
|
||||||
freertos_gdb
|
freertos_gdb
|
||||||
|
@ -12,11 +12,10 @@ from pytest_embedded import Dut
|
|||||||
@pytest.mark.generic
|
@pytest.mark.generic
|
||||||
@pytest.mark.supported_targets
|
@pytest.mark.supported_targets
|
||||||
def test_monitor_addr_lookup(config: str, dut: Dut) -> None:
|
def test_monitor_addr_lookup(config: str, dut: Dut) -> None:
|
||||||
# The port needs to be closed because idf_monitor.py will connect to it
|
# The port needs to be closed because esp_idf_monitor will connect to it
|
||||||
dut.serial.stop_redirect_thread()
|
dut.serial.stop_redirect_thread()
|
||||||
|
|
||||||
monitor_py = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_monitor.py')
|
monitor_cmd = ' '.join([sys.executable, '-m', 'esp_idf_monitor', os.path.join(dut.app.binary_path, 'monitor_addr_lookup.elf'),
|
||||||
monitor_cmd = ' '.join([sys.executable, monitor_py, os.path.join(dut.app.binary_path, 'monitor_addr_lookup.elf'),
|
|
||||||
'--port', str(dut.serial.port)])
|
'--port', str(dut.serial.port)])
|
||||||
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')
|
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
# SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
@ -70,11 +70,10 @@ class WebSocketServer(object):
|
|||||||
@pytest.mark.generic
|
@pytest.mark.generic
|
||||||
@pytest.mark.parametrize('config', ['gdb_stub', 'coredump'], indirect=True)
|
@pytest.mark.parametrize('config', ['gdb_stub', 'coredump'], indirect=True)
|
||||||
def test_monitor_ide_integration(config: str, dut: Dut) -> None:
|
def test_monitor_ide_integration(config: str, dut: Dut) -> None:
|
||||||
# The port needs to be closed because idf_monitor.py will connect to it
|
# The port needs to be closed because esp_idf_monitor will connect to it
|
||||||
dut.serial.stop_redirect_thread()
|
dut.serial.stop_redirect_thread()
|
||||||
|
|
||||||
monitor_py = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_monitor.py')
|
monitor_cmd = ' '.join([sys.executable, '-m', 'esp_idf_monitor', os.path.join(dut.app.binary_path, 'panic.elf'),
|
||||||
monitor_cmd = ' '.join([sys.executable, monitor_py, os.path.join(dut.app.binary_path, 'panic.elf'),
|
|
||||||
'--port', str(dut.serial.port),
|
'--port', str(dut.serial.port),
|
||||||
'--ws', f'ws://{WebSocketServer.HOST}:{WebSocketServer.PORT}'])
|
'--ws', f'ws://{WebSocketServer.HOST}:{WebSocketServer.PORT}'])
|
||||||
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')
|
monitor_log_path = os.path.join(dut.logdir, 'monitor.txt')
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
# The purpose of this Makefile is to build dummy ELF files required to run idf_monitor tests.
|
|
||||||
|
|
||||||
# Make sure the toolchains are in the PATH:
|
|
||||||
PREFIX_XTENSA ?= xtensa-esp32-elf-
|
|
||||||
PREFIX_RISCV ?= riscv32-esp-elf-
|
|
||||||
|
|
||||||
PROG_XTENSA := dummy_xtensa.elf
|
|
||||||
PROG_RISCV := dummy_riscv.elf
|
|
||||||
|
|
||||||
CPPFLAGS_XTENSA := -DTASK_NAME_OFFSET=52
|
|
||||||
CPPFLAGS_RISCV := -DTASK_NAME_OFFSET=52
|
|
||||||
|
|
||||||
all: $(PROG_XTENSA) $(PROG_RISCV)
|
|
||||||
|
|
||||||
$(PROG_XTENSA): dummy.c
|
|
||||||
$(PREFIX_XTENSA)gcc $(CPPFLAGS_XTENSA) --specs=nosys.specs -o $@ -g $^
|
|
||||||
chmod -x $@
|
|
||||||
|
|
||||||
# ^ chmod is there so that we don't have to add ELF files to executables list
|
|
||||||
|
|
||||||
$(PROG_RISCV): dummy.c
|
|
||||||
$(PREFIX_RISCV)gcc $(CPPFLAGS_RISCV) --specs=nosys.specs -o $@ -g $^
|
|
||||||
chmod -x $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(PROG_XTENSA) $(PROG_RISCV)
|
|
||||||
|
|
||||||
.PHONY: clean all
|
|
@ -1,8 +0,0 @@
|
|||||||
# Project for testing the IDF monitor
|
|
||||||
|
|
||||||
Use `run_test_idf_monitor.py` in order to run the test.
|
|
||||||
|
|
||||||
New tests can be added into `test_list` of `run_test_idf_monitor.py` and placing the corresponding files into the
|
|
||||||
`tests` directory.
|
|
||||||
|
|
||||||
Note: The `idf_monitor` is tested with dummy ELF files. Run `make` to build the ELF files for supported architectures.
|
|
@ -1,13 +0,0 @@
|
|||||||
/* Produces a minimal ELF file for espcoredump tests */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char stuff[TASK_NAME_OFFSET];
|
|
||||||
char pcTaskName[16];
|
|
||||||
} TCB_t;
|
|
||||||
|
|
||||||
TCB_t foo;
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
@ -1,60 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import sys
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
from io import open
|
|
||||||
|
|
||||||
import serial
|
|
||||||
|
|
||||||
try:
|
|
||||||
import idf_monitor
|
|
||||||
except ImportError:
|
|
||||||
sys.path.append('..')
|
|
||||||
import idf_monitor
|
|
||||||
|
|
||||||
|
|
||||||
def monitor_serial_reader_state(serial_reader, file_to_create):
|
|
||||||
"""
|
|
||||||
The purpose of this wrapper is to monitor the serial reader state of idf_monitor.py. file_to_create is created
|
|
||||||
after the serial reader thread has been started. The existence of this file will indicate to
|
|
||||||
run_test_idf_monitor.py that idf_monitor.py is ready to process inputs.
|
|
||||||
"""
|
|
||||||
while not serial_reader.serial.is_open or not serial_reader.alive:
|
|
||||||
time.sleep(1)
|
|
||||||
with open(file_to_create, 'w', encoding='utf-8'):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser('Wrapper for idf_monitor used for testing')
|
|
||||||
parser.add_argument('--port')
|
|
||||||
parser.add_argument('--print_filter')
|
|
||||||
parser.add_argument('--serial_alive_file')
|
|
||||||
parser.add_argument('--toolchain-prefix')
|
|
||||||
parser.add_argument('--decode-panic', default='disable')
|
|
||||||
parser.add_argument('--target', default=None)
|
|
||||||
parser.add_argument('--elf-file')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
serial_instance = serial.serial_for_url(args.port, 115200, do_not_open=True)
|
|
||||||
monitor = idf_monitor.SerialMonitor(serial_instance, args.elf_file, args.print_filter, 'make',
|
|
||||||
toolchain_prefix=args.toolchain_prefix, eol='CR',
|
|
||||||
decode_panic=args.decode_panic, target=args.target)
|
|
||||||
sys.stderr.write('Monitor instance has been created.\n')
|
|
||||||
monitor_thread = threading.Thread(target=monitor_serial_reader_state,
|
|
||||||
args=(monitor.serial_reader, args.serial_alive_file))
|
|
||||||
monitor_thread.start()
|
|
||||||
sys.stderr.write('Monitoring thread has been created.\n')
|
|
||||||
monitor.main_loop()
|
|
||||||
sys.stderr.write('Monitor loop exited.\n')
|
|
||||||
monitor_thread.join(60)
|
|
||||||
sys.stderr.write('Monitoring thread joined.\n')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,212 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
import errno
|
|
||||||
import filecmp
|
|
||||||
import os
|
|
||||||
import pty
|
|
||||||
import re
|
|
||||||
import socket
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
import tempfile
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
from io import open
|
|
||||||
|
|
||||||
XTENSA_ARGS = '--toolchain-prefix xtensa-esp32-elf-'
|
|
||||||
RISCV_ARGS = '--decode-panic backtrace --target esp32c3 --toolchain-prefix riscv32-esp-elf-'
|
|
||||||
|
|
||||||
test_list = (
|
|
||||||
# Add new tests here. All files should be placed in IN_DIR. Columns are
|
|
||||||
# Input file Filter string File with expected output Timeout ELF file Extra args
|
|
||||||
('in1.txt', '', 'in1f1.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('in1.txt', '*:V', 'in1f1.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('in1.txt', 'hello_world', 'in1f2.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('in1.txt', '*:N', 'in1f3.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('in2.txt', 'boot mdf_device_handle:I mesh:E vfs:I', 'in2f1.txt', 420, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('in2.txt', 'vfs', 'in2f2.txt', 420, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('core1.txt', '', 'core1_out.txt', 60, 'dummy_xtensa.elf', XTENSA_ARGS),
|
|
||||||
('riscv_panic1.txt', '', 'riscv_panic1_out.txt', 60, 'dummy_riscv.elf', RISCV_ARGS),
|
|
||||||
)
|
|
||||||
|
|
||||||
IN_DIR = 'tests/' # tests are in this directory
|
|
||||||
OUT_DIR = 'outputs/' # test results are written to this directory (kept only for debugging purposes)
|
|
||||||
ERR_OUT = 'monitor_error_output.'
|
|
||||||
IDF_MONITOR_WAPPER = 'idf_monitor_wrapper.py'
|
|
||||||
SERIAL_ALIVE_FILE = '/tmp/serial_alive' # the existence of this file signalize that idf_monitor is ready to receive
|
|
||||||
|
|
||||||
# connection related to communicating with idf_monitor through sockets
|
|
||||||
HOST = 'localhost'
|
|
||||||
# blocking socket operations are used with timeout:
|
|
||||||
SOCKET_TIMEOUT = 30
|
|
||||||
# the test is restarted after failure (idf_monitor has to be killed):
|
|
||||||
RETRIES_PER_TEST = 2
|
|
||||||
|
|
||||||
COREDUMP_VERSION_REGEX = r'espcoredump\.py v\d+\.[\d\w-]+(\.[\d\w-]+)?'
|
|
||||||
|
|
||||||
|
|
||||||
def remove_coredump_version_string(file_path):
|
|
||||||
with open(file_path, 'r') as file:
|
|
||||||
init_text = file.read()
|
|
||||||
modified_text = re.sub(COREDUMP_VERSION_REGEX, '', init_text, re.MULTILINE)
|
|
||||||
|
|
||||||
if not init_text != modified_text:
|
|
||||||
return None
|
|
||||||
|
|
||||||
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
|
|
||||||
temp_file.write(modified_text.encode())
|
|
||||||
|
|
||||||
return temp_file.name
|
|
||||||
|
|
||||||
|
|
||||||
def monitor_timeout(process):
|
|
||||||
if process.poll() is None:
|
|
||||||
# idf_monitor_wrapper is still running
|
|
||||||
try:
|
|
||||||
process.kill()
|
|
||||||
print('\tidf_monitor_wrapper was killed because it did not finish in time.')
|
|
||||||
except OSError as e:
|
|
||||||
if e.errno == errno.ESRCH:
|
|
||||||
# ignores a possible race condition which can occur when the process exits between poll() and kill()
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
class TestRunner(object):
|
|
||||||
def __enter__(self):
|
|
||||||
self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
self.serversocket.bind((HOST, 0))
|
|
||||||
self.port = self.serversocket.getsockname()[1]
|
|
||||||
self.serversocket.listen(5)
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __exit__(self, type, value, traceback):
|
|
||||||
try:
|
|
||||||
self.serversocket.shutdown(socket.SHUT_RDWR)
|
|
||||||
self.serversocket.close()
|
|
||||||
print('Socket was closed successfully')
|
|
||||||
except (OSError, socket.error):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def accept_connection(self):
|
|
||||||
""" returns a socket for sending the input for idf_monitor which must be closed before calling this again. """
|
|
||||||
(clientsocket, address) = self.serversocket.accept()
|
|
||||||
# exception will be thrown here if the idf_monitor didn't connect in time
|
|
||||||
return clientsocket
|
|
||||||
|
|
||||||
|
|
||||||
def test_iteration(runner, test):
|
|
||||||
try:
|
|
||||||
# Make sure that the file doesn't exist. It will be recreated by idf_monitor_wrapper.py
|
|
||||||
os.remove(SERIAL_ALIVE_FILE)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
print('\nRunning test on {} with filter "{}" and expecting {}'.format(test[0], test[1], test[2]))
|
|
||||||
try:
|
|
||||||
with open(OUT_DIR + test[2], 'w', encoding='utf-8') as o_f, \
|
|
||||||
tempfile.NamedTemporaryFile(dir=OUT_DIR, prefix=ERR_OUT, mode='w', delete=False) as e_f:
|
|
||||||
monitor_cmd = [sys.executable, IDF_MONITOR_WAPPER,
|
|
||||||
'--port', 'socket://{}:{}?logging=debug'.format(HOST, runner.port),
|
|
||||||
'--print_filter', test[1],
|
|
||||||
'--serial_alive_file', SERIAL_ALIVE_FILE,
|
|
||||||
'--elf-file', test[4]]
|
|
||||||
monitor_cmd += test[5].split()
|
|
||||||
(master_fd, slave_fd) = pty.openpty()
|
|
||||||
print('\t', ' '.join(monitor_cmd), sep='')
|
|
||||||
print('\tstdout="{}" stderr="{}" stdin="{}"'.format(o_f.name, e_f.name, os.ttyname(slave_fd)))
|
|
||||||
print('\tMonitor timeout: {} seconds'.format(test[3]))
|
|
||||||
start = time.time()
|
|
||||||
# the server socket is alive so idf_monitor can start now
|
|
||||||
proc = subprocess.Popen(monitor_cmd, stdin=slave_fd, stdout=o_f, stderr=e_f, close_fds=True, bufsize=0)
|
|
||||||
# - idf_monitor's stdin needs to be connected to some pseudo-tty in docker image even when it is not
|
|
||||||
# used at all
|
|
||||||
# - setting bufsize is needed because the default value is different on Python 2 and 3
|
|
||||||
# - the default close_fds is also different on Python 2 and 3
|
|
||||||
monitor_watchdog = threading.Timer(test[3], monitor_timeout, [proc])
|
|
||||||
monitor_watchdog.start()
|
|
||||||
client = runner.accept_connection()
|
|
||||||
# The connection is ready but idf_monitor cannot yet receive data (the serial reader thread is not running).
|
|
||||||
# This seems to happen on Ubuntu 16.04 LTS and is not related to the version of Python or pyserial.
|
|
||||||
# Updating to Ubuntu 18.04 LTS also helps but here, a workaround is used: A wrapper is used for IDF monitor
|
|
||||||
# which checks the serial reader thread and creates a file when it is running.
|
|
||||||
while not os.path.isfile(SERIAL_ALIVE_FILE) and proc.poll() is None:
|
|
||||||
print('\tSerial reader is not ready. Do a sleep...')
|
|
||||||
time.sleep(1)
|
|
||||||
# Only now can we send the inputs:
|
|
||||||
with open(IN_DIR + test[0], 'rb') as f:
|
|
||||||
print('\tSending {} to the socket'.format(f.name))
|
|
||||||
for chunk in iter(lambda: f.read(1024), b''):
|
|
||||||
client.sendall(chunk)
|
|
||||||
idf_exit_sequence = b'\x1d\n'
|
|
||||||
print('\tSending <exit> to the socket')
|
|
||||||
client.sendall(idf_exit_sequence)
|
|
||||||
close_end_time = start + 0.75 * test[3] # time when the process is close to be killed
|
|
||||||
while True:
|
|
||||||
ret = proc.poll()
|
|
||||||
if ret is not None:
|
|
||||||
break
|
|
||||||
if time.time() > close_end_time:
|
|
||||||
# The process isn't finished yet so we are starting to send additional exit sequences because maybe
|
|
||||||
# the other end didn't received it.
|
|
||||||
print('\tSending additional <exit> to the socket')
|
|
||||||
client.sendall(idf_exit_sequence)
|
|
||||||
time.sleep(1)
|
|
||||||
end = time.time()
|
|
||||||
print('\tidf_monitor exited after {:.2f} seconds'.format(end - start))
|
|
||||||
if ret < 0:
|
|
||||||
raise RuntimeError('idf_monitor was terminated by signal {}'.format(-ret))
|
|
||||||
# idf_monitor needs to end before the socket is closed in order to exit without an exception.
|
|
||||||
finally:
|
|
||||||
if monitor_watchdog:
|
|
||||||
monitor_watchdog.cancel()
|
|
||||||
os.close(slave_fd)
|
|
||||||
os.close(master_fd)
|
|
||||||
if client:
|
|
||||||
client.close()
|
|
||||||
print('\tThe client was closed successfully')
|
|
||||||
f1 = IN_DIR + test[2]
|
|
||||||
f2 = OUT_DIR + test[2]
|
|
||||||
temp_f1, temp_f2 = remove_coredump_version_string(f1), remove_coredump_version_string(f2)
|
|
||||||
print('\tdiff {} {}'.format(f1, f2))
|
|
||||||
if temp_f1 and temp_f2:
|
|
||||||
f1, f2 = temp_f1, temp_f2
|
|
||||||
if filecmp.cmp(f1, f2, shallow=False):
|
|
||||||
print('\tTest has passed')
|
|
||||||
else:
|
|
||||||
raise RuntimeError('The contents of the files are different. Please examine the artifacts.')
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
gstart = time.time()
|
|
||||||
if not os.path.exists(OUT_DIR):
|
|
||||||
os.mkdir(OUT_DIR)
|
|
||||||
|
|
||||||
socket.setdefaulttimeout(SOCKET_TIMEOUT)
|
|
||||||
|
|
||||||
for test in test_list:
|
|
||||||
for i in range(RETRIES_PER_TEST):
|
|
||||||
with TestRunner() as runner:
|
|
||||||
# Each test (and each retry) is run with a different port (and server socket). This is done for
|
|
||||||
# the CI run where retry with a different socket is necessary to pass the test. According to the
|
|
||||||
# experiments, retry with the same port (and server socket) is not sufficient.
|
|
||||||
try:
|
|
||||||
test_iteration(runner, test)
|
|
||||||
# no more retries if test_iteration exited without an exception
|
|
||||||
break
|
|
||||||
except Exception as e:
|
|
||||||
if i < RETRIES_PER_TEST - 1:
|
|
||||||
print('Test has failed with exception:', e)
|
|
||||||
print('Another attempt will be made.')
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
gend = time.time()
|
|
||||||
print('Execution took {:.2f} seconds\n'.format(gend - gstart))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
@ -1,344 +0,0 @@
|
|||||||
|
|
||||||
I (195) boot: Loaded app from partition at offset 0x10000
|
|
||||||
I (195) boot: Disabling RNG early entropy source...
|
|
||||||
I (196) cpu_start: Pro cpu up.
|
|
||||||
I (200) cpu_start: Application information:
|
|
||||||
I (205) cpu_start: Project name: hello_world
|
|
||||||
I (210) cpu_start: App version: v4.2-dev-172-gc9cc694dbb-dirty
|
|
||||||
I (217) cpu_start: Compile time: Feb 6 2020 17:57:45
|
|
||||||
I (223) cpu_start: ELF file SHA256: 83cfeb53c9c00c61...
|
|
||||||
I (229) cpu_start: ESP-IDF: v4.2-dev-172-gc9cc694dbb-dirty
|
|
||||||
I (236) cpu_start: Starting app cpu, entry point is 0x40081010
|
|
||||||
I (0) cpu_start: App cpu up.
|
|
||||||
I (246) heap_init: Initializing. RAM available for dynamic allocation:
|
|
||||||
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
|
|
||||||
I (259) heap_init: At 3FFB3F58 len 0002C0A8 (176 KiB): DRAM
|
|
||||||
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
|
|
||||||
I (272) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
|
|
||||||
I (278) heap_init: At 40089AC8 len 00016538 (89 KiB): IRAM
|
|
||||||
I (284) cpu_start: Pro cpu start user code
|
|
||||||
I (303) spi_flash: detected chip: generic
|
|
||||||
I (303) spi_flash: flash io: dio
|
|
||||||
W (303) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
|
|
||||||
I (314) esp_core_dump_uart: Init core dump to UART
|
|
||||||
I (319) cpu_start: Starting scheduler on PRO CPU.
|
|
||||||
I (0) cpu_start: Starting scheduler on APP CPU.
|
|
||||||
Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled.
|
|
||||||
Core 0 register dump:
|
|
||||||
PC : 0x400e37f7 PS : 0x00060430 A0 : 0x800d0c31 A1 : 0x3ffb5db0
|
|
||||||
A2 : 0x00000001 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x00060023
|
|
||||||
A6 : 0x00000001 A7 : 0x00060023 A8 : 0x00000001 A9 : 0x00000000
|
|
||||||
A10 : 0x7fffffff A11 : 0x8001f880 A12 : 0x06ff1ff8 A13 : 0x00000000
|
|
||||||
A14 : 0x3ffb7d80 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d
|
|
||||||
EXCVADDR: 0x00000001 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
|
|
||||||
|
|
||||||
ELF file SHA256: 83cfeb53c9c00c61c4e52674e43654e4b452b7592075920977e491e06a4488d8
|
|
||||||
|
|
||||||
Backtrace: 0x400e37f4:0x3ffb5db0 0x400d0c2e:0x3ffb5dd0 0x40087015:0x3ffb5df0
|
|
||||||
|
|
||||||
I (401) esp_core_dump_uart: Press Enter to print core dump to UART...
|
|
||||||
Core Dump detected!
|
|
||||||
I (434) esp_core_dump_uart: Print core dump to uart...
|
|
||||||
I (434) esp_core_dump_elf: Found tasks: 8
|
|
||||||
================= CORE DUMP START =================
|
|
||||||
9C0AAAABAAAIAAAAXAEAAAAAAAA=
|
|
||||||
f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAASACgA
|
|
||||||
AAAAAA==
|
|
||||||
BAAAAHQCAAAAAAAAAAAAAAATAAAAEwAABgAAAAAAAAA=
|
|
||||||
AQAAAHQVAACAXvs/gF77P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAANAWAADwXPs/8Fz7P4gBAACIAQAABgAAAAAAAAA=
|
|
||||||
AQAAAFgYAABIbfs/SG37P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAALQZAAAgbPs/IGz7PyABAAAgAQAABgAAAAAAAAA=
|
|
||||||
AQAAANQaAADkZfs/5GX7P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAADAcAACwZPs/sGT7PywBAAAsAQAABgAAAAAAAAA=
|
|
||||||
AQAAAFwdAACgd/s/oHf7P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAALgeAADQdfs/0HX7P8gBAADIAQAABgAAAAAAAAA=
|
|
||||||
AQAAAIAgAADwS/s/8Ev7P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAANwhAABASvs/QEr7P6gBAACoAQAABgAAAAAAAAA=
|
|
||||||
AQAAAIQjAAC0+vo/tPr6P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAAOAkAADg+Po/4Pj6P8wBAADMAQAABgAAAAAAAAA=
|
|
||||||
AQAAAKwmAAB8R/s/fEf7P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAAAgoAADQRfs/0EX7P6QBAACkAQAABgAAAAAAAAA=
|
|
||||||
AQAAAKwpAACQ/fo/kP36P1wBAABcAQAABgAAAAAAAAA=
|
|
||||||
AQAAAAgrAACwQfs/sEH7P8ABAADAAQAABgAAAAAAAAA=
|
|
||||||
BAAAAMgsAAAAAAAAAAAAABQBAAAUAQAABgAAAAAAAAA=
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF77PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9zcOQCAEBgAAAAAAAAAAAAAAAAAUAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEMDYCwXfs/
|
|
||||||
AQAAAAEAAAABAAAAIwAGAAEAAAAjAAYAAQAAAAAAAAD///9/gPgBgPgf/wYAAAAA
|
|
||||||
gH37PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASG37PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAIQCAABQAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgbPs/
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAMCCCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5GX7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHAIQCAABQAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwZfs/
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAMCCCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoHf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaYCICQdvs/
|
|
||||||
AAAAAAAAAADwbvs/AAAAAAEAAAAjDgYAxBIIgHB2+z/cAPA/AQAAAAgA+z9gS/s/
|
|
||||||
/AwNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8Ev7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADuRCIAAS/s/
|
|
||||||
AAAAAAEAAACE/fo/AAAAAAEAAAACAAAAxBIIgOBK+z/cAPA/AQAAAAgA+z8jAAYA
|
|
||||||
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAABgAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB+CICg+fo/
|
|
||||||
AAAAAAAAAAAQNfs/vDf7PwIAAADQN/s/xBIIgID5+j/cAPA/AQAAAAgA+z8jAAYA
|
|
||||||
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfEf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEH4IQCACBgAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsaCICQRvs/
|
|
||||||
mP/6PwAAAADg//o/AAAAAAEAAAABAAAAEH4IgHBG+z8BAAAABAAAABQ1+z8KAAAA
|
|
||||||
AACAABwA9D8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
CAAAAEwCAAABAAAA
|
|
||||||
Q09SRQAAAAA=
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkP36PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxBIIQCAOBgAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB+CIBwQvs/
|
|
||||||
AAAAAAAAAAAQNfs/oDr+PwMAAAAjBQYAxBIIgFBC+z/cAPA/AQAAAAgA+z8jAAYA
|
|
||||||
AQAAACMFBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
UF37PxBe+z+Ly+SRODP7Pzgz+z+AXvs/MDP7PxgAAACXBQ54SQvlZoBe+z8AAAAA
|
|
||||||
AQAAAHxO+z9tYWluANFl1b9gbhUZORAAAAAAAHhe+z8BAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAk5ND
|
|
||||||
776t3vc3DkAwBAYAMQwNgLBd+z8BAAAAAQAAAAEAAAAjAAYAAQAAACMABgABAAAA
|
|
||||||
AAAAAP///3+A+AGA+B//BgAAAACAffs/AAAAABQAAAAdAAAAAQAAAAAAAAAAAAAA
|
|
||||||
AAAAAPgf/wYAAAAAPB4IQAgL+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAABhwCIDQXfs/AAAAAAAAAAAYcAiA0F37PwAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAADwXfs/zAsNQAAAAAAjAAYAODP7P4Be+z8AAAAA
|
|
||||||
AAAAABBe+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAcXvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAA=
|
|
||||||
IGz7P+Bs+z8qbFI9JDP7P+xl+z9Ibfs/HDP7PxkAAACM49VXeSoll0ht+z8AAAAA
|
|
||||||
AAAAAERn+z9JRExFMQCFkbfvDgtV1KkAAQAAAEBt+z8AAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAvl21
|
|
||||||
oB4IQBBwCEAwAAUAAAAAAOBs+z8AAAAAAAAAAAAAAAAAAAAAwIIIQAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAADAbPs/wIIIQAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAOBs+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAADsbPs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
sGT7P3Bl+z/HSTugUG37PyQz+z/kZfs/HDP7PxkAAAA1aB3HlRMz9ORl+z8AAAAA
|
|
||||||
AAAAAOBf+z9JRExFMAB5I/hhScYuItcAAAAAANxl+z8AAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAADuXO
|
|
||||||
oB4IQBBwCEAwAAUAAAAAAHBl+z8AAAAAAAAAAAAAAAAAAAAAwIIIQAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAGgS+z8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAB8Zfs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAA
|
|
||||||
0HX7PzB3+z8AAAAAEDP7PxAz+z+gd/s/CDP7PxgAAADUbvs/1G77P6B3+z/Mbvs/
|
|
||||||
AQAAAJxv+z9UbXIgU3ZjAA1db2P9pUIAAAAAAJh3+z8BAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAFysf
|
|
||||||
oB4IQMQSCEAwAAYABpgIgJB2+z8AAAAAAAAAAPBu+z8AAAAAAQAAACMOBgDEEgiA
|
|
||||||
cHb7P9wA8D8BAAAACAD7P2BL+z/8DA1AAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAKQgCEBgS/s/mHIIQCgk+z8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAADzmAiAsHb7Pxw1+z8AAAAA
|
|
||||||
AAAAAOSYCEAAAAAAAAAAABhwCIDgdvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAACMABgABAAAAIwAGAAAAAAAQd/s/5JgIQAAAAAABAAAAAAAAAAAAAAAAAAAA
|
|
||||||
IwAGADgz+z+AXvs/AAAAAAAAAAAwd/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHf7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
QEr7P4BL+z9GPj4tuDL7P7gy+z/wS/s/sDL7PxQAAABM4/eNY9P4VPBL+z8AAAAA
|
|
||||||
BQAAAOxI+z9kcG9ydADgytnG+juR2iwAAAAAAOhL+z8FAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAGA9Z
|
|
||||||
oB4IQMQSCEAwAAYAO5EIgABL+z8AAAAAAQAAAIT9+j8AAAAAAQAAAAIAAADEEgiA
|
|
||||||
4Er7P9wA8D8BAAAACAD7PyMABgABAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAKQgCEAjAAYAmHIIQHj4+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAD8DA1AAAAAAAAAAABcDQ2AIEv7P/BL+z8AAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAABhwCIBAS/s/AQAAAAAAABDwS/s/IwAGAAEAAAAjAAYA
|
|
||||||
AAAAAGBL+z/8DA1AAAAAABoAAACIM/s/8Ev7PwAAAAAAAAAAgEv7PwAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIxL+z8AAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
||||||
4Pj6P0D6+j/c8+jFhEf7P5j9+j+0+vo/mDL7PwMAAACI6vo/iOr6P7T6+j+A6vo/
|
|
||||||
FgAAALDq+j9lc3BfdGltZXIAmI0iFV0AAAAAAKz6+j8WAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAOT5O
|
|
||||||
oB4IQMQSCEAwAAYAEH4IgKD5+j8AAAAAAAAAABA1+z+8N/s/AgAAANA3+z/EEgiA
|
|
||||||
gPn6P9wA8D8BAAAACAD7PyMABgABAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAKQgCEAjAAYAmHIIQDin+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAABLHw2AwPn6P1zq+j8AAAAA
|
|
||||||
AAAAADgfDUAAAAAAAAAAABhwCIAA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
/////wAAAAAAAAAAAAAAAKTq+j8AAAAAAQAAACMOBgAAAAAAIPr6PzgfDUAAAAAA
|
|
||||||
IwAGANw0+z+0+vo/AAAAAAAAAABA+vo/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPr6PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
||||||
0EX7PxBH+z8+sA1HoDL7P7z6+j98R/s/mDL7PwEAAADE//o/xP/6P3xH+z+8//o/
|
|
||||||
GAAAAHhD+z9pcGMxAHSb12QdtYvfmTkAAQAAAHRH+z8YAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAjAAz
|
|
||||||
oB4IQBB+CEAwAgYAKxoIgJBG+z+Y//o/AAAAAOD/+j8AAAAAAQAAAAEAAAAQfgiA
|
|
||||||
cEb7PwEAAAAEAAAAFDX7PwoAAAAAAIAAHAD0PwAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAKQgCEAKAAAAmHIIQAj0+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAD4GQhAAQAAAAAAAAAYcAiA0Eb7PwEAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAPBG+z/4GQhAAQAAACAHBgAENfs/fEf7PwAAAAAAAAAAEEf7PwAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAFwQCICAff4/KAAAACgAAAAAAAAAAAAAABxH+z8AAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
sEH7PxBD+z8En2QMvPr6P6Ay+z+Q/fo/mDL7PwEAAABo/fo/aP36P5D9+j9g/fo/
|
|
||||||
GAAAAHQ/+z9pcGMwAGHBu8ov8v26vbcAAAAAAHBD+z8YAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAALjo+j8g6fo/iOn6PwAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAEgdAEAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAsXYs
|
|
||||||
oB4IQMQSCEAwDgYAEH4IgHBC+z8AAAAAAAAAABA1+z+gOv4/AwAAACMFBgDEEgiA
|
|
||||||
UEL7P9wA8D8BAAAACAD7PyMABgABAAAAIwUGAAAAAAD//wAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAKQgCEAjAAYAmHIIQAjw+j8AAAAAAAAAAAAAAAD//z+zAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAKAeCEAQcAhAMAAFAAAAAAArGgiAkEL7Pzz9+j8AAAAA
|
|
||||||
AAAAAPgZCEAAAAAAAAAAABhwCIDQQvs/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
/////wAAAAAAAAAAAAAAAIT9+j8AAAAAAQAAAAIAAAAAAAAA8EL7P/gZCEAAAAAA
|
|
||||||
IwMGAAQ1+z+Q/fo/AQAAAAAAAAAQQ/s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
2Q8IgGA7/j+AMvs/BQAAAAAAAAAAAAAAHEP7PwAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAAAAAAAAAAAAAAAAAA==
|
|
||||||
FAAAAEgAAABKIAAA
|
|
||||||
RVNQX0NPUkVfRFVNUF9JTkZPAAA=
|
|
||||||
AAEAADgzY2ZlYjUzYzljMDBjNjFjNGU1MjY3NGU0MzY1NGU0YjQ1MmI3NTkyMDc1
|
|
||||||
OTIwOTc3ZTQ5MWUwNmE0NDg4ZDgAAAAA
|
|
||||||
DAAAAJQAAAClAgAA
|
|
||||||
RVhUUkFfSU5GTwAA
|
|
||||||
gF77P+gAAAAdAAAA7gAAAAEAAADCAAAAAAAAAMMAAAAAAAAAxAAAAAAAAADFAAAA
|
|
||||||
AAAAAMYAAAAAAAAAsQAAAL84DkCyAAAAAAAAALMAAAAAAAAAtAAAAAAAAAC1AAAA
|
|
||||||
AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
||||||
AAAAAA==
|
|
||||||
Fj6ctQ==
|
|
||||||
================= CORE DUMP END =================
|
|
||||||
I (1859) esp_core_dump_uart: Core dump has been written to uart.
|
|
||||||
Rebooting...
|
|
||||||
ets Jun 8 2016 00:22:57
|
|
||||||
|
|
||||||
rst:0xc (SW_CPU_RESET),boot:0x1e (SPI_FAST_FLASH_BOOT)
|
|
||||||
configsip: 0, SPIWP:0xee
|
|
||||||
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
|
|
||||||
mode:DIO, clock div:2
|
|
||||||
load:0x3fff0030,len:4
|
|
||||||
load:0x3fff0034,len:7148
|
|
||||||
load:0x40078000,len:14220
|
|
||||||
ho 0 tail 12 room 4
|
|
||||||
load:0x40080400,len:4584
|
|
||||||
0x40080400: _init at ??:?
|
|
@ -1,192 +0,0 @@
|
|||||||
I (195) boot: Loaded app from partition at offset 0x10000
|
|
||||||
I (195) boot: Disabling RNG early entropy source...
|
|
||||||
I (196) cpu_start: Pro cpu up.
|
|
||||||
I (200) cpu_start: Application information:
|
|
||||||
I (205) cpu_start: Project name: hello_world
|
|
||||||
I (210) cpu_start: App version: v4.2-dev-172-gc9cc694dbb-dirty
|
|
||||||
I (217) cpu_start: Compile time: Feb 6 2020 17:57:45
|
|
||||||
I (223) cpu_start: ELF file SHA256: 83cfeb53c9c00c61...
|
|
||||||
I (229) cpu_start: ESP-IDF: v4.2-dev-172-gc9cc694dbb-dirty
|
|
||||||
I (236) cpu_start: Starting app cpu, entry point is 0x40081010
|
|
||||||
I (0) cpu_start: App cpu up.
|
|
||||||
I (246) heap_init: Initializing. RAM available for dynamic allocation:
|
|
||||||
I (253) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
|
|
||||||
I (259) heap_init: At 3FFB3F58 len 0002C0A8 (176 KiB): DRAM
|
|
||||||
I (265) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
|
|
||||||
I (272) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
|
|
||||||
I (278) heap_init: At 40089AC8 len 00016538 (89 KiB): IRAM
|
|
||||||
I (284) cpu_start: Pro cpu start user code
|
|
||||||
I (303) spi_flash: detected chip: generic
|
|
||||||
I (303) spi_flash: flash io: dio
|
|
||||||
W (303) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
|
|
||||||
I (314) esp_core_dump_uart: Init core dump to UART
|
|
||||||
I (319) cpu_start: Starting scheduler on PRO CPU.
|
|
||||||
I (0) cpu_start: Starting scheduler on APP CPU.
|
|
||||||
Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled.
|
|
||||||
Core 0 register dump:
|
|
||||||
PC : 0x400e37f7 PS : 0x00060430 A0 : 0x800d0c31 A1 : 0x3ffb5db0
|
|
||||||
A2 : 0x00000001 A3 : 0x00000001 A4 : 0x00000001 A5 : 0x00060023
|
|
||||||
A6 : 0x00000001 A7 : 0x00060023 A8 : 0x00000001 A9 : 0x00000000
|
|
||||||
A10 : 0x7fffffff A11 : 0x8001f880 A12 : 0x06ff1ff8 A13 : 0x00000000
|
|
||||||
A14 : 0x3ffb7d80 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x0000001d
|
|
||||||
EXCVADDR: 0x00000001 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
|
|
||||||
ELF file SHA256: 83cfeb53c9c00c61c4e52674e43654e4b452b7592075920977e491e06a4488d8
|
|
||||||
Backtrace: 0x400e37f4:0x3ffb5db0 0x400d0c2e:0x3ffb5dd0 0x40087015:0x3ffb5df0
|
|
||||||
I (401) esp_core_dump_uart: Press Enter to print core dump to UART...
|
|
||||||
Core Dump detected!
|
|
||||||
I (434) esp_core_dump_uart: Print core dump to uart...
|
|
||||||
I (434) esp_core_dump_elf: Found tasks: 8
|
|
||||||
===============================================================
|
|
||||||
==================== ESP32 CORE DUMP START ====================
|
|
||||||
|
|
||||||
Crashed task handle: 0x3ffb5e80, name: 'main', GDB name: 'process 1073438336'
|
|
||||||
|
|
||||||
================== CURRENT THREAD REGISTERS ===================
|
|
||||||
exccause 0x1d (StoreProhibitedCause)
|
|
||||||
excvaddr 0x1
|
|
||||||
epc1 0x400e38bf
|
|
||||||
epc2 0x0
|
|
||||||
epc3 0x0
|
|
||||||
epc4 0x0
|
|
||||||
epc5 0x0
|
|
||||||
epc6 0x0
|
|
||||||
eps2 0x0
|
|
||||||
eps3 0x0
|
|
||||||
eps4 0x0
|
|
||||||
eps5 0x0
|
|
||||||
eps6 0x0
|
|
||||||
pc 0x400e37f7 0x400e37f7
|
|
||||||
lbeg 0x0 0
|
|
||||||
lend 0x0 0
|
|
||||||
lcount 0x0 0
|
|
||||||
sar 0x14 20
|
|
||||||
ps 0x60420 394272
|
|
||||||
threadptr <unavailable>
|
|
||||||
br <unavailable>
|
|
||||||
scompare1 <unavailable>
|
|
||||||
acclo <unavailable>
|
|
||||||
acchi <unavailable>
|
|
||||||
m0 <unavailable>
|
|
||||||
m1 <unavailable>
|
|
||||||
m2 <unavailable>
|
|
||||||
m3 <unavailable>
|
|
||||||
expstate <unavailable>
|
|
||||||
f64r_lo <unavailable>
|
|
||||||
f64r_hi <unavailable>
|
|
||||||
f64s <unavailable>
|
|
||||||
fcr <unavailable>
|
|
||||||
fsr <unavailable>
|
|
||||||
a0 0x800d0c31 -2146628559
|
|
||||||
a1 0x3ffb5db0 1073438128
|
|
||||||
a2 0x1 1
|
|
||||||
a3 0x1 1
|
|
||||||
a4 0x1 1
|
|
||||||
a5 0x60023 393251
|
|
||||||
a6 0x1 1
|
|
||||||
a7 0x60023 393251
|
|
||||||
a8 0x1 1
|
|
||||||
a9 0x0 0
|
|
||||||
a10 0x7fffffff 2147483647
|
|
||||||
a11 0x8001f880 -2147354496
|
|
||||||
a12 0x6ff1ff8 117383160
|
|
||||||
a13 0x0 0
|
|
||||||
a14 0x3ffb7d80 1073446272
|
|
||||||
a15 0x0 0
|
|
||||||
|
|
||||||
==================== CURRENT THREAD STACK =====================
|
|
||||||
#0 0x400e37f7 in ?? ()
|
|
||||||
#1 0x400d0c31 in ?? ()
|
|
||||||
#2 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
======================== THREADS INFO =========================
|
|
||||||
Id Target Id Frame
|
|
||||||
* 1 process 1073438336 0x400e37f7 in ?? ()
|
|
||||||
2 process 1073442120 0x40087010 in ?? ()
|
|
||||||
3 process 1073440228 0x40087010 in ?? ()
|
|
||||||
4 process 1073444768 0x400812c4 in ?? ()
|
|
||||||
5 process 1073433584 0x400812c4 in ?? ()
|
|
||||||
6 process 1073412788 0x400812c4 in ?? ()
|
|
||||||
7 process 1073432444 0x40087e10 in ?? ()
|
|
||||||
8 process 1073413520 0x400812c4 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 1 (TCB: 0x3ffb5e80, name: 'main') =====================
|
|
||||||
#0 0x400e37f7 in ?? ()
|
|
||||||
#1 0x400d0c31 in ?? ()
|
|
||||||
#2 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 2 (TCB: 0x3ffb6d48, name: 'IDLE1') =====================
|
|
||||||
#0 0x40087010 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 3 (TCB: 0x3ffb65e4, name: 'IDLE0') =====================
|
|
||||||
#0 0x40087010 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 4 (TCB: 0x3ffb77a0, name: 'Tmr Svc') =====================
|
|
||||||
#0 0x400812c4 in ?? ()
|
|
||||||
#1 0x40089806 in ?? ()
|
|
||||||
#2 0x400898f3 in ?? ()
|
|
||||||
#3 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 5 (TCB: 0x3ffb4bf0, name: 'dport') =====================
|
|
||||||
#0 0x400812c4 in ?? ()
|
|
||||||
#1 0x4008913b in ?? ()
|
|
||||||
#2 0x400d0d5c in ?? ()
|
|
||||||
#3 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 6 (TCB: 0x3ffafab4, name: 'esp_timer') =====================
|
|
||||||
#0 0x400812c4 in ?? ()
|
|
||||||
#1 0x40087e10 in ?? ()
|
|
||||||
#2 0x400d1f4b in ?? ()
|
|
||||||
#3 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 7 (TCB: 0x3ffb477c, name: 'ipc1') =====================
|
|
||||||
#0 0x40087e10 in ?? ()
|
|
||||||
#1 0x40081a2b in ?? ()
|
|
||||||
#2 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
==================== THREAD 8 (TCB: 0x3ffafd90, name: 'ipc0') =====================
|
|
||||||
#0 0x400812c4 in ?? ()
|
|
||||||
#1 0x40087e10 in ?? ()
|
|
||||||
#2 0x40081a2b in ?? ()
|
|
||||||
#3 0x40087018 in ?? ()
|
|
||||||
|
|
||||||
|
|
||||||
======================= ALL MEMORY REGIONS ========================
|
|
||||||
Name Address Size Attrs
|
|
||||||
.text 0x400074 0x133 R XA
|
|
||||||
.eh_frame 0x4001a8 0x4 R A
|
|
||||||
.ctors 0x4011ac 0x8 RW A
|
|
||||||
.dtors 0x4011b4 0x8 RW A
|
|
||||||
.data 0x4011bc 0x4 RW A
|
|
||||||
.coredump.tasks.data 0x3ffb5e80 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb5cf0 0x188 RW
|
|
||||||
.coredump.tasks.data 0x3ffb6d48 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb6c20 0x120 RW
|
|
||||||
.coredump.tasks.data 0x3ffb65e4 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb64b0 0x12c RW
|
|
||||||
.coredump.tasks.data 0x3ffb77a0 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb75d0 0x1c8 RW
|
|
||||||
.coredump.tasks.data 0x3ffb4bf0 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb4a40 0x1a8 RW
|
|
||||||
.coredump.tasks.data 0x3ffafab4 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffaf8e0 0x1cc RW
|
|
||||||
.coredump.tasks.data 0x3ffb477c 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb45d0 0x1a4 RW
|
|
||||||
.coredump.tasks.data 0x3ffafd90 0x15c RW
|
|
||||||
.coredump.tasks.data 0x3ffb41b0 0x1c0 RW
|
|
||||||
|
|
||||||
===================== ESP32 CORE DUMP END =====================
|
|
||||||
===============================================================
|
|
||||||
Done!
|
|
||||||
I (1859) esp_core_dump_uart: Core dump has been written to uart.
|
|
||||||
Rebooting...
|
|
||||||
ets Jun 8 2016 00:22:57
|
|
||||||
rst:0xc (SW_CPU_RESET),boot:0x1e (SPI_FAST_FLASH_BOOT)
|
|
||||||
configsip: 0, SPIWP:0xee
|
|
||||||
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
|
|
||||||
mode:DIO, clock div:2
|
|
||||||
load:0x3fff0030,len:4
|
|
||||||
load:0x3fff0034,len:7148
|
|
||||||
load:0x40078000,len:14220
|
|
||||||
ho 0 tail 12 room 4
|
|
||||||
load:0x40080400,len:4584
|
|
||||||
0x40080400: _init at ??:?
|
|
@ -1,91 +0,0 @@
|
|||||||
ets Jun 8 2016 00:22:57
|
|
||||||
|
|
||||||
rst:0x1 (POWERON_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
|
|
||||||
configsip: 0, SPIWP:0xee
|
|
||||||
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
|
|
||||||
mode:DIO, clock div:2
|
|
||||||
load:0x3fff0018,len:4
|
|
||||||
load:0x3fff001c,len:5728
|
|
||||||
ho 0 tail 12 room 4
|
|
||||||
load:0x40078000,len:0
|
|
||||||
load:0x40078000,len:14944
|
|
||||||
entry 0x4007862c
|
|
||||||
[0;32mI (30) boot: ESP-IDF v3.1-dev-1320-gec1fb521b-dirty 2nd stage bootloader[0m
|
|
||||||
[0;32mI (30) boot: compile time 09:31:02[0m
|
|
||||||
[0;32mI (40) boot: Enabling RNG early entropy source...[0m
|
|
||||||
[0;32mI (41) boot: SPI Speed : 40MHz[0m
|
|
||||||
[0;32mI (41) boot: SPI Mode : DIO[0m
|
|
||||||
[0;32mI (45) boot: SPI Flash Size : 4MB[0m
|
|
||||||
[0;32mI (49) boot: Partition Table:[0m
|
|
||||||
[0;32mI (53) boot: ## Label Usage Type ST Offset Length[0m
|
|
||||||
[0;32mI (60) boot: 0 nvs WiFi data 01 02 00009000 00006000[0m
|
|
||||||
[0;32mI (68) boot: 1 phy_init RF data 01 01 0000f000 00001000[0m
|
|
||||||
[0;32mI (75) boot: 2 factory factory app 00 00 00010000 00100000[0m
|
|
||||||
[0;32mI (83) boot: End of partition table[0m
|
|
||||||
[0;32mI (87) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x058ac ( 22700) map[0m
|
|
||||||
[0;32mI (104) esp_image: segment 1: paddr=0x000158d4 vaddr=0x3ffb0000 size=0x022a0 ( 8864) load[0m
|
|
||||||
[0;32mI (108) esp_image: segment 2: paddr=0x00017b7c vaddr=0x40080000 size=0x00400 ( 1024) load[0m
|
|
||||||
[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
[0;32mI (114) esp_image: segment 3: paddr=0x00017f84 vaddr=0x40080400 size=0x0808c ( 32908) load[0m
|
|
||||||
[0;32mI (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11e88 ( 73352) map[0m
|
|
||||||
[0;33m0x400d0018: _flash_cache_start at ??:?
|
|
||||||
[0m
|
|
||||||
[0;32mI (162) esp_image: segment 5: paddr=0x00031ea8 vaddr=0x4008848c size=0x00670 ( 1648) load[0m
|
|
||||||
[0;33m0x4008848c: esp_rom_spiflash_program_page_internal at /home/dragon/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
|
|
||||||
[0m
|
|
||||||
[0;32mI (163) esp_image: segment 6: paddr=0x00032520 vaddr=0x400c0000 size=0x00000 ( 0) load[0m
|
|
||||||
[0;32mI (174) boot: Loaded app from partition at offset 0x10000[0m
|
|
||||||
[0;32mI (175) boot: Disabling RNG early entropy source...[0m
|
|
||||||
[0;32mI (180) cpu_start: Pro cpu up.[0m
|
|
||||||
[0;32mI (184) cpu_start: Starting app cpu, entry point is 0x40080e54[0m
|
|
||||||
[0;33m0x40080e54: call_start_cpu1 at /home/dragon/esp/esp-idf/components/esp32/cpu_start.c:225
|
|
||||||
[0m
|
|
||||||
[0;32mI (0) cpu_start: App cpu up.[0m
|
|
||||||
[0;32mI (195) heap_init: Initializing. RAM available for dynamic allocation:[0m
|
|
||||||
D (201) heap_init: New heap initialised at 0x3ffae6e0[0m
|
|
||||||
[0;32mI (206) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM[0m
|
|
||||||
D (212) heap_init: New heap initialised at 0x3ffb32f0[0m
|
|
||||||
[0;32mI (218) heap_init: At 3FFB32F0 len 0002CD10 (179 KiB): DRAM[0m
|
|
||||||
[0;32mI (224) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM[0m
|
|
||||||
[0;32mI (230) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM[0m
|
|
||||||
D (237) heap_init: New heap initialised at 0x40088afc[0m
|
|
||||||
[0;32mI (242) heap_init: At 40088AFC len 00017504 (93 KiB): IRAM[0m
|
|
||||||
[0;32mI (248) cpu_start: Pro cpu start user code[0m
|
|
||||||
D (260) clk: RTC_SLOW_CLK calibration value: 3181466[0m
|
|
||||||
D (269) intr_alloc: Connected src 46 to int 2 (cpu 0)[0m
|
|
||||||
D (270) intr_alloc: Connected src 57 to int 3 (cpu 0)[0m
|
|
||||||
D (271) intr_alloc: Connected src 24 to int 9 (cpu 0)[0m
|
|
||||||
[0;32mI (276) cpu_start: Starting scheduler on PRO CPU.[0m
|
|
||||||
D (0) intr_alloc: Connected src 25 to int 2 (cpu 1)[0m
|
|
||||||
[0;32mI (0) cpu_start: Starting scheduler on APP CPU.[0m
|
|
||||||
D (291) heap_init: New heap initialised at 0x3ffe0440[0m
|
|
||||||
D (301) heap_init: New heap initialised at 0x3ffe4350[0m
|
|
||||||
D (311) intr_alloc: Connected src 16 to int 12 (cpu 0)[0m
|
|
||||||
D (311) hello_world: debug1[0m
|
|
||||||
|
|
||||||
[0;33mW (311) hello_world: warning1[0m
|
|
||||||
V (321) hello_world: verbose1[0m
|
|
||||||
[0;31mE (321) hello_world: error1[0m
|
|
||||||
[0;32mI (321) hello_world: info1[0m
|
|
||||||
|
|
||||||
regular printf
|
|
||||||
D (331) another_world: another debug[0m
|
|
||||||
|
|
||||||
[0;32mI (331) example: Periodic timer called, time since boot: 507065 us[0m
|
|
||||||
V (341) another_world: another verbose another very long[0m
|
|
||||||
[0;33mW (341) another_world: another warning very long[0m
|
|
||||||
V (351) another_world: another verbose[0m
|
|
||||||
[0;31mE (351) another_world: another error[0m
|
|
||||||
[0;32mI (361) another_world: Register 0x40080000[0m
|
|
||||||
[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
D (361) hello_world: debug2[0m
|
|
||||||
[0;33mW (371) hello_world: warning2[0m
|
|
||||||
|
|
||||||
V (371) hello_world: verbose2[0m
|
|
||||||
[0;31mE (371) hello_world: error2[0m
|
|
||||||
[0;32mI (381) hello_world: info2[0m
|
|
||||||
noeol 0x40080000[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
[0m
|
|
@ -1,86 +0,0 @@
|
|||||||
ets Jun 8 2016 00:22:57
|
|
||||||
rst:0x1 (POWERON_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
|
|
||||||
configsip: 0, SPIWP:0xee
|
|
||||||
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
|
|
||||||
mode:DIO, clock div:2
|
|
||||||
load:0x3fff0018,len:4
|
|
||||||
load:0x3fff001c,len:5728
|
|
||||||
ho 0 tail 12 room 4
|
|
||||||
load:0x40078000,len:0
|
|
||||||
load:0x40078000,len:14944
|
|
||||||
entry 0x4007862c
|
|
||||||
[0;32mI (30) boot: ESP-IDF v3.1-dev-1320-gec1fb521b-dirty 2nd stage bootloader[0m
|
|
||||||
[0;32mI (30) boot: compile time 09:31:02[0m
|
|
||||||
[0;32mI (40) boot: Enabling RNG early entropy source...[0m
|
|
||||||
[0;32mI (41) boot: SPI Speed : 40MHz[0m
|
|
||||||
[0;32mI (41) boot: SPI Mode : DIO[0m
|
|
||||||
[0;32mI (45) boot: SPI Flash Size : 4MB[0m
|
|
||||||
[0;32mI (49) boot: Partition Table:[0m
|
|
||||||
[0;32mI (53) boot: ## Label Usage Type ST Offset Length[0m
|
|
||||||
[0;32mI (60) boot: 0 nvs WiFi data 01 02 00009000 00006000[0m
|
|
||||||
[0;32mI (68) boot: 1 phy_init RF data 01 01 0000f000 00001000[0m
|
|
||||||
[0;32mI (75) boot: 2 factory factory app 00 00 00010000 00100000[0m
|
|
||||||
[0;32mI (83) boot: End of partition table[0m
|
|
||||||
[0;32mI (87) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x058ac ( 22700) map[0m
|
|
||||||
[0;32mI (104) esp_image: segment 1: paddr=0x000158d4 vaddr=0x3ffb0000 size=0x022a0 ( 8864) load[0m
|
|
||||||
[0;32mI (108) esp_image: segment 2: paddr=0x00017b7c vaddr=0x40080000 size=0x00400 ( 1024) load[0m
|
|
||||||
[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
[0;32mI (114) esp_image: segment 3: paddr=0x00017f84 vaddr=0x40080400 size=0x0808c ( 32908) load[0m
|
|
||||||
[0;32mI (136) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x11e88 ( 73352) map[0m
|
|
||||||
[0;33m0x400d0018: _flash_cache_start at ??:?
|
|
||||||
[0m
|
|
||||||
[0;32mI (162) esp_image: segment 5: paddr=0x00031ea8 vaddr=0x4008848c size=0x00670 ( 1648) load[0m
|
|
||||||
[0;33m0x4008848c: esp_rom_spiflash_program_page_internal at /home/dragon/esp/esp-idf/components/spi_flash/spi_flash_rom_patch.c:412
|
|
||||||
[0m
|
|
||||||
[0;32mI (163) esp_image: segment 6: paddr=0x00032520 vaddr=0x400c0000 size=0x00000 ( 0) load[0m
|
|
||||||
[0;32mI (174) boot: Loaded app from partition at offset 0x10000[0m
|
|
||||||
[0;32mI (175) boot: Disabling RNG early entropy source...[0m
|
|
||||||
[0;32mI (180) cpu_start: Pro cpu up.[0m
|
|
||||||
[0;32mI (184) cpu_start: Starting app cpu, entry point is 0x40080e54[0m
|
|
||||||
[0;33m0x40080e54: call_start_cpu1 at /home/dragon/esp/esp-idf/components/esp32/cpu_start.c:225
|
|
||||||
[0m
|
|
||||||
[0;32mI (0) cpu_start: App cpu up.[0m
|
|
||||||
[0;32mI (195) heap_init: Initializing. RAM available for dynamic allocation:[0m
|
|
||||||
D (201) heap_init: New heap initialised at 0x3ffae6e0[0m
|
|
||||||
[0;32mI (206) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM[0m
|
|
||||||
D (212) heap_init: New heap initialised at 0x3ffb32f0[0m
|
|
||||||
[0;32mI (218) heap_init: At 3FFB32F0 len 0002CD10 (179 KiB): DRAM[0m
|
|
||||||
[0;32mI (224) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM[0m
|
|
||||||
[0;32mI (230) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM[0m
|
|
||||||
D (237) heap_init: New heap initialised at 0x40088afc[0m
|
|
||||||
[0;32mI (242) heap_init: At 40088AFC len 00017504 (93 KiB): IRAM[0m
|
|
||||||
[0;32mI (248) cpu_start: Pro cpu start user code[0m
|
|
||||||
D (260) clk: RTC_SLOW_CLK calibration value: 3181466[0m
|
|
||||||
D (269) intr_alloc: Connected src 46 to int 2 (cpu 0)[0m
|
|
||||||
D (270) intr_alloc: Connected src 57 to int 3 (cpu 0)[0m
|
|
||||||
D (271) intr_alloc: Connected src 24 to int 9 (cpu 0)[0m
|
|
||||||
[0;32mI (276) cpu_start: Starting scheduler on PRO CPU.[0m
|
|
||||||
D (0) intr_alloc: Connected src 25 to int 2 (cpu 1)[0m
|
|
||||||
[0;32mI (0) cpu_start: Starting scheduler on APP CPU.[0m
|
|
||||||
D (291) heap_init: New heap initialised at 0x3ffe0440[0m
|
|
||||||
D (301) heap_init: New heap initialised at 0x3ffe4350[0m
|
|
||||||
D (311) intr_alloc: Connected src 16 to int 12 (cpu 0)[0m
|
|
||||||
D (311) hello_world: debug1[0m
|
|
||||||
[0;33mW (311) hello_world: warning1[0m
|
|
||||||
V (321) hello_world: verbose1[0m
|
|
||||||
[0;31mE (321) hello_world: error1[0m
|
|
||||||
[0;32mI (321) hello_world: info1[0m
|
|
||||||
regular printf
|
|
||||||
D (331) another_world: another debug[0m
|
|
||||||
[0;32mI (331) example: Periodic timer called, time since boot: 507065 us[0m
|
|
||||||
V (341) another_world: another verbose another very long[0m
|
|
||||||
[0;33mW (341) another_world: another warning very long[0m
|
|
||||||
V (351) another_world: another verbose[0m
|
|
||||||
[0;31mE (351) another_world: another error[0m
|
|
||||||
[0;32mI (361) another_world: Register 0x40080000[0m
|
|
||||||
[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
D (361) hello_world: debug2[0m
|
|
||||||
[0;33mW (371) hello_world: warning2[0m
|
|
||||||
V (371) hello_world: verbose2[0m
|
|
||||||
[0;31mE (371) hello_world: error2[0m
|
|
||||||
[0;32mI (381) hello_world: info2[0m
|
|
||||||
noeol 0x40080000[0;33m0x40080000: _iram_start at /home/dragon/esp/esp-idf/components/freertos/xtensa_vectors.S:1685
|
|
||||||
[0m
|
|
||||||
[0m
|
|
@ -1,10 +0,0 @@
|
|||||||
D (311) hello_world: debug1[0m
|
|
||||||
[0;33mW (311) hello_world: warning1[0m
|
|
||||||
V (321) hello_world: verbose1[0m
|
|
||||||
[0;31mE (321) hello_world: error1[0m
|
|
||||||
[0;32mI (321) hello_world: info1[0m
|
|
||||||
D (361) hello_world: debug2[0m
|
|
||||||
[0;33mW (371) hello_world: warning2[0m
|
|
||||||
V (371) hello_world: verbose2[0m
|
|
||||||
[0;31mE (371) hello_world: error2[0m
|
|
||||||
[0;32mI (381) hello_world: info2[0m
|
|
File diff suppressed because it is too large
Load Diff
@ -1,54 +0,0 @@
|
|||||||
[0;31mE (39) boot: Factory app partition is not bootable[0m
|
|
||||||
[0;32mI (730) mdf_device_handle: [mdf_device_init_handle, 897]:******************* SYSTEM INFO *******************[0m
|
|
||||||
[0;32mI (740) mdf_device_handle: [mdf_device_init_handle, 898]:idf version : v3.1-dev-1188-g0c43ac8[0m
|
|
||||||
[0;32mI (749) mdf_device_handle: [mdf_device_init_handle, 901]:device version : light_004384-0.5.25.1-1[0m
|
|
||||||
[0;32mI (759) mdf_device_handle: [mdf_device_init_handle, 902]:compile time : May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (769) mdf_device_handle: [mdf_device_init_handle, 903]:free heap : 120948 B[0m
|
|
||||||
[0;32mI (777) mdf_device_handle: [mdf_device_init_handle, 904]:CPU cores : 2[0m
|
|
||||||
[0;32mI (785) mdf_device_handle: [mdf_device_init_handle, 907]:function : WiFi/BT/BLE[0m
|
|
||||||
[0;32mI (793) mdf_device_handle: [mdf_device_init_handle, 908]:silicon revision : 0[0m
|
|
||||||
[0;32mI (801) mdf_device_handle: [mdf_device_init_handle, 910]:flash : 4 MB external[0m
|
|
||||||
[0;32mI (810) mdf_device_handle: [mdf_device_init_handle, 911]:***************************************************[0m
|
|
||||||
E (45488) mesh: [esp_mesh_push_to_nwk_queue,5360] null args
|
|
||||||
[0;32mI (50495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 00:00:00:00:00:00, mac:30:ae:a4:00:43:84, layer: -1, free heap: 87712, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (55495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 88452, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (60495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71792, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (65495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71792, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (70495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (75495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (80495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (85495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (90495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71680, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (95498) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71468, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (100495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 71264, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (105495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 69120, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (110495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (115495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (120495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (125495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (130495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (135495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 64408, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (140495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (145495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (150495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (155495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (160495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (165495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 62196, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (170495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (175495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (180495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (185495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (190495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (195495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60008, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (200495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (205495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (210495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (215495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (220495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (225495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (230495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (235495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (240495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (245495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (250495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
||||||
[0;32mI (255495) mdf_device_handle: [mdf_show_sysinfo_timercb, 73]:parent: 20:a6:80:98:dc:b4, mac:30:ae:a4:00:43:84, layer: 1, free heap: 60212, compile time: May 26 2018 00:22:11[0m
|
|
@ -1,995 +0,0 @@
|
|||||||
D (318) vfs: esp_vfs_register_fd_range is successful for range <54; 64) and VFS ID 1[0m
|
|
||||||
D (59342) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (59343) vfs: FDs in readfds =[0m
|
|
||||||
D (59343) vfs: 54[0m
|
|
||||||
D (59355) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (59356) vfs: FDs in readfds =[0m
|
|
||||||
D (59356) vfs: 54[0m
|
|
||||||
D (59857) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (59858) vfs: FDs in readfds =[0m
|
|
||||||
D (59858) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (59869) vfs: FDs in readfds =[0m
|
|
||||||
D (59870) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (59871) vfs: FDs in readfds =[0m
|
|
||||||
D (59871) vfs: 54[0m
|
|
||||||
D (59882) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (59883) vfs: FDs in readfds =[0m
|
|
||||||
D (59884) vfs: 54[0m
|
|
||||||
D (60384) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (60385) vfs: FDs in readfds =[0m
|
|
||||||
D (60385) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (60396) vfs: FDs in readfds =[0m
|
|
||||||
D (60397) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (60397) vfs: FDs in readfds =[0m
|
|
||||||
D (60408) vfs: 54[0m
|
|
||||||
D (60409) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (60409) vfs: FDs in readfds =[0m
|
|
||||||
D (60410) vfs: 54[0m
|
|
||||||
D (60921) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (60922) vfs: FDs in readfds =[0m
|
|
||||||
D (60922) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (60933) vfs: FDs in readfds =[0m
|
|
||||||
D (60934) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (60935) vfs: FDs in readfds =[0m
|
|
||||||
D (60935) vfs: 54[0m
|
|
||||||
D (60946) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (60947) vfs: FDs in readfds =[0m
|
|
||||||
D (60947) vfs: 54[0m
|
|
||||||
D (61458) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (61459) vfs: FDs in readfds =[0m
|
|
||||||
D (61460) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (61471) vfs: FDs in readfds =[0m
|
|
||||||
D (61471) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (61472) vfs: FDs in readfds =[0m
|
|
||||||
D (61483) vfs: 54[0m
|
|
||||||
D (61483) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (61484) vfs: FDs in readfds =[0m
|
|
||||||
D (61484) vfs: 54[0m
|
|
||||||
D (61995) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (61996) vfs: FDs in readfds =[0m
|
|
||||||
D (61996) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (62007) vfs: FDs in readfds =[0m
|
|
||||||
D (62008) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (62008) vfs: FDs in readfds =[0m
|
|
||||||
D (62019) vfs: 54[0m
|
|
||||||
D (62021) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (62021) vfs: FDs in readfds =[0m
|
|
||||||
D (62022) vfs: 54[0m
|
|
||||||
D (62523) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (62524) vfs: FDs in readfds =[0m
|
|
||||||
D (62524) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (62535) vfs: FDs in readfds =[0m
|
|
||||||
D (62536) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (62536) vfs: FDs in readfds =[0m
|
|
||||||
D (62547) vfs: 54[0m
|
|
||||||
D (62548) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (62548) vfs: FDs in readfds =[0m
|
|
||||||
D (62549) vfs: 54[0m
|
|
||||||
D (63060) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (63061) vfs: FDs in readfds =[0m
|
|
||||||
D (63061) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (63072) vfs: FDs in readfds =[0m
|
|
||||||
D (63073) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (63073) vfs: FDs in readfds =[0m
|
|
||||||
D (63084) vfs: 54[0m
|
|
||||||
D (63085) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (63086) vfs: FDs in readfds =[0m
|
|
||||||
D (63086) vfs: 54[0m
|
|
||||||
D (63597) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (63599) vfs: FDs in readfds =[0m
|
|
||||||
D (63599) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (63610) vfs: FDs in readfds =[0m
|
|
||||||
D (63611) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (63611) vfs: FDs in readfds =[0m
|
|
||||||
D (63612) vfs: 54[0m
|
|
||||||
D (63623) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (63623) vfs: FDs in readfds =[0m
|
|
||||||
D (63624) vfs: 54[0m
|
|
||||||
D (64134) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (64135) vfs: FDs in readfds =[0m
|
|
||||||
D (64135) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (64146) vfs: FDs in readfds =[0m
|
|
||||||
D (64147) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (64147) vfs: FDs in readfds =[0m
|
|
||||||
D (64158) vfs: 54[0m
|
|
||||||
D (64159) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (64159) vfs: FDs in readfds =[0m
|
|
||||||
D (64160) vfs: 54[0m
|
|
||||||
D (64671) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (64672) vfs: FDs in readfds =[0m
|
|
||||||
D (64674) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (64674) vfs: FDs in readfds =[0m
|
|
||||||
D (64685) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (64686) vfs: FDs in readfds =[0m
|
|
||||||
D (64686) vfs: 54[0m
|
|
||||||
D (64697) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (64699) vfs: FDs in readfds =[0m
|
|
||||||
D (64699) vfs: 54[0m
|
|
||||||
D (65200) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (65201) vfs: FDs in readfds =[0m
|
|
||||||
D (65201) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (65212) vfs: FDs in readfds =[0m
|
|
||||||
D (65213) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (65213) vfs: FDs in readfds =[0m
|
|
||||||
D (65224) vfs: 54[0m
|
|
||||||
D (65225) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (65227) vfs: FDs in readfds =[0m
|
|
||||||
D (65227) vfs: 54[0m
|
|
||||||
D (65728) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (65729) vfs: FDs in readfds =[0m
|
|
||||||
D (65729) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (65740) vfs: FDs in readfds =[0m
|
|
||||||
D (65741) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (65741) vfs: FDs in readfds =[0m
|
|
||||||
D (65752) vfs: 54[0m
|
|
||||||
D (65753) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (65753) vfs: FDs in readfds =[0m
|
|
||||||
D (65754) vfs: 54[0m
|
|
||||||
D (66265) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (66266) vfs: FDs in readfds =[0m
|
|
||||||
D (66266) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (66277) vfs: FDs in readfds =[0m
|
|
||||||
D (66278) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (66278) vfs: FDs in readfds =[0m
|
|
||||||
D (66289) vfs: 54[0m
|
|
||||||
D (66290) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (66291) vfs: FDs in readfds =[0m
|
|
||||||
D (66291) vfs: 54[0m
|
|
||||||
D (66802) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (66803) vfs: FDs in readfds =[0m
|
|
||||||
D (66803) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (66814) vfs: FDs in readfds =[0m
|
|
||||||
D (66815) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (66816) vfs: FDs in readfds =[0m
|
|
||||||
D (66816) vfs: 54[0m
|
|
||||||
D (66827) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (66828) vfs: FDs in readfds =[0m
|
|
||||||
D (66828) vfs: 54[0m
|
|
||||||
D (67339) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (67340) vfs: FDs in readfds =[0m
|
|
||||||
D (67340) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (67351) vfs: FDs in readfds =[0m
|
|
||||||
D (67352) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (67353) vfs: FDs in readfds =[0m
|
|
||||||
D (67353) vfs: 54[0m
|
|
||||||
D (67364) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (67365) vfs: FDs in readfds =[0m
|
|
||||||
D (67365) vfs: 54[0m
|
|
||||||
D (67877) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (67878) vfs: FDs in readfds =[0m
|
|
||||||
D (67879) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (67889) vfs: FDs in readfds =[0m
|
|
||||||
D (67890) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (67891) vfs: FDs in readfds =[0m
|
|
||||||
D (67901) vfs: 54[0m
|
|
||||||
D (67902) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (67903) vfs: FDs in readfds =[0m
|
|
||||||
D (67903) vfs: 54[0m
|
|
||||||
D (68414) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (68415) vfs: FDs in readfds =[0m
|
|
||||||
D (68415) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (68417) vfs: FDs in readfds =[0m
|
|
||||||
D (68428) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (68428) vfs: FDs in readfds =[0m
|
|
||||||
D (68429) vfs: 54[0m
|
|
||||||
D (68440) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (68440) vfs: FDs in readfds =[0m
|
|
||||||
D (68441) vfs: 54[0m
|
|
||||||
D (68941) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (68942) vfs: FDs in readfds =[0m
|
|
||||||
D (68942) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (68953) vfs: FDs in readfds =[0m
|
|
||||||
D (68954) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (68954) vfs: FDs in readfds =[0m
|
|
||||||
D (68965) vfs: 54[0m
|
|
||||||
D (68966) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (68966) vfs: FDs in readfds =[0m
|
|
||||||
D (68967) vfs: 54[0m
|
|
||||||
D (69478) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (69479) vfs: FDs in readfds =[0m
|
|
||||||
D (69480) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (69490) vfs: FDs in readfds =[0m
|
|
||||||
D (69491) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (69492) vfs: FDs in readfds =[0m
|
|
||||||
D (69492) vfs: 54[0m
|
|
||||||
D (69503) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (69504) vfs: FDs in readfds =[0m
|
|
||||||
D (69504) vfs: 54[0m
|
|
||||||
D (70015) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (70016) vfs: FDs in readfds =[0m
|
|
||||||
D (70016) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (70027) vfs: FDs in readfds =[0m
|
|
||||||
D (70028) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (70028) vfs: FDs in readfds =[0m
|
|
||||||
D (70040) vfs: 54[0m
|
|
||||||
D (70041) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (70042) vfs: FDs in readfds =[0m
|
|
||||||
D (70042) vfs: 54[0m
|
|
||||||
D (70553) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (70554) vfs: FDs in readfds =[0m
|
|
||||||
D (70555) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (70566) vfs: FDs in readfds =[0m
|
|
||||||
D (70566) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (70567) vfs: FDs in readfds =[0m
|
|
||||||
D (70578) vfs: 54[0m
|
|
||||||
D (70578) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (70579) vfs: FDs in readfds =[0m
|
|
||||||
D (70590) vfs: 54[0m
|
|
||||||
D (71091) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (71092) vfs: FDs in readfds =[0m
|
|
||||||
D (71092) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (71103) vfs: FDs in readfds =[0m
|
|
||||||
D (71104) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (71104) vfs: FDs in readfds =[0m
|
|
||||||
D (71115) vfs: 54[0m
|
|
||||||
D (71116) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (71116) vfs: FDs in readfds =[0m
|
|
||||||
D (71117) vfs: 54[0m
|
|
||||||
D (71628) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (71629) vfs: FDs in readfds =[0m
|
|
||||||
D (71630) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (71640) vfs: FDs in readfds =[0m
|
|
||||||
D (71641) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (71642) vfs: FDs in readfds =[0m
|
|
||||||
D (71642) vfs: 54[0m
|
|
||||||
D (71653) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (71654) vfs: FDs in readfds =[0m
|
|
||||||
D (71654) vfs: 54[0m
|
|
||||||
D (72165) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (72166) vfs: FDs in readfds =[0m
|
|
||||||
D (72166) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (72177) vfs: FDs in readfds =[0m
|
|
||||||
D (72178) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (72178) vfs: FDs in readfds =[0m
|
|
||||||
D (72190) vfs: 54[0m
|
|
||||||
D (72191) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (72191) vfs: FDs in readfds =[0m
|
|
||||||
D (72192) vfs: 54[0m
|
|
||||||
D (72692) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (72693) vfs: FDs in readfds =[0m
|
|
||||||
D (72693) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (72704) vfs: FDs in readfds =[0m
|
|
||||||
D (72705) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (72705) vfs: FDs in readfds =[0m
|
|
||||||
D (72716) vfs: 54[0m
|
|
||||||
D (72717) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (72718) vfs: FDs in readfds =[0m
|
|
||||||
D (72718) vfs: 54[0m
|
|
||||||
D (73229) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (73231) vfs: FDs in readfds =[0m
|
|
||||||
D (73231) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (73242) vfs: FDs in readfds =[0m
|
|
||||||
D (73243) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (73243) vfs: FDs in readfds =[0m
|
|
||||||
D (73254) vfs: 54[0m
|
|
||||||
D (73255) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (73255) vfs: FDs in readfds =[0m
|
|
||||||
D (73266) vfs: 54[0m
|
|
||||||
D (73767) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (73768) vfs: FDs in readfds =[0m
|
|
||||||
D (73768) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (73779) vfs: FDs in readfds =[0m
|
|
||||||
D (73780) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (73780) vfs: FDs in readfds =[0m
|
|
||||||
D (73791) vfs: 54[0m
|
|
||||||
D (73792) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (73793) vfs: FDs in readfds =[0m
|
|
||||||
D (73793) vfs: 54[0m
|
|
||||||
D (74304) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (74305) vfs: FDs in readfds =[0m
|
|
||||||
D (74305) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (74316) vfs: FDs in readfds =[0m
|
|
||||||
D (74317) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (74317) vfs: FDs in readfds =[0m
|
|
||||||
D (74328) vfs: 54[0m
|
|
||||||
D (74329) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (74330) vfs: FDs in readfds =[0m
|
|
||||||
D (74330) vfs: 54[0m
|
|
||||||
D (74841) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (74842) vfs: FDs in readfds =[0m
|
|
||||||
D (74842) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (74853) vfs: FDs in readfds =[0m
|
|
||||||
D (74854) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (74854) vfs: FDs in readfds =[0m
|
|
||||||
D (74865) vfs: 54[0m
|
|
||||||
D (74866) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (74867) vfs: FDs in readfds =[0m
|
|
||||||
D (74868) vfs: 54[0m
|
|
||||||
D (75368) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (75369) vfs: FDs in readfds =[0m
|
|
||||||
D (75369) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (75380) vfs: FDs in readfds =[0m
|
|
||||||
D (75381) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (75381) vfs: FDs in readfds =[0m
|
|
||||||
D (75392) vfs: 54[0m
|
|
||||||
D (75393) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (75394) vfs: FDs in readfds =[0m
|
|
||||||
D (75394) vfs: 54[0m
|
|
||||||
D (75905) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (75906) vfs: FDs in readfds =[0m
|
|
||||||
D (75906) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (75917) vfs: FDs in readfds =[0m
|
|
||||||
D (75918) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (75918) vfs: FDs in readfds =[0m
|
|
||||||
D (75929) vfs: 54[0m
|
|
||||||
D (75930) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (75931) vfs: FDs in readfds =[0m
|
|
||||||
D (75931) vfs: 54[0m
|
|
||||||
D (76442) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (76443) vfs: FDs in readfds =[0m
|
|
||||||
D (76444) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (76454) vfs: FDs in readfds =[0m
|
|
||||||
D (76455) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (76456) vfs: FDs in readfds =[0m
|
|
||||||
D (76456) vfs: 54[0m
|
|
||||||
D (76467) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (76468) vfs: FDs in readfds =[0m
|
|
||||||
D (76468) vfs: 54[0m
|
|
||||||
D (76979) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (76980) vfs: FDs in readfds =[0m
|
|
||||||
D (76980) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (76991) vfs: FDs in readfds =[0m
|
|
||||||
D (76992) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (76992) vfs: FDs in readfds =[0m
|
|
||||||
D (77003) vfs: 54[0m
|
|
||||||
D (77004) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (77004) vfs: FDs in readfds =[0m
|
|
||||||
D (77005) vfs: 54[0m
|
|
||||||
D (77516) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (77517) vfs: FDs in readfds =[0m
|
|
||||||
D (77517) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (77528) vfs: FDs in readfds =[0m
|
|
||||||
D (77529) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (77529) vfs: FDs in readfds =[0m
|
|
||||||
D (77540) vfs: 54[0m
|
|
||||||
D (77541) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (77542) vfs: FDs in readfds =[0m
|
|
||||||
D (77542) vfs: 54[0m
|
|
||||||
D (78053) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (78054) vfs: FDs in readfds =[0m
|
|
||||||
D (78054) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (78065) vfs: FDs in readfds =[0m
|
|
||||||
D (78066) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (78066) vfs: FDs in readfds =[0m
|
|
||||||
D (78077) vfs: 54[0m
|
|
||||||
D (78078) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (78078) vfs: FDs in readfds =[0m
|
|
||||||
D (78079) vfs: 54[0m
|
|
||||||
D (78590) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (78591) vfs: FDs in readfds =[0m
|
|
||||||
D (78591) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (78602) vfs: FDs in readfds =[0m
|
|
||||||
D (78603) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (78604) vfs: FDs in readfds =[0m
|
|
||||||
D (78604) vfs: 54[0m
|
|
||||||
D (78615) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (78616) vfs: FDs in readfds =[0m
|
|
||||||
D (78616) vfs: 54[0m
|
|
||||||
D (79127) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (79128) vfs: FDs in readfds =[0m
|
|
||||||
D (79128) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (79139) vfs: FDs in readfds =[0m
|
|
||||||
D (79140) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (79140) vfs: FDs in readfds =[0m
|
|
||||||
D (79151) vfs: 54[0m
|
|
||||||
D (79152) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (79152) vfs: FDs in readfds =[0m
|
|
||||||
D (79153) vfs: 54[0m
|
|
||||||
D (79664) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (79665) vfs: FDs in readfds =[0m
|
|
||||||
D (79665) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (79676) vfs: FDs in readfds =[0m
|
|
||||||
D (79677) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (79677) vfs: FDs in readfds =[0m
|
|
||||||
D (79688) vfs: 54[0m
|
|
||||||
D (79689) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (79689) vfs: FDs in readfds =[0m
|
|
||||||
D (79690) vfs: 54[0m
|
|
||||||
D (80201) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (80202) vfs: FDs in readfds =[0m
|
|
||||||
D (80202) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (80213) vfs: FDs in readfds =[0m
|
|
||||||
D (80214) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (80214) vfs: FDs in readfds =[0m
|
|
||||||
D (80225) vfs: 54[0m
|
|
||||||
D (80226) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (80226) vfs: FDs in readfds =[0m
|
|
||||||
D (80227) vfs: 54[0m
|
|
||||||
D (80738) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (80739) vfs: FDs in readfds =[0m
|
|
||||||
D (80739) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (80750) vfs: FDs in readfds =[0m
|
|
||||||
D (80751) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (80751) vfs: FDs in readfds =[0m
|
|
||||||
D (80752) vfs: 54[0m
|
|
||||||
D (80763) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (80763) vfs: FDs in readfds =[0m
|
|
||||||
D (80764) vfs: 54[0m
|
|
||||||
D (81275) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (81276) vfs: FDs in readfds =[0m
|
|
||||||
D (81276) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (81287) vfs: FDs in readfds =[0m
|
|
||||||
D (81288) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (81288) vfs: FDs in readfds =[0m
|
|
||||||
D (81299) vfs: 54[0m
|
|
||||||
D (81300) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (81301) vfs: FDs in readfds =[0m
|
|
||||||
D (81301) vfs: 54[0m
|
|
||||||
D (81812) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (81813) vfs: FDs in readfds =[0m
|
|
||||||
D (81813) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (81824) vfs: FDs in readfds =[0m
|
|
||||||
D (81825) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (81825) vfs: FDs in readfds =[0m
|
|
||||||
D (81836) vfs: 54[0m
|
|
||||||
D (81837) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (81837) vfs: FDs in readfds =[0m
|
|
||||||
D (81838) vfs: 54[0m
|
|
||||||
D (82349) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (82350) vfs: FDs in readfds =[0m
|
|
||||||
D (82350) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (82361) vfs: FDs in readfds =[0m
|
|
||||||
D (82362) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (82362) vfs: FDs in readfds =[0m
|
|
||||||
D (82373) vfs: 54[0m
|
|
||||||
D (82374) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (82374) vfs: FDs in readfds =[0m
|
|
||||||
D (82375) vfs: 54[0m
|
|
||||||
D (82886) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (82887) vfs: FDs in readfds =[0m
|
|
||||||
D (82887) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (82898) vfs: FDs in readfds =[0m
|
|
||||||
D (82899) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (82899) vfs: FDs in readfds =[0m
|
|
||||||
D (82910) vfs: 54[0m
|
|
||||||
D (82911) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (82912) vfs: FDs in readfds =[0m
|
|
||||||
D (82912) vfs: 54[0m
|
|
||||||
D (83423) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (83424) vfs: FDs in readfds =[0m
|
|
||||||
D (83424) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (83435) vfs: FDs in readfds =[0m
|
|
||||||
D (83436) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (83436) vfs: FDs in readfds =[0m
|
|
||||||
D (83447) vfs: 54[0m
|
|
||||||
D (83448) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (83449) vfs: FDs in readfds =[0m
|
|
||||||
D (83449) vfs: 54[0m
|
|
||||||
D (83960) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (83961) vfs: FDs in readfds =[0m
|
|
||||||
D (83961) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (83972) vfs: FDs in readfds =[0m
|
|
||||||
D (83973) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (83973) vfs: FDs in readfds =[0m
|
|
||||||
D (83984) vfs: 54[0m
|
|
||||||
D (83985) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (83986) vfs: FDs in readfds =[0m
|
|
||||||
D (83986) vfs: 54[0m
|
|
||||||
D (84497) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (84498) vfs: FDs in readfds =[0m
|
|
||||||
D (84498) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (84509) vfs: FDs in readfds =[0m
|
|
||||||
D (84510) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (84511) vfs: FDs in readfds =[0m
|
|
||||||
D (84521) vfs: 54[0m
|
|
||||||
D (84522) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (84523) vfs: FDs in readfds =[0m
|
|
||||||
D (84523) vfs: 54[0m
|
|
||||||
D (85035) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (85047) vfs: FDs in readfds =[0m
|
|
||||||
D (85048) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (85059) vfs: FDs in readfds =[0m
|
|
||||||
D (85059) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (85060) vfs: FDs in readfds =[0m
|
|
||||||
D (85071) vfs: 54[0m
|
|
||||||
D (85071) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (85072) vfs: FDs in readfds =[0m
|
|
||||||
D (85083) vfs: 54[0m
|
|
||||||
D (85583) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (85584) vfs: FDs in readfds =[0m
|
|
||||||
D (85584) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (85595) vfs: FDs in readfds =[0m
|
|
||||||
D (85596) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (85596) vfs: FDs in readfds =[0m
|
|
||||||
D (85607) vfs: 54[0m
|
|
||||||
D (85608) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (85608) vfs: FDs in readfds =[0m
|
|
||||||
D (85609) vfs: 54[0m
|
|
||||||
D (86120) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (86121) vfs: FDs in readfds =[0m
|
|
||||||
D (86121) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (86132) vfs: FDs in readfds =[0m
|
|
||||||
D (86133) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (86133) vfs: FDs in readfds =[0m
|
|
||||||
D (86144) vfs: 54[0m
|
|
||||||
D (86145) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (86145) vfs: FDs in readfds =[0m
|
|
||||||
D (86146) vfs: 54[0m
|
|
||||||
D (86657) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (86658) vfs: FDs in readfds =[0m
|
|
||||||
D (86658) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (86669) vfs: FDs in readfds =[0m
|
|
||||||
D (86670) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (86670) vfs: FDs in readfds =[0m
|
|
||||||
D (86681) vfs: 54[0m
|
|
||||||
D (86682) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (86683) vfs: FDs in readfds =[0m
|
|
||||||
D (86683) vfs: 54[0m
|
|
||||||
D (87194) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (87195) vfs: FDs in readfds =[0m
|
|
||||||
D (87196) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (87206) vfs: FDs in readfds =[0m
|
|
||||||
D (87207) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (87208) vfs: FDs in readfds =[0m
|
|
||||||
D (87208) vfs: 54[0m
|
|
||||||
D (87219) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (87220) vfs: FDs in readfds =[0m
|
|
||||||
D (87220) vfs: 54[0m
|
|
||||||
D (87731) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (87732) vfs: FDs in readfds =[0m
|
|
||||||
D (87732) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (87743) vfs: FDs in readfds =[0m
|
|
||||||
D (87744) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (87744) vfs: FDs in readfds =[0m
|
|
||||||
D (87755) vfs: 54[0m
|
|
||||||
D (87756) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (87757) vfs: FDs in readfds =[0m
|
|
||||||
D (87757) vfs: 54[0m
|
|
||||||
D (88268) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (88269) vfs: FDs in readfds =[0m
|
|
||||||
D (88269) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (88281) vfs: FDs in readfds =[0m
|
|
||||||
D (88281) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (88282) vfs: FDs in readfds =[0m
|
|
||||||
D (88283) vfs: 54[0m
|
|
||||||
D (88294) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (88294) vfs: FDs in readfds =[0m
|
|
||||||
D (88295) vfs: 54[0m
|
|
||||||
D (88795) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (88796) vfs: FDs in readfds =[0m
|
|
||||||
D (88796) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (88807) vfs: FDs in readfds =[0m
|
|
||||||
D (88808) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (88809) vfs: FDs in readfds =[0m
|
|
||||||
D (88819) vfs: 54[0m
|
|
||||||
D (88820) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (88821) vfs: FDs in readfds =[0m
|
|
||||||
D (88821) vfs: 54[0m
|
|
||||||
D (89332) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (89333) vfs: FDs in readfds =[0m
|
|
||||||
D (89333) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (89344) vfs: FDs in readfds =[0m
|
|
||||||
D (89345) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (89346) vfs: FDs in readfds =[0m
|
|
||||||
D (89346) vfs: 54[0m
|
|
||||||
D (89357) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (89358) vfs: FDs in readfds =[0m
|
|
||||||
D (89358) vfs: 54[0m
|
|
||||||
D (89869) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (89870) vfs: FDs in readfds =[0m
|
|
||||||
D (89871) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (89881) vfs: FDs in readfds =[0m
|
|
||||||
D (89882) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (89883) vfs: FDs in readfds =[0m
|
|
||||||
D (89893) vfs: 54[0m
|
|
||||||
D (89894) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (89895) vfs: FDs in readfds =[0m
|
|
||||||
D (89895) vfs: 54[0m
|
|
||||||
D (90406) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (90407) vfs: FDs in readfds =[0m
|
|
||||||
D (90407) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (90418) vfs: FDs in readfds =[0m
|
|
||||||
D (90419) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (90419) vfs: FDs in readfds =[0m
|
|
||||||
D (90430) vfs: 54[0m
|
|
||||||
D (90432) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (90432) vfs: FDs in readfds =[0m
|
|
||||||
D (90433) vfs: 54[0m
|
|
||||||
D (90933) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (90934) vfs: FDs in readfds =[0m
|
|
||||||
D (90935) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (90945) vfs: FDs in readfds =[0m
|
|
||||||
D (90946) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (90947) vfs: FDs in readfds =[0m
|
|
||||||
D (90957) vfs: 54[0m
|
|
||||||
D (90958) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (90959) vfs: FDs in readfds =[0m
|
|
||||||
D (90959) vfs: 54[0m
|
|
||||||
D (91470) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (91471) vfs: FDs in readfds =[0m
|
|
||||||
D (91471) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (91482) vfs: FDs in readfds =[0m
|
|
||||||
D (91483) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (91483) vfs: FDs in readfds =[0m
|
|
||||||
D (91494) vfs: 54[0m
|
|
||||||
D (91495) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (91496) vfs: FDs in readfds =[0m
|
|
||||||
D (91496) vfs: 54[0m
|
|
||||||
D (92007) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (92009) vfs: FDs in readfds =[0m
|
|
||||||
D (92009) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (92010) vfs: FDs in readfds =[0m
|
|
||||||
D (92021) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (92022) vfs: FDs in readfds =[0m
|
|
||||||
D (92022) vfs: 54[0m
|
|
||||||
D (92033) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (92034) vfs: FDs in readfds =[0m
|
|
||||||
D (92034) vfs: 54[0m
|
|
||||||
D (92535) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (92536) vfs: FDs in readfds =[0m
|
|
||||||
D (92536) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (92547) vfs: FDs in readfds =[0m
|
|
||||||
D (92548) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (92548) vfs: FDs in readfds =[0m
|
|
||||||
D (92559) vfs: 54[0m
|
|
||||||
D (92560) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (92560) vfs: FDs in readfds =[0m
|
|
||||||
D (92561) vfs: 54[0m
|
|
||||||
D (93072) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (93073) vfs: FDs in readfds =[0m
|
|
||||||
D (93073) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (93084) vfs: FDs in readfds =[0m
|
|
||||||
D (93085) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (93085) vfs: FDs in readfds =[0m
|
|
||||||
D (93096) vfs: 54[0m
|
|
||||||
D (93097) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (93098) vfs: FDs in readfds =[0m
|
|
||||||
D (93098) vfs: 54[0m
|
|
||||||
D (93609) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (93610) vfs: FDs in readfds =[0m
|
|
||||||
D (93610) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (93621) vfs: FDs in readfds =[0m
|
|
||||||
D (93622) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (93622) vfs: FDs in readfds =[0m
|
|
||||||
D (93633) vfs: 54[0m
|
|
||||||
D (93634) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (93634) vfs: FDs in readfds =[0m
|
|
||||||
D (93635) vfs: 54[0m
|
|
||||||
D (94146) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (94147) vfs: FDs in readfds =[0m
|
|
||||||
D (94147) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (94158) vfs: FDs in readfds =[0m
|
|
||||||
D (94159) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (94160) vfs: FDs in readfds =[0m
|
|
||||||
D (94160) vfs: 54[0m
|
|
||||||
D (94171) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (94172) vfs: FDs in readfds =[0m
|
|
||||||
D (94172) vfs: 54[0m
|
|
||||||
D (94683) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (94684) vfs: FDs in readfds =[0m
|
|
||||||
D (94684) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (94695) vfs: FDs in readfds =[0m
|
|
||||||
D (94696) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (94696) vfs: FDs in readfds =[0m
|
|
||||||
D (94707) vfs: 54[0m
|
|
||||||
D (94708) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (94708) vfs: FDs in readfds =[0m
|
|
||||||
D (94709) vfs: 54[0m
|
|
||||||
D (95220) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (95221) vfs: FDs in readfds =[0m
|
|
||||||
D (95221) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (95232) vfs: FDs in readfds =[0m
|
|
||||||
D (95233) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (95234) vfs: FDs in readfds =[0m
|
|
||||||
D (95234) vfs: 54[0m
|
|
||||||
D (95245) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (95246) vfs: FDs in readfds =[0m
|
|
||||||
D (95246) vfs: 54[0m
|
|
||||||
D (95757) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (95758) vfs: FDs in readfds =[0m
|
|
||||||
D (95758) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (95769) vfs: FDs in readfds =[0m
|
|
||||||
D (95770) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (95770) vfs: FDs in readfds =[0m
|
|
||||||
D (95781) vfs: 54[0m
|
|
||||||
D (95782) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (95782) vfs: FDs in readfds =[0m
|
|
||||||
D (95783) vfs: 54[0m
|
|
||||||
D (96049) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (96051) vfs: FDs in readfds =[0m
|
|
||||||
D (96051) vfs: 54[0m
|
|
||||||
D (96051) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (96063) vfs: FDs in readfds =[0m
|
|
||||||
D (96063) vfs: 54[0m
|
|
||||||
D (96077) vfs: esp_vfs_select starts with nfds = 58[0m
|
|
||||||
D (96078) vfs: FDs in readfds =[0m
|
|
||||||
D (96088) vfs: 54[0m
|
|
||||||
D (96088) vfs: 57[0m
|
|
||||||
D (96089) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (96090) vfs: FDs in readfds =[0m
|
|
||||||
D (96101) vfs: 54[0m
|
|
||||||
D (96102) vfs: 57[0m
|
|
||||||
D (96102) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (96103) vfs: FDs in readfds =[0m
|
|
||||||
D (96113) vfs: 57[0m
|
|
||||||
D (96114) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (96114) vfs: FDs in readfds =[0m
|
|
||||||
D (96115) vfs: 57[0m
|
|
||||||
D (96179) vfs: esp_vfs_select starts with nfds = 58[0m
|
|
||||||
D (96180) vfs: FDs in readfds =[0m
|
|
||||||
D (96181) vfs: 54[0m
|
|
||||||
D (96181) vfs: 57[0m
|
|
||||||
D (96192) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (96194) vfs: FDs in readfds =[0m
|
|
||||||
D (96194) vfs: 54[0m
|
|
||||||
D (96194) vfs: 57[0m
|
|
||||||
D (96583) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (96584) vfs: FDs in readfds =[0m
|
|
||||||
D (96585) vfs: 57[0m
|
|
||||||
D (96585) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (96596) vfs: FDs in readfds =[0m
|
|
||||||
D (96596) vfs: 57[0m
|
|
||||||
D (96624) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (96626) vfs: FDs in readfds =[0m
|
|
||||||
D (96626) vfs: 54[0m
|
|
||||||
D (96627) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (96638) vfs: FDs in readfds =[0m
|
|
||||||
D (96638) vfs: 54[0m
|
|
||||||
D (96986) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (96988) vfs: FDs in readfds =[0m
|
|
||||||
D (96988) vfs: 54[0m
|
|
||||||
D (96989) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (96999) vfs: FDs in readfds =[0m
|
|
||||||
D (97000) vfs: 54[0m
|
|
||||||
D (97013) vfs: esp_vfs_select starts with nfds = 59[0m
|
|
||||||
D (97014) vfs: FDs in readfds =[0m
|
|
||||||
D (97025) vfs: 54[0m
|
|
||||||
D (97025) vfs: 58[0m
|
|
||||||
D (97026) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (97026) vfs: FDs in readfds =[0m
|
|
||||||
D (97037) vfs: 54[0m
|
|
||||||
D (97038) vfs: 58[0m
|
|
||||||
D (97038) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (97049) vfs: FDs in readfds =[0m
|
|
||||||
D (97051) vfs: 58[0m
|
|
||||||
D (97051) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (97052) vfs: FDs in readfds =[0m
|
|
||||||
D (97052) vfs: 58[0m
|
|
||||||
D (97207) vfs: esp_vfs_select starts with nfds = 59[0m
|
|
||||||
D (97218) vfs: FDs in readfds =[0m
|
|
||||||
D (97219) vfs: 54[0m
|
|
||||||
D (97219) vfs: 58[0m
|
|
||||||
D (97220) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (97231) vfs: FDs in readfds =[0m
|
|
||||||
D (97232) vfs: 54[0m
|
|
||||||
D (97232) vfs: 58[0m
|
|
||||||
D (97356) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (97358) vfs: FDs in readfds =[0m
|
|
||||||
D (97358) vfs: 58[0m
|
|
||||||
D (97358) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (97369) vfs: FDs in readfds =[0m
|
|
||||||
D (97370) vfs: 58[0m
|
|
||||||
D (97397) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (97398) vfs: FDs in readfds =[0m
|
|
||||||
D (97398) vfs: 54[0m
|
|
||||||
D (97399) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (97410) vfs: FDs in readfds =[0m
|
|
||||||
D (97410) vfs: 54[0m
|
|
||||||
D (97911) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (97912) vfs: FDs in readfds =[0m
|
|
||||||
D (97912) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (97923) vfs: FDs in readfds =[0m
|
|
||||||
D (97924) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (97925) vfs: FDs in readfds =[0m
|
|
||||||
D (97925) vfs: 54[0m
|
|
||||||
D (97936) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (97937) vfs: FDs in readfds =[0m
|
|
||||||
D (97937) vfs: 54[0m
|
|
||||||
D (98448) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (98449) vfs: FDs in readfds =[0m
|
|
||||||
D (98449) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (98460) vfs: FDs in readfds =[0m
|
|
||||||
D (98461) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (98462) vfs: FDs in readfds =[0m
|
|
||||||
D (98472) vfs: 54[0m
|
|
||||||
D (98473) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (98474) vfs: FDs in readfds =[0m
|
|
||||||
D (98474) vfs: 54[0m
|
|
||||||
D (98985) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (98986) vfs: FDs in readfds =[0m
|
|
||||||
D (98986) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (98997) vfs: FDs in readfds =[0m
|
|
||||||
D (98998) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (98998) vfs: FDs in readfds =[0m
|
|
||||||
D (99009) vfs: 54[0m
|
|
||||||
D (99010) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (99011) vfs: FDs in readfds =[0m
|
|
||||||
D (99011) vfs: 54[0m
|
|
||||||
D (99522) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (99523) vfs: FDs in readfds =[0m
|
|
||||||
D (99523) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (99534) vfs: FDs in readfds =[0m
|
|
||||||
D (99535) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (99536) vfs: FDs in readfds =[0m
|
|
||||||
D (99536) vfs: 54[0m
|
|
||||||
D (99547) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (99548) vfs: FDs in readfds =[0m
|
|
||||||
D (99548) vfs: 54[0m
|
|
||||||
D (100059) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (100060) vfs: FDs in readfds =[0m
|
|
||||||
D (100060) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (100071) vfs: FDs in readfds =[0m
|
|
||||||
D (100072) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (100072) vfs: FDs in readfds =[0m
|
|
||||||
D (100083) vfs: 54[0m
|
|
||||||
D (100084) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (100085) vfs: FDs in readfds =[0m
|
|
||||||
D (100085) vfs: 54[0m
|
|
||||||
D (100596) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (100597) vfs: FDs in readfds =[0m
|
|
||||||
D (100597) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (100608) vfs: FDs in readfds =[0m
|
|
||||||
D (100610) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (100610) vfs: FDs in readfds =[0m
|
|
||||||
D (100611) vfs: 54[0m
|
|
||||||
D (100622) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (100623) vfs: FDs in readfds =[0m
|
|
||||||
D (100623) vfs: 54[0m
|
|
||||||
D (101124) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (101125) vfs: FDs in readfds =[0m
|
|
||||||
D (101126) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (101137) vfs: FDs in readfds =[0m
|
|
||||||
D (101137) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (101138) vfs: FDs in readfds =[0m
|
|
||||||
D (101149) vfs: 54[0m
|
|
||||||
D (101149) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (101150) vfs: FDs in readfds =[0m
|
|
||||||
D (101151) vfs: 54[0m
|
|
||||||
D (101661) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (101662) vfs: FDs in readfds =[0m
|
|
||||||
D (101662) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (101673) vfs: FDs in readfds =[0m
|
|
||||||
D (101674) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (101674) vfs: FDs in readfds =[0m
|
|
||||||
D (101685) vfs: 54[0m
|
|
||||||
D (101686) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (101687) vfs: FDs in readfds =[0m
|
|
||||||
D (101687) vfs: 54[0m
|
|
||||||
D (102198) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (102199) vfs: FDs in readfds =[0m
|
|
||||||
D (102200) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (102210) vfs: FDs in readfds =[0m
|
|
||||||
D (102211) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (102212) vfs: FDs in readfds =[0m
|
|
||||||
D (102222) vfs: 54[0m
|
|
||||||
D (102223) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (102224) vfs: FDs in readfds =[0m
|
|
||||||
D (102224) vfs: 54[0m
|
|
||||||
D (102735) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (102736) vfs: FDs in readfds =[0m
|
|
||||||
D (102736) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (102747) vfs: FDs in readfds =[0m
|
|
||||||
D (102748) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (102749) vfs: FDs in readfds =[0m
|
|
||||||
D (102750) vfs: 54[0m
|
|
||||||
D (102761) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (102761) vfs: FDs in readfds =[0m
|
|
||||||
D (102762) vfs: 54[0m
|
|
||||||
D (103207) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (103208) vfs: FDs in readfds =[0m
|
|
||||||
D (103208) vfs: 54[0m
|
|
||||||
D (103209) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (103220) vfs: FDs in readfds =[0m
|
|
||||||
D (103220) vfs: 54[0m
|
|
||||||
D (103234) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (103235) vfs: FDs in readfds =[0m
|
|
||||||
D (103246) vfs: 54[0m
|
|
||||||
D (103246) vfs: 59[0m
|
|
||||||
D (103247) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (103248) vfs: FDs in readfds =[0m
|
|
||||||
D (103259) vfs: 54[0m
|
|
||||||
D (103259) vfs: 59[0m
|
|
||||||
D (103259) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (103271) vfs: FDs in readfds =[0m
|
|
||||||
D (103271) vfs: 59[0m
|
|
||||||
D (103272) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (103272) vfs: FDs in readfds =[0m
|
|
||||||
D (103283) vfs: 59[0m
|
|
||||||
D (103336) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (103336) vfs: FDs in readfds =[0m
|
|
||||||
D (103337) vfs: 54[0m
|
|
||||||
D (103347) vfs: 59[0m
|
|
||||||
D (103348) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (103349) vfs: FDs in readfds =[0m
|
|
||||||
D (103349) vfs: 54[0m
|
|
||||||
D (103360) vfs: 59[0m
|
|
||||||
D (103860) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (103861) vfs: FDs in readfds =[0m
|
|
||||||
D (103861) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (103872) vfs: FDs in readfds =[0m
|
|
||||||
D (103873) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (103874) vfs: FDs in readfds =[0m
|
|
||||||
D (103884) vfs: 54[0m
|
|
||||||
D (103885) vfs: 59[0m
|
|
||||||
D (103886) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (103887) vfs: FDs in readfds =[0m
|
|
||||||
D (103898) vfs: 54[0m
|
|
||||||
D (103898) vfs: 59[0m
|
|
||||||
D (104399) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (104400) vfs: FDs in readfds =[0m
|
|
||||||
D (104400) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (104412) vfs: FDs in readfds =[0m
|
|
||||||
D (104412) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (104413) vfs: FDs in readfds =[0m
|
|
||||||
D (104424) vfs: 54[0m
|
|
||||||
D (104424) vfs: 59[0m
|
|
||||||
D (104425) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (104425) vfs: FDs in readfds =[0m
|
|
||||||
D (104436) vfs: 54[0m
|
|
||||||
D (104437) vfs: 59[0m
|
|
||||||
D (104937) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (104938) vfs: FDs in readfds =[0m
|
|
||||||
D (104939) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (104949) vfs: FDs in readfds =[0m
|
|
||||||
D (104950) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (104951) vfs: FDs in readfds =[0m
|
|
||||||
D (104961) vfs: 54[0m
|
|
||||||
D (104961) vfs: 59[0m
|
|
||||||
D (104962) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (104963) vfs: FDs in readfds =[0m
|
|
||||||
D (104974) vfs: 54[0m
|
|
||||||
D (104974) vfs: 59[0m
|
|
||||||
D (105475) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (105476) vfs: FDs in readfds =[0m
|
|
||||||
D (105476) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (105487) vfs: FDs in readfds =[0m
|
|
||||||
D (105488) vfs: esp_vfs_select starts with nfds = 60[0m
|
|
||||||
D (105489) vfs: FDs in readfds =[0m
|
|
||||||
D (105499) vfs: 54[0m
|
|
||||||
D (105500) vfs: 59[0m
|
|
||||||
D (105500) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (105503) vfs: FDs in readfds =[0m
|
|
||||||
D (105504) vfs: 54[0m
|
|
||||||
D (105514) vfs: 59[0m
|
|
||||||
D (105560) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (105562) vfs: FDs in readfds =[0m
|
|
||||||
D (105562) vfs: 59[0m
|
|
||||||
D (105563) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (105573) vfs: FDs in readfds =[0m
|
|
||||||
D (105574) vfs: 59[0m
|
|
||||||
D (105601) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (105602) vfs: FDs in readfds =[0m
|
|
||||||
D (105603) vfs: 54[0m
|
|
||||||
D (105614) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (105614) vfs: FDs in readfds =[0m
|
|
||||||
D (105615) vfs: 54[0m
|
|
||||||
D (106115) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (106116) vfs: FDs in readfds =[0m
|
|
||||||
D (106117) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (106127) vfs: FDs in readfds =[0m
|
|
||||||
D (106128) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (106129) vfs: FDs in readfds =[0m
|
|
||||||
D (106140) vfs: 54[0m
|
|
||||||
D (106140) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (106141) vfs: FDs in readfds =[0m
|
|
||||||
D (106142) vfs: 54[0m
|
|
||||||
D (106652) vfs: socket_select returned 0 and the FDs are the following[0m
|
|
||||||
D (106653) vfs: FDs in readfds =[0m
|
|
||||||
D (106653) vfs: esp_vfs_select returns 0[0m
|
|
||||||
D (106664) vfs: FDs in readfds =[0m
|
|
||||||
D (106665) vfs: esp_vfs_select starts with nfds = 55[0m
|
|
||||||
D (106666) vfs: FDs in readfds =[0m
|
|
||||||
D (106677) vfs: 54[0m
|
|
||||||
D (106678) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (106679) vfs: FDs in readfds =[0m
|
|
||||||
D (106690) vfs: 54[0m
|
|
||||||
D (106690) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (106691) vfs: FDs in readfds =[0m
|
|
||||||
D (106702) vfs: 54[0m
|
|
||||||
D (106702) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (106703) vfs: FDs in readfds =[0m
|
|
||||||
D (106703) vfs: 54[0m
|
|
||||||
D (106717) vfs: esp_vfs_select starts with nfds = 61[0m
|
|
||||||
D (106728) vfs: FDs in readfds =[0m
|
|
||||||
D (106728) vfs: 54[0m
|
|
||||||
D (106728) vfs: 60[0m
|
|
||||||
D (106729) vfs: calling socket_select with the following FDs[0m
|
|
||||||
D (106740) vfs: FDs in readfds =[0m
|
|
||||||
D (106741) vfs: 54[0m
|
|
||||||
D (106741) vfs: 60[0m
|
|
||||||
D (106741) vfs: socket_select returned 1 and the FDs are the following[0m
|
|
||||||
D (106753) vfs: FDs in readfds =[0m
|
|
||||||
D (106754) vfs: 60[0m
|
|
||||||
D (106754) vfs: esp_vfs_select returns 1[0m
|
|
||||||
D (106765) vfs: FDs in readfds =[0m
|
|
||||||
D (106766) vfs: 60[0m
|
|
@ -1,151 +0,0 @@
|
|||||||
ESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name: Got test name: test_abort
|
|
||||||
|
|
||||||
abort() was called at PC 0x42003863 on core 0
|
|
||||||
Core 0 register dump:
|
|
||||||
MEPC : 0x403825fa RA : 0x40382a3e SP : 0x3fc8cd5c GP : 0x3fc887e0
|
|
||||||
TP : 0xa5a5a5a5 T0 : 0x37363534 T1 : 0x7271706f T2 : 0x33323130
|
|
||||||
S0/FP : 0x00000004 S1 : 0x3fc8cdc0 A0 : 0x3fc8cd88 A1 : 0x3fc8cdbe
|
|
||||||
A2 : 0x00000000 A3 : 0x3fc8cdb5 A4 : 0x00000001 A5 : 0x3fc8a000
|
|
||||||
A6 : 0x7a797877 A7 : 0x76757473 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
|
|
||||||
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
|
|
||||||
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
|
|
||||||
T3 : 0x6e6d6c6b T4 : 0x6a696867 T5 : 0x66656463 T6 : 0x62613938
|
|
||||||
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000
|
|
||||||
MHARTID : 0x00000000
|
|
||||||
|
|
||||||
Stack memory:
|
|
||||||
3fc8cd5c: 0xa5a5a5a5 0x3fc8ce34 0x3fc8cdbc 0x403870ce 0x00000001 0x00000004 0x3fc8aaf4 0x3fc893b0
|
|
||||||
3fc8cd7c: 0x3fc8cdc0 0x3fc893cc 0x3fc8cdbc 0x726f6261 0x20292874 0x20736177 0x6c6c6163 0x61206465
|
|
||||||
3fc8cd9c: 0x43502074 0x34783020 0x33303032 0x20333638 0x63206e6f 0x2065726f 0x00000030 0x3fc80000
|
|
||||||
3fc8cdbc: 0xa5a50030 0x30303234 0x33363833 0x42003900 0x00000001 0xa5a5a5a5 0x3fc89cc0 0x42003866
|
|
||||||
3fc8cddc: 0x3fc8a000 0x0000000a 0x420018fc 0x420039ea 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x42012ea6
|
|
||||||
3fc8cdfc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x40384206 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8ce1c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x00000154 0x3fc8cd4c 0x00000349
|
|
||||||
3fc8ce3c: 0x3fc89964 0x3fc89964 0x3fc8ce34 0x3fc8995c 0x00000018 0xdf6337cf 0xbccacfdd 0x3fc8ce34
|
|
||||||
3fc8ce5c: 0x00000000 0x00000001 0x3fc8be30 0x6e69616d 0xfa3b3d00 0x3f2a8cb8 0x002d1f13 0x00000000
|
|
||||||
3fc8ce7c: 0x3fc8ce20 0x00000001 0x00000000 0x00000000 0x00000000 0x0000000b 0x3fc8a950 0x3fc8a9b8
|
|
||||||
3fc8ce9c: 0x3fc8aa20 0x00000000 0x00000000 0x00000001 0x00000000 0x00000000 0x00000000 0x42005b6c
|
|
||||||
3fc8cebc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cedc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cefc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf1c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf3c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf5c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf7c: 0x00000000 0x00000000 0x3fc8ce00 0x00000900 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cf9c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cfbc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cfdc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cffc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d01c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d03c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d05c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d07c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d09c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0bc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0dc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0fc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d11c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d13c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ELF file SHA256: 72e88c31482c8900
|
|
||||||
|
|
||||||
Rebooting...
|
|
||||||
x<EFBFBD>jESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name: Got test name: test_illegal_instruction
|
|
||||||
Guru Meditation Error: Core 0 panic'ed (Illegal instruction). Exception was unhandled.
|
|
||||||
|
|
||||||
Core 0 register dump:
|
|
||||||
MEPC : 0x420037ce RA : 0x42003a18 SP : 0x3fc8cdec GP : 0x3fc887e0
|
|
||||||
TP : 0xa5a5a5a5 T0 : 0x7f7f7f7f T1 : 0x7f7f7f7f T2 : 0xffffffff
|
|
||||||
S0/FP : 0x3fc89cc0 S1 : 0xa5a5a5a5 A0 : 0x00000000 A1 : 0x3c022b0c
|
|
||||||
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x7f7f7f7f
|
|
||||||
A6 : 0x420019ee A7 : 0xa5a5a5a5 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
|
|
||||||
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
|
|
||||||
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
|
|
||||||
T3 : 0xa5a5a5a5 T4 : 0xa5a5a5a5 T5 : 0xa5a5a5a5 T6 : 0xa5a5a5a5
|
|
||||||
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000002 MTVAL : 0x00000000
|
|
||||||
MHARTID : 0x00000000
|
|
||||||
|
|
||||||
Stack memory:
|
|
||||||
3fc8cdec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x42012ea6 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0x40384206
|
|
||||||
3fc8ce0c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8ce2c: 0xa5a5a5a5 0x00000154 0x3fc8cd4c 0x0000051e 0x3fc89964 0x3fc89964 0x3fc8ce34 0x3fc8995c
|
|
||||||
3fc8ce4c: 0x00000018 0xdf6337cf 0xbccacfdd 0x3fc8ce34 0x00000000 0x00000001 0x3fc8be30 0x6e69616d
|
|
||||||
3fc8ce6c: 0xfa3b3d00 0x3f2a8cb8 0x002d1f13 0x00000000 0x3fc8ce20 0x00000001 0x00000000 0x00000000
|
|
||||||
3fc8ce8c: 0x00000000 0x0000000b 0x3fc8a950 0x3fc8a9b8 0x3fc8aa20 0x00000000 0x00000000 0x00000001
|
|
||||||
3fc8ceac: 0x00000000 0x00000000 0x00000000 0x42005b6c 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cecc: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8ceec: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf0c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf2c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf4c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000
|
|
||||||
3fc8cf6c: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x3fc8ce00 0x00000900
|
|
||||||
3fc8cf8c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cfac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cfcc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8cfec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d00c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d02c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d04c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d06c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d08c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0ac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0cc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d0ec: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d10c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d12c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d14c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d16c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d18c: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d1ac: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
3fc8d1cc: 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5 0xa5a5a5a5
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ELF file SHA256: 72e88c31482c8900
|
|
||||||
|
|
||||||
Rebooting...
|
|
||||||
x<EFBFBD>jESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name:
|
|
@ -1,79 +0,0 @@
|
|||||||
ESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name: Got test name: test_abort
|
|
||||||
abort() was called at PC 0x42003863 on core 0
|
|
||||||
Core 0 register dump:
|
|
||||||
MEPC : 0x403825fa RA : 0x40382a3e SP : 0x3fc8cd5c GP : 0x3fc887e0
|
|
||||||
TP : 0xa5a5a5a5 T0 : 0x37363534 T1 : 0x7271706f T2 : 0x33323130
|
|
||||||
S0/FP : 0x00000004 S1 : 0x3fc8cdc0 A0 : 0x3fc8cd88 A1 : 0x3fc8cdbe
|
|
||||||
A2 : 0x00000000 A3 : 0x3fc8cdb5 A4 : 0x00000001 A5 : 0x3fc8a000
|
|
||||||
A6 : 0x7a797877 A7 : 0x76757473 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
|
|
||||||
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
|
|
||||||
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
|
|
||||||
T3 : 0x6e6d6c6b T4 : 0x6a696867 T5 : 0x66656463 T6 : 0x62613938
|
|
||||||
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000007 MTVAL : 0x00000000
|
|
||||||
MHARTID : 0x00000000
|
|
||||||
0x403825fa in ?? ()
|
|
||||||
#0 0x403825fa in ?? ()
|
|
||||||
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
|
|
||||||
ELF file SHA256: 72e88c31482c8900
|
|
||||||
Rebooting...
|
|
||||||
x<EFBFBD>jESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name: Got test name: test_illegal_instruction
|
|
||||||
Guru Meditation Error: Core 0 panic'ed (Illegal instruction). Exception was unhandled.
|
|
||||||
Core 0 register dump:
|
|
||||||
MEPC : 0x420037ce RA : 0x42003a18 SP : 0x3fc8cdec GP : 0x3fc887e0
|
|
||||||
TP : 0xa5a5a5a5 T0 : 0x7f7f7f7f T1 : 0x7f7f7f7f T2 : 0xffffffff
|
|
||||||
S0/FP : 0x3fc89cc0 S1 : 0xa5a5a5a5 A0 : 0x00000000 A1 : 0x3c022b0c
|
|
||||||
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x7f7f7f7f
|
|
||||||
A6 : 0x420019ee A7 : 0xa5a5a5a5 S2 : 0xa5a5a5a5 S3 : 0xa5a5a5a5
|
|
||||||
S4 : 0xa5a5a5a5 S5 : 0xa5a5a5a5 S6 : 0xa5a5a5a5 S7 : 0xa5a5a5a5
|
|
||||||
S8 : 0xa5a5a5a5 S9 : 0xa5a5a5a5 S10 : 0xa5a5a5a5 S11 : 0xa5a5a5a5
|
|
||||||
T3 : 0xa5a5a5a5 T4 : 0xa5a5a5a5 T5 : 0xa5a5a5a5 T6 : 0xa5a5a5a5
|
|
||||||
MSTATUS : 0x00001881 MTVEC : 0x40380001 MCAUSE : 0x00000002 MTVAL : 0x00000000
|
|
||||||
MHARTID : 0x00000000
|
|
||||||
0x420037ce in ?? ()
|
|
||||||
#0 0x420037ce in ?? ()
|
|
||||||
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
|
|
||||||
ELF file SHA256: 72e88c31482c8900
|
|
||||||
Rebooting...
|
|
||||||
x<EFBFBD>jESP-ROM:esp32c3-20200918
|
|
||||||
Build:Sep 18 2020
|
|
||||||
rst:0xc (RTC_SW_CPU_RST),boot:0xc (SPI_FAST_FLASH_BOOT)
|
|
||||||
Saved PC:0x40381f24
|
|
||||||
SPIWP:0xee
|
|
||||||
mode:DOUT, clock div:2
|
|
||||||
load:0x3fcd6100,len:0x14
|
|
||||||
load:0x3fcd6114,len:0x11d8
|
|
||||||
load:0x403d0000,len:0xd0c
|
|
||||||
load:0x403d2000,len:0x1b84
|
|
||||||
entry 0x403d0062
|
|
||||||
␛[0;33mW (37) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (184) bootloader_random: RNG for ESP32-C3 not currently supported␛[0m
|
|
||||||
␛[0;33mW (196) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.␛[0m
|
|
||||||
Enter test name:
|
|
Loading…
Reference in New Issue
Block a user