본문 바로가기

MCU/ESP32

ESP32 - ESP IDF # monitor

728x90
반응형

ESP IDF를 통해서 칩에 업로드 되어 있는 동작을 monitor를 하기 위해서는 아래 명령어를 실행하면 된다.

 

1. idf를 현재 디렉토리에서 사용할 수 있도록 path 설정을 해준다. (get_idf alias로 놓고 쓰고 있음)

 

2. idf.py -p PORT monitor 명령어를 통해 monitoring을 시작한다.

 

그런데 이상하게 examples 경로 안에서만 실행이 된다.

칩에 업로드 되어 있는 코드와 무관한 examples 임에도...

 

에러문구를 통해 python 소스코드를 봐보니

idf.py 명령어를 통해 실행되는 소스코드와 그 경로는 다음과 같다.

# esp-idf > tools > idf_py_actions > serial_ext.py

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:
        """
        Run esp_idf_monitor to watch build output
        """
        project_desc = _get_project_desc(ctx, args)
        elf_file = os.path.join(args.build_dir, project_desc['app_elf'])

        idf_monitor = os.path.join(os.environ['IDF_PATH'], 'tools/idf_monitor.py')
        monitor_args = [PYTHON, idf_monitor]

        if project_desc['target'] != 'linux':
            if no_reset and args.port is None:
                msg = ('WARNING: --no-reset is ignored. '
                       'Please specify the port with the --port argument in order to use this option.')
                yellow_print(msg)
                no_reset = False

            args.port = args.port or get_default_serial_port()
            monitor_args += ['-p', args.port]

            baud = monitor_baud or os.getenv('IDF_MONITOR_BAUD') or os.getenv('MONITORBAUD')

            if baud is None:
                # Baud hasn't been changed locally (by local baud argument nor by environment variables)
                #
                # Use the global baud rate if it has been changed by the command line.
                # Use project_desc['monitor_baud'] as the last option.

                global_baud_defined = ctx._parameter_source['baud'] == click.core.ParameterSource.COMMANDLINE
                baud = args.baud if global_baud_defined else project_desc['monitor_baud']

            monitor_args += ['-b', baud]

        monitor_args += ['--toolchain-prefix', project_desc['monitor_toolprefix']]

        coredump_decode = get_sdkconfig_value(project_desc['config_file'], 'CONFIG_ESP_COREDUMP_DECODE')
        if coredump_decode is not None:
            monitor_args += ['--decode-coredumps', coredump_decode]

        target_arch_riscv = get_sdkconfig_value(project_desc['config_file'], 'CONFIG_IDF_TARGET_ARCH_RISCV')
        monitor_args += ['--target', project_desc['target']]
        revision = project_desc.get('min_rev')
        if revision:
            monitor_args += ['--revision', revision]

        if target_arch_riscv:
            monitor_args += ['--decode-panic', 'backtrace']

        if print_filter is not None:
            monitor_args += ['--print_filter', print_filter]

        if elf_file:
            monitor_args += [elf_file]

        if encrypted:
            monitor_args += ['--encrypted']

        if no_reset:
            monitor_args += ['--no-reset']

        if timestamps:
            monitor_args += ['--timestamps']

        if timestamp_format:
            monitor_args += ['--timestamp-format', timestamp_format]

        if force_color or os.name == 'nt':
            monitor_args += ['--force-color']

        idf_py = [PYTHON] + _get_commandline_options(ctx)  # commands to re-run idf.py
        monitor_args += ['-m', ' '.join("'%s'" % a for a in idf_py)]
        hints = not args.no_hints

        # Temporally ignore SIGINT, which is used in idf_monitor to spawn gdb.
        old_handler = signal.getsignal(signal.SIGINT)
        signal.signal(signal.SIGINT, signal.SIG_IGN)

        try:
            RunTool('idf_monitor', monitor_args, args.project_dir, build_dir=args.build_dir, hints=hints, interactive=True, convert_output=True)()
        finally:
            signal.signal(signal.SIGINT, old_handler)

  

flash 함수도 아래에 있다.

 

어쨌든 위에서 project_desc는 현재경로/build/project_description.json 에 기록되어 있는 json 코드들을 의미한다.

project_desc[] 형태로 값을 불러오는데, 해당하는 조건들에 대한 json 데이터들이 필수적으로 있어야 monitor 함수를 통해서 monitoring 툴을 불러오고 그 툴을 통해 동작 로그를 볼 수 있다.

 

monitor에 관련된 설정만 있으면 되는게 아니라 다음과 같은 값들이 있어야 한다.

{
    "monitor_baud" :      "115200",
    "monitor_toolprefix": "xtensa-esp32-elf-",
    "app_elf":            "generic_gpio.elf",
    "target":             "esp32",
    "config_file":        "/home/USER/git/esp/generic_gpio/sdkconfig"
}

 

config_file의 경우 examples와 상관 없이 build 과정에서 MCU 동작에 필요한 설정값들을 생성해주는 것으로 보인다.

 

칩에 업로드 되어 있는 값과 전혀 상관는 부분들을 멋대로 값을 줘도 되긴한다.

(내부적인 코드를 더 살펴봐야 확실히 알긴하겠지만, 실제 monitor에 반영이 되는 값은 monitor_baud 값만 적용)

{
    "monitor_baud" :      "115200",
    "monitor_toolprefix": "xtensa-esp32-elf-ㅋㅋㅋ",
    "app_elf":            "generic_gpㅋㅋㅋ.elf",
    "target":             "esp32ㅋㅋㅋ",
    "config_file":        "/home/USER/git/esp/generic_gpio/sdkconfigㅋㅋㅋ"
}

위와 같이 ㅋㅋㅋ 를 넣어서 실제로는 존재하지 않는 값들을 넣어도 monitoring에는 문제가 없었다.

하지만 해당 data의 key와 value값 자체가 존재는 해야 오류 없이 돌아감.

 

728x90
반응형

'MCU > ESP32' 카테고리의 다른 글

ESP-IDF: idf.py --ccache build  (1) 2024.05.01
Bluetooth: GATT Server vs Client  (0) 2024.04.27
ESP32: RTC and Low power mode  (0) 2024.04.19
ESP32: NVS # Bluetooth # nvs_flash_init()  (0) 2024.04.12
ESP32: ESP-BLE-MESH # Bluetooth  (0) 2024.04.11