From 84f74ad024793b88bd489f8a17db6691481ae17c Mon Sep 17 00:00:00 2001 From: Erhan Kurubas Date: Wed, 18 Jun 2025 23:29:05 +0200 Subject: [PATCH] change(sysview): drop ESP mcore extension --- tools/esp_app_trace/espytrace/sysview.py | 1009 ++++++++++++---------- tools/esp_app_trace/sysviewtrace_proc.py | 21 +- 2 files changed, 557 insertions(+), 473 deletions(-) diff --git a/tools/esp_app_trace/espytrace/sysview.py b/tools/esp_app_trace/espytrace/sysview.py index a3cb0244bb..6702559b36 100644 --- a/tools/esp_app_trace/espytrace/sysview.py +++ b/tools/esp_app_trace/espytrace/sysview.py @@ -7,42 +7,42 @@ import struct import espytrace.apptrace as apptrace -SYSVIEW_EVTID_NOP = 0 # Dummy packet. -SYSVIEW_EVTID_OVERFLOW = 1 -SYSVIEW_EVTID_ISR_ENTER = 2 -SYSVIEW_EVTID_ISR_EXIT = 3 -SYSVIEW_EVTID_TASK_START_EXEC = 4 -SYSVIEW_EVTID_TASK_STOP_EXEC = 5 -SYSVIEW_EVTID_TASK_START_READY = 6 -SYSVIEW_EVTID_TASK_STOP_READY = 7 -SYSVIEW_EVTID_TASK_CREATE = 8 -SYSVIEW_EVTID_TASK_INFO = 9 -SYSVIEW_EVTID_TRACE_START = 10 -SYSVIEW_EVTID_TRACE_STOP = 11 -SYSVIEW_EVTID_SYSTIME_CYCLES = 12 -SYSVIEW_EVTID_SYSTIME_US = 13 -SYSVIEW_EVTID_SYSDESC = 14 -SYSVIEW_EVTID_MARK_START = 15 -SYSVIEW_EVTID_MARK_STOP = 16 -SYSVIEW_EVTID_IDLE = 17 -SYSVIEW_EVTID_ISR_TO_SCHEDULER = 18 -SYSVIEW_EVTID_TIMER_ENTER = 19 -SYSVIEW_EVTID_TIMER_EXIT = 20 -SYSVIEW_EVTID_STACK_INFO = 21 -SYSVIEW_EVTID_MODULEDESC = 22 -SYSVIEW_EVTID_DATA_SAMPLE = 23 -SYSVIEW_EVTID_INIT = 24 -SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT -SYSVIEW_EVTID_NAME_RESOURCE = 25 -SYSVIEW_EVTID_PRINT_FORMATTED = 26 -SYSVIEW_EVTID_NUMMODULES = 27 -SYSVIEW_EVENT_ID_PREDEF_MAX = SYSVIEW_EVTID_NUMMODULES +SYSVIEW_EVTID_NOP = 0 # Dummy packet. +SYSVIEW_EVTID_OVERFLOW = 1 +SYSVIEW_EVTID_ISR_ENTER = 2 +SYSVIEW_EVTID_ISR_EXIT = 3 +SYSVIEW_EVTID_TASK_START_EXEC = 4 +SYSVIEW_EVTID_TASK_STOP_EXEC = 5 +SYSVIEW_EVTID_TASK_START_READY = 6 +SYSVIEW_EVTID_TASK_STOP_READY = 7 +SYSVIEW_EVTID_TASK_CREATE = 8 +SYSVIEW_EVTID_TASK_INFO = 9 +SYSVIEW_EVTID_TRACE_START = 10 +SYSVIEW_EVTID_TRACE_STOP = 11 +SYSVIEW_EVTID_SYSTIME_CYCLES = 12 +SYSVIEW_EVTID_SYSTIME_US = 13 +SYSVIEW_EVTID_SYSDESC = 14 +SYSVIEW_EVTID_MARK_START = 15 +SYSVIEW_EVTID_MARK_STOP = 16 +SYSVIEW_EVTID_IDLE = 17 +SYSVIEW_EVTID_ISR_TO_SCHEDULER = 18 +SYSVIEW_EVTID_TIMER_ENTER = 19 +SYSVIEW_EVTID_TIMER_EXIT = 20 +SYSVIEW_EVTID_STACK_INFO = 21 +SYSVIEW_EVTID_MODULEDESC = 22 +SYSVIEW_EVTID_DATA_SAMPLE = 23 +SYSVIEW_EVTID_INIT = 24 +SYSVIEW_EVENT_ID_PREDEF_LEN_MAX = SYSVIEW_EVTID_INIT +SYSVIEW_EVTID_NAME_RESOURCE = 25 +SYSVIEW_EVTID_PRINT_FORMATTED = 26 +SYSVIEW_EVTID_NUMMODULES = 27 +SYSVIEW_EVENT_ID_PREDEF_MAX = SYSVIEW_EVTID_NUMMODULES -SYSVIEW_EVENT_ID_MAX = 200 +SYSVIEW_EVENT_ID_MAX = 200 -SYSVIEW_MODULE_EVENT_OFFSET = 512 +SYSVIEW_MODULE_EVENT_OFFSET = 512 -SYSVIEW_SYNC_LEN = 10 +SYSVIEW_SYNC_LEN = 10 _sysview_events_map = { 'SYS_NOP': SYSVIEW_EVTID_NOP, @@ -72,7 +72,7 @@ _sysview_events_map = { 'SYS_INIT': SYSVIEW_EVTID_INIT, 'SYS_NAME_RESOURCE': SYSVIEW_EVTID_NAME_RESOURCE, 'SYS_PRINT_FORMATTED': SYSVIEW_EVTID_PRINT_FORMATTED, - 'SYS_NUMMODULES': SYSVIEW_EVTID_NUMMODULES + 'SYS_NUMMODULES': SYSVIEW_EVTID_NUMMODULES, } _os_events_map = {} @@ -94,7 +94,7 @@ def parse_trace(reader, parser, os_evt_map_file=''): global _os_events_map # parse OS events formats file _os_events_map = _read_events_map(os_evt_map_file) - parser.esp_ext = ('; ESP_Extension\n' in _read_file_header(reader)) + _read_file_header(reader) _read_init_seq(reader) while True: event = parser.read_event(reader, _os_events_map) @@ -199,14 +199,14 @@ def _decode_u32(reader): sz = 0 val = 0 while True: - b, = struct.unpack('= SYSVIEW_EVENT_ID_PREDEF_LEN_MAX and self.plen != params_len: - raise SysViewTraceParseError('Invalid event {}({:d}) payload len {:d}! Must be {:d}.'.format(self.name, self.id, self.plen, params_len)) + raise SysViewTraceParseError( + 'Invalid event {}({:d}) payload len {:d}! Must be {:d}.'.format( + self.name, self.id, self.plen, params_len + ) + ) def __str__(self): params = '' @@ -375,23 +385,26 @@ class SysViewEvent(apptrace.TraceEvent): params += '{}, '.format(param) if len(params): params = params[:-2] # remove trailing ', ' - return '{:.9f} - core[{:d}].{}({:d}), plen {:d}: [{}]'.format(self.ts, self.core_id, self.name, self.id, self.plen, params) + return '{:.9f} - core[{:d}].{}({:d}), plen {:d}: [{}]'.format( + self.ts, self.core_id, self.name, self.id, self.plen, params + ) class SysViewEventParam: """ - Abstract base SystemView event's parameter class. This is a base class for all event's parameters. + Abstract base SystemView event's parameter class. This is a base class for all event's parameters. """ + def __init__(self, name, decode_func): """ - Constructor. + Constructor. - Parameters - ---------- - name : string - Event parameter name. - decode_func : callable object - Parameter decoding function. + Parameters + ---------- + name : string + Event parameter name. + decode_func : callable object + Parameter decoding function. """ self.name = name self.decode_func = decode_func @@ -401,19 +414,19 @@ class SysViewEventParam: def decode(self, reader, max_sz): """ - Reads and decodes events parameter. + Reads and decodes events parameter. - Parameters - ---------- - reader : apptrace.Reader - Trace reader object. - max_sz : int - Maximum number of bytes to read. + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + max_sz : int + Maximum number of bytes to read. - Returns - ------- - tuple - a tuple containg number of read bytes and decoded value. + Returns + ------- + tuple + a tuple containing number of read bytes and decoded value. """ pass @@ -426,104 +439,136 @@ class SysViewEventParam: class SysViewEventParamSimple(SysViewEventParam): """ - Simple SystemView event's parameter class. + Simple SystemView event's parameter class. """ + def decode(self, reader, max_sz): """ - see SysViewEventParam.decode() + see SysViewEventParam.decode() """ return self.decode_func(reader) class SysViewEventParamArray(SysViewEventParamSimple): """ - Array SystemView event's parameter class. + Array SystemView event's parameter class. """ + def __init__(self, name, decode_func, size=-1): """ - Constructor. + Constructor. - Parameters - ---------- - name : string - see SysViewEventParam.__init__() - decode_func : callable object - see SysViewEventParam.__init__() - size : int - Array's size. If -1 decode() will try to read all bytes from reader. + Parameters + ---------- + name : string + see SysViewEventParam.__init__() + decode_func : callable object + see SysViewEventParam.__init__() + size : int + Array's size. If -1 decode() will try to read all bytes from reader. """ SysViewEventParamSimple.__init__(self, name, decode_func) self.arr_size = size def decode(self, reader, max_sz): """ - see SysViewEventParam.decode() + see SysViewEventParam.decode() """ tottal_sz = 0 vals = [] i = 0 while tottal_sz < max_sz: - sz,val = self.decode_func(reader) + sz, val = self.decode_func(reader) vals.append(val) tottal_sz += sz i += 1 if self.arr_size != -1 and i == self.arr_size: break - return tottal_sz,vals + return tottal_sz, vals class SysViewPredefinedEvent(SysViewEvent): """ - Pre-defined SystemView events class. + Pre-defined SystemView events class. """ + _predef_events_fmt = { - SYSVIEW_EVTID_NOP: ('svNop', []), - SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]), - SYSVIEW_EVTID_ISR_ENTER: ('svIsrEnter', [SysViewEventParamSimple('irq_num', _decode_u32)]), - SYSVIEW_EVTID_ISR_EXIT: ('svIsrExit', []), - SYSVIEW_EVTID_TASK_START_EXEC: ('svTaskStartExec', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_STOP_EXEC: ('svTaskStopExec', []), + SYSVIEW_EVTID_NOP: ('svNop', []), + SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]), + SYSVIEW_EVTID_ISR_ENTER: ('svIsrEnter', [SysViewEventParamSimple('irq_num', _decode_u32)]), + SYSVIEW_EVTID_ISR_EXIT: ('svIsrExit', []), + SYSVIEW_EVTID_TASK_START_EXEC: ('svTaskStartExec', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_STOP_EXEC: ('svTaskStopExec', []), SYSVIEW_EVTID_TASK_START_READY: ('svTaskStartReady', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_STOP_READY: ('svTaskStopReady', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('cause', _decode_u32)]), - SYSVIEW_EVTID_TASK_CREATE: ('svTaskCreate', [SysViewEventParamSimple('tid', _decode_id)]), - SYSVIEW_EVTID_TASK_INFO: ('svTaskInfo', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('prio', _decode_u32), - SysViewEventParamSimple('name', _decode_str)]), - SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []), - SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []), - SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]), - SYSVIEW_EVTID_SYSTIME_US: ('svSysTimeUs', [SysViewEventParamSimple('time', _decode_u64)]), - SYSVIEW_EVTID_SYSDESC: ('svSysDesc', [SysViewEventParamSimple('desc', _decode_str)]), - SYSVIEW_EVTID_MARK_START: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), - SYSVIEW_EVTID_MARK_STOP: ('svUserStop', [SysViewEventParamSimple('user_id', _decode_u32)]), - SYSVIEW_EVTID_IDLE: ('svIdle', []), + SYSVIEW_EVTID_TASK_STOP_READY: ( + 'svTaskStopReady', + [SysViewEventParamSimple('tid', _decode_id), SysViewEventParamSimple('cause', _decode_u32)], + ), + SYSVIEW_EVTID_TASK_CREATE: ('svTaskCreate', [SysViewEventParamSimple('tid', _decode_id)]), + SYSVIEW_EVTID_TASK_INFO: ( + 'svTaskInfo', + [ + SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('prio', _decode_u32), + SysViewEventParamSimple('name', _decode_str), + ], + ), + SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []), + SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []), + SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]), + SYSVIEW_EVTID_SYSTIME_US: ('svSysTimeUs', [SysViewEventParamSimple('time', _decode_u64)]), + SYSVIEW_EVTID_SYSDESC: ('svSysDesc', [SysViewEventParamSimple('desc', _decode_str)]), + SYSVIEW_EVTID_MARK_START: ('svUserStart', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_MARK_STOP: ('svUserStop', [SysViewEventParamSimple('user_id', _decode_u32)]), + SYSVIEW_EVTID_IDLE: ('svIdle', []), SYSVIEW_EVTID_ISR_TO_SCHEDULER: ('svExitIsrToScheduler', []), - SYSVIEW_EVTID_TIMER_ENTER: ('svTimerEnter', [SysViewEventParamSimple('tim_id', _decode_u32)]), - SYSVIEW_EVTID_TIMER_EXIT: ('svTimerExit', []), - SYSVIEW_EVTID_STACK_INFO: ('svStackInfo', [SysViewEventParamSimple('tid', _decode_id), - SysViewEventParamSimple('base', _decode_u32), - SysViewEventParamSimple('sz', _decode_u32), - SysViewEventParamSimple('unused', _decode_u32)]), - SYSVIEW_EVTID_MODULEDESC: ('svModuleDesc', [SysViewEventParamSimple('mod_id', _decode_u32), - SysViewEventParamSimple('evt_off', _decode_u32), - SysViewEventParamSimple('desc', _decode_str)]), - SYSVIEW_EVTID_INIT: ('svInit', [SysViewEventParamSimple('sys_freq', _decode_u32), - SysViewEventParamSimple('cpu_freq', _decode_u32), - SysViewEventParamSimple('ram_base', _decode_u32), - SysViewEventParamSimple('id_shift', _decode_u32)]), - SYSVIEW_EVTID_DATA_SAMPLE: ('svDataSample', []), - SYSVIEW_EVTID_NAME_RESOURCE: ('svNameResource', [SysViewEventParamSimple('res_id', _decode_u32), - SysViewEventParamSimple('name', _decode_str)]), - SYSVIEW_EVTID_PRINT_FORMATTED: ('svPrint', [SysViewEventParamSimple('msg', _decode_str), - SysViewEventParamSimple('lvl', _decode_u32), - SysViewEventParamSimple('unused', _decode_u32)]), - SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]), + SYSVIEW_EVTID_TIMER_ENTER: ('svTimerEnter', [SysViewEventParamSimple('tim_id', _decode_u32)]), + SYSVIEW_EVTID_TIMER_EXIT: ('svTimerExit', []), + SYSVIEW_EVTID_STACK_INFO: ( + 'svStackInfo', + [ + SysViewEventParamSimple('tid', _decode_id), + SysViewEventParamSimple('base', _decode_u32), + SysViewEventParamSimple('sz', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32), + ], + ), + SYSVIEW_EVTID_MODULEDESC: ( + 'svModuleDesc', + [ + SysViewEventParamSimple('mod_id', _decode_u32), + SysViewEventParamSimple('evt_off', _decode_u32), + SysViewEventParamSimple('desc', _decode_str), + ], + ), + SYSVIEW_EVTID_INIT: ( + 'svInit', + [ + SysViewEventParamSimple('sys_freq', _decode_u32), + SysViewEventParamSimple('cpu_freq', _decode_u32), + SysViewEventParamSimple('ram_base', _decode_u32), + SysViewEventParamSimple('id_shift', _decode_u32), + ], + ), + SYSVIEW_EVTID_DATA_SAMPLE: ('svDataSample', []), + SYSVIEW_EVTID_NAME_RESOURCE: ( + 'svNameResource', + [SysViewEventParamSimple('res_id', _decode_u32), SysViewEventParamSimple('name', _decode_str)], + ), + SYSVIEW_EVTID_PRINT_FORMATTED: ( + 'svPrint', + [ + SysViewEventParamSimple('msg', _decode_str), + SysViewEventParamSimple('lvl', _decode_u32), + SysViewEventParamSimple('unused', _decode_u32), + ], + ), + SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]), } def __init__(self, evt_id, core_id, reader): """ - see SysViewEvent.__init__() + see SysViewEvent.__init__() """ SysViewEvent.__init__(self, evt_id, core_id, reader, self._predef_events_fmt) # self.name = 'SysViewPredefinedEvent' @@ -531,11 +576,12 @@ class SysViewPredefinedEvent(SysViewEvent): class SysViewOSEvent(SysViewEvent): """ - OS related SystemView events class. + OS related SystemView events class. """ + def __init__(self, evt_id, core_id, reader, events_fmt_map): """ - see SysViewEvent.__init__() + see SysViewEvent.__init__() """ SysViewEvent.__init__(self, evt_id, core_id, reader, events_fmt_map) # self.name = 'SysViewOSEvent' @@ -543,70 +589,79 @@ class SysViewOSEvent(SysViewEvent): class SysViewHeapEvent(SysViewEvent): """ - Heap related SystemView events class. + Heap related SystemView events class. - Attributes - ---------- - events_fmt : dict - see return value of _read_events_map() + Attributes + ---------- + events_fmt : dict + see return value of _read_events_map() """ + events_fmt = { - 0: ('esp_sysview_heap_trace_alloc', [SysViewEventParamSimple('addr', _decode_u32), - SysViewEventParamSimple('size', _decode_u32), - SysViewEventParamArray('callers', _decode_u32)]), - 1: ('esp_sysview_heap_trace_free', [SysViewEventParamSimple('addr', _decode_u32), - SysViewEventParamArray('callers', _decode_u32)]), + 0: ( + 'esp_sysview_heap_trace_alloc', + [ + SysViewEventParamSimple('addr', _decode_u32), + SysViewEventParamSimple('size', _decode_u32), + SysViewEventParamArray('callers', _decode_u32), + ], + ), + 1: ( + 'esp_sysview_heap_trace_free', + [SysViewEventParamSimple('addr', _decode_u32), SysViewEventParamArray('callers', _decode_u32)], + ), } def __init__(self, evt_id, core_id, events_off, reader): """ - Constructor. Reads and optionally decodes event. + Constructor. Reads and optionally decodes event. - Parameters - ---------- - evt_id : int - see SysViewEvent.__init__() - events_off : int - Offset for heap events IDs. Greater or equal to SYSVIEW_MODULE_EVENT_OFFSET. - reader : apptrace.Reader - see SysViewEvent.__init__() - core_id : int - see SysViewEvent.__init__() + Parameters + ---------- + evt_id : int + see SysViewEvent.__init__() + events_off : int + Offset for heap events IDs. Greater or equal to SYSVIEW_MODULE_EVENT_OFFSET. + reader : apptrace.Reader + see SysViewEvent.__init__() + core_id : int + see SysViewEvent.__init__() """ cur_events_map = {} - for id in self.events_fmt: - cur_events_map[events_off + id] = self.events_fmt[id] + for _id in self.events_fmt: + cur_events_map[events_off + _id] = self.events_fmt[_id] SysViewEvent.__init__(self, evt_id, core_id, reader, cur_events_map) # self.name = 'SysViewHeapEvent' class SysViewTraceDataParser(apptrace.TraceDataProcessor): """ - Base SystemView trace data parser class. + Base SystemView trace data parser class. - Attributes - ---------- - STREAMID_SYS : int - system events stream ID. Reserved for internal uses. - STREAMID_LOG : int - log events stream ID. - STREAMID_HEAP : int - heap events stream ID. + Attributes + ---------- + STREAMID_SYS : int + system events stream ID. Reserved for internal uses. + STREAMID_LOG : int + log events stream ID. + STREAMID_HEAP : int + heap events stream ID. """ + STREAMID_SYS = -1 STREAMID_LOG = 0 STREAMID_HEAP = 1 def __init__(self, print_events=False, core_id=0): """ - Constructor. + Constructor. - Parameters - ---------- - print_events : bool - see apptrace.TraceDataProcessor.__init__() - core_id : int - id of the core this parser object relates to. + Parameters + ---------- + print_events : bool + see apptrace.TraceDataProcessor.__init__() + core_id : int + id of the core this parser object relates to. """ apptrace.TraceDataProcessor.__init__(self, print_events=print_events, keep_all_events=True) self.sys_info = None @@ -614,62 +669,61 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor): self.irqs_info = {} self.tasks_info = {} self.core_id = core_id - self.esp_ext = False def _parse_irq_desc(self, desc): """ - Parses IRQ description. + Parses IRQ description. - Parameters - ---------- - desc : string - IRQ description string. + Parameters + ---------- + desc : string + IRQ description string. - Returns - ------- - tuple - a tuple with IRQ number and name or None on error. + Returns + ------- + tuple + a tuple with IRQ number and name or None on error. """ m = re.match('I#([0-9]+)=(.+)', desc) if m: - return m.group(2),m.group(1) + return m.group(2), m.group(1) return None def _update_ts(self, ts): """ - Calculates real event timestamp. + Calculates real event timestamp. - Parameters - ---------- - ts : int - Event timestamp offset. + Parameters + ---------- + ts : int + Event timestamp offset. - Returns - ------- - float - real event timestamp. + Returns + ------- + float + real event timestamp. """ self._last_ts += ts return float(self._last_ts) / self.sys_info.params['sys_freq'].value def read_extension_event(self, evt_id, core_id, reader): """ - Reads extension event. - Default implementation which just reads out event. + Reads extension event. + Default implementation which just reads out event. - Parameters - ---------- - evt_id : int - Event ID. - reader : apptrace.Reader - Trace reader object. + Parameters + ---------- + evt_id : int + Event ID. + reader : apptrace.Reader + Trace reader object. - Returns - ------- - SysViewEvent - if this is top level parser returns object for generic event, - otherwise returns None indicating to the calling top level parser - that extension event are not supported. + Returns + ------- + SysViewEvent + if this is top level parser returns object for generic event, + otherwise returns None indicating to the calling top level parser + that extension event are not supported. """ if self.root_proc == self: # by default just read out and skip unknown event @@ -683,44 +737,38 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor): high_b &= ~(1 << 6) else: core_id = 0 - return high_b,core_id + return high_b, core_id def read_event(self, reader, os_evt_map): """ - Reads pre-defined or OS-related event. + Reads pre-defined or OS-related event. - Parameters - ---------- - reader : apptrace.Reader - Trace reader object. - os_evt_map : dict - see return value of _read_events_map() + Parameters + ---------- + reader : apptrace.Reader + Trace reader object. + os_evt_map : dict + see return value of _read_events_map() - Returns - ------- - SysViewEvent - pre-defined, OS-related or extension event object. + Returns + ------- + SysViewEvent + pre-defined, OS-related or extension event object. """ - evt_hdr, = struct.unpack('= (self.events_off + self.events_num)) else True + return ( + False + if ( + self.events_off < SYSVIEW_MODULE_EVENT_OFFSET + or event.id < self.events_off + or event.id >= (self.events_off + self.events_num) + ) + else True + ) class SysViewMultiTraceDataParser(SysViewTraceDataParser): """ - SystemView trace data parser supporting multiple event streams. + SystemView trace data parser supporting multiple event streams. """ + def __init__(self, print_events=False, core_id=0): """ - see SysViewTraceDataParser.__init__() + see SysViewTraceDataParser.__init__() """ SysViewTraceDataParser.__init__(self, print_events, core_id) self.stream_parsers = {} def add_stream_parser(self, stream_id, parser): """ - Assigns parser for events stream. + Assigns parser for events stream. - Parameters - ---------- - stream_id : int - stream ID. See SysViewTraceDataParser.STREAMID_xxx. - Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. - Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. - parser : SysViewTraceDataParser - parser object. + Parameters + ---------- + stream_id : int + stream ID. See SysViewTraceDataParser.STREAMID_xxx. + Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. + Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. + parser : SysViewTraceDataParser + parser object. """ if stream_id == SysViewTraceDataParser.STREAMID_SYS: return @@ -814,20 +870,20 @@ class SysViewMultiTraceDataParser(SysViewTraceDataParser): def read_extension_event(self, evt_id, core_id, reader): """ - Reads extension event. - Iterates over registered stream parsers trying to find one which supports that type of event. + Reads extension event. + Iterates over registered stream parsers trying to find one which supports that type of event. - Parameters - ---------- - evt_id : int - see SysViewTraceDataParser.read_extension_event() - reader : apptrace.Reader - see SysViewTraceDataParser.read_extension_event() + Parameters + ---------- + evt_id : int + see SysViewTraceDataParser.read_extension_event() + reader : apptrace.Reader + see SysViewTraceDataParser.read_extension_event() - Returns - ------- - SysViewEvent - object for extension event, if extension event is not supported return SysViewEvent instance. + Returns + ------- + SysViewEvent + object for extension event, if extension event is not supported return SysViewEvent instance. """ for stream_id in self.stream_parsers: evt = self.stream_parsers[stream_id].read_extension_event(evt_id, core_id, reader) @@ -837,36 +893,37 @@ class SysViewMultiTraceDataParser(SysViewTraceDataParser): def on_new_event(self, event): """ - Iterates over registered stream parsers allowing them to do - essential processing of event. Must be called for every read event. + Iterates over registered stream parsers allowing them to do + essential processing of event. Must be called for every read event. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. """ SysViewTraceDataParser.on_new_event(self, event) for stream_id in self.stream_parsers: self.stream_parsers[stream_id].on_new_event(event) -class SysViewEventContext(): +class SysViewEventContext: """ - SystemView event context. + SystemView event context. """ + def __init__(self, handle, irq, name=''): """ - Constructor. + Constructor. - Parameters - ---------- - handle : int - handle of the context: task ID or IRQ number. - irq : bool - flag indicating whether this is IRQ or task context. - name : string - name of the context: task or IRQ name. Empty if context is unknown. - """ + Parameters + ---------- + handle : int + handle of the context: task ID or IRQ number. + irq : bool + flag indicating whether this is IRQ or task context. + name : string + name of the context: task or IRQ name. Empty if context is unknown. + """ self.handle = handle self.irq = irq self.name = name @@ -874,20 +931,21 @@ class SysViewEventContext(): class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): """ - Base SystemView trace data processor class. + Base SystemView trace data processor class. """ + def __init__(self, traces, root_proc=None, print_events=False, keep_all_events=False): """ - Constructor. + Constructor. - Parameters - ---------- - traces : list - list of parsers to process data from. - print_events : bool - see apptrace.TraceDataProcessor.__init__() - keep_all_events : bool - see apptrace.TraceDataProcessor.__init__() + Parameters + ---------- + traces : list + list of parsers to process data from. + print_events : bool + see apptrace.TraceDataProcessor.__init__() + keep_all_events : bool + see apptrace.TraceDataProcessor.__init__() """ apptrace.TraceDataProcessor.__init__(self, print_events, keep_all_events) self.event_ids = {} @@ -903,24 +961,25 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): # empty list means IDLE context or self.start_ctx self.ctx_stack[t.core_id] = [] # context is undefined, we do not know have we started the tracing in task/IDLE or IRQ context - # in general there are three scenarios when we can start tracing: when core is in task, IDLE task or IRQ context + # in general there are three scenarios when we can start tracing: + # when core is in task, IDLE task or IRQ context self.prev_ctx[t.core_id] = None def _get_curr_context(self, core_id): """ - Returns current context. + Returns current context. - Parameters - ---------- - core_id : int - core ID for requested context. + Parameters + ---------- + core_id : int + core ID for requested context. - Returns - ------- - SysViewEventContext - context object - None - if there current is undefined + Returns + ------- + SysViewEventContext + context object + None + if there current is undefined """ if len(self.root_proc.ctx_stack[core_id]): return self.root_proc.ctx_stack[core_id][-1] @@ -930,35 +989,35 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def _get_prev_context(self, core_id): """ - Returns current context. + Returns current context. - Parameters - ---------- - core_id : int - core ID for requested context. + Parameters + ---------- + core_id : int + core ID for requested context. - Returns - ------- - SysViewEventContext - context object + Returns + ------- + SysViewEventContext + context object """ return self.root_proc.prev_ctx[core_id] def get_trace_stream(self, core_id, stream_id): """ - Retrieves parser for specified stream and core. + Retrieves parser for specified stream and core. - Parameters - ---------- - core_id : int - Parser's core ID. - stream_id : int - Parser's stream ID. + Parameters + ---------- + core_id : int + Parser's core ID. + stream_id : int + Parser's stream ID. - Returns - ------- - SysViewTraceDataParser - parser object for specified stream and core + Returns + ------- + SysViewTraceDataParser + parser object for specified stream and core """ if self.root_proc == self: return self.traces[core_id] @@ -966,49 +1025,41 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def event_supported(self, e): """ - Should be overriden in child class. + Should be overridden in child class. """ return False def handle_event(self, e): """ - Should be overriden in child class. + Should be overridden in child class. """ pass def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ apptrace.TraceDataProcessor.print_report(self) def _process_event(self, event): """ - Processes event. - Keeps track of execution context on every core. + Processes event. + Keeps track of execution context on every core. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. - Raises - ---------- - SysViewTraceParseError - if there is no parser for event's core or - if SYSVIEW_EVTID_ISR_ENTER is received for unknown IRQ or - if SYSVIEW_EVTID_TASK_START_EXEC or SYSVIEW_EVTID_TASK_STOP_READY is received for unknown task. + Raises + ---------- + SysViewTraceParseError + if there is no parser for event's core or + if SYSVIEW_EVTID_ISR_ENTER is received for unknown IRQ or + if SYSVIEW_EVTID_TASK_START_EXEC or SYSVIEW_EVTID_TASK_STOP_READY is received for unknown task. """ if event.core_id not in self.traces: - if 0 in self.traces and self.traces[0].esp_ext: - # for Espressif extension there is one trace for all cores - trace = self.traces[0] - if event.core_id not in self.ctx_stack: - self.ctx_stack[event.core_id] = [] - if event.core_id not in self.prev_ctx: - self.prev_ctx[event.core_id] = None - else: - raise SysViewTraceParseError('Event for unknown core %d' % event.core_id) + raise SysViewTraceParseError('Event for unknown core %d' % event.core_id) else: trace = self.traces[event.core_id] if event.id == SYSVIEW_EVTID_ISR_ENTER: @@ -1017,16 +1068,20 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): if len(self.ctx_stack[event.core_id]): self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id][-1] else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_ENTER, so we have been in IDLE context + # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_ENTER, + # so we have been in IDLE context self.prev_ctx[event.core_id] = SysViewEventContext(None, False, 'IDLE%d' % event.core_id) # put new ISR context on top of the stack (the last in the list) - self.ctx_stack[event.core_id].append(SysViewEventContext(event.params['irq_num'].value, True, trace.irqs_info[event.params['irq_num'].value])) + self.ctx_stack[event.core_id].append( + SysViewEventContext(event.params['irq_num'].value, True, trace.irqs_info[event.params['irq_num'].value]) + ) elif event.id == SYSVIEW_EVTID_ISR_EXIT or event.id == SYSVIEW_EVTID_ISR_TO_SCHEDULER: if len(self.ctx_stack[event.core_id]): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id].pop() else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_EXIT, so we have been in ISR context, + # the 1st context switching event after trace start is SYSVIEW_EVTID_ISR_EXIT, + # so we have been in ISR context, # but we do not know which one because SYSVIEW_EVTID_ISR_EXIT do not include the IRQ number self.prev_ctx[event.core_id] = SysViewEventContext(None, True, 'IRQ_oncore%d' % event.core_id) elif event.id == SYSVIEW_EVTID_TASK_START_EXEC: @@ -1036,10 +1091,13 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id][-1] else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_START_EXEC, so we have been in IDLE context + # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_START_EXEC, + # so we have been in IDLE context self.prev_ctx[event.core_id] = SysViewEventContext(None, False, 'IDLE%d' % event.core_id) # only one task at a time in context stack (can be interrupted by a bunch of ISRs) - self.ctx_stack[event.core_id] = [SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value])] + self.ctx_stack[event.core_id] = [ + SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value]) + ] elif event.id == SYSVIEW_EVTID_TASK_STOP_EXEC: # delete task from context stack for ctx in self.ctx_stack[event.core_id]: @@ -1053,16 +1111,22 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): if event.params['tid'].value not in trace.tasks_info: raise SysViewTraceParseError('Stop ready unknown task 0x%x' % event.params['tid'].value) if len(self.ctx_stack[event.core_id]): - if (not self.ctx_stack[event.core_id][-1].irq and event.params['tid'].value == self.ctx_stack[event.core_id][-1].handle): + if ( + not self.ctx_stack[event.core_id][-1].irq + and event.params['tid'].value == self.ctx_stack[event.core_id][-1].handle + ): # return to the previous context (the last in the list) self.prev_ctx[event.core_id] = self.ctx_stack[event.core_id].pop() else: - # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_STOP_READY, so we have been in task context - self.prev_ctx[event.core_id] = SysViewEventContext(event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value]) + # the 1st context switching event after trace start is SYSVIEW_EVTID_TASK_STOP_READY, + # so we have been in task context + self.prev_ctx[event.core_id] = SysViewEventContext( + event.params['tid'].value, False, trace.tasks_info[event.params['tid'].value] + ) def on_new_event(self, event): """ - Processes heap events. + Processes heap events. """ if self.root_proc == self: SysViewTraceDataProcessor._process_event(self, event) @@ -1091,7 +1155,7 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): def merge_and_process(self): """ - Merges events from all registered parsers, sorts them by timestamp and processes them. + Merges events from all registered parsers, sorts them by timestamp and processes them. """ all_events = [] for t in self.traces.values(): @@ -1103,27 +1167,28 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor): class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): """ - SystemView trace data processor supporting multiple event streams. + SystemView trace data processor supporting multiple event streams. """ + def __init__(self, traces, print_events=False, keep_all_events=False): """ - see SysViewTraceDataProcessor.__init__() + see SysViewTraceDataProcessor.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, print_events=print_events, keep_all_events=keep_all_events) self.stream_procs = {} def add_stream_processor(self, stream_id, proc): """ - Assigns processor for events stream. + Assigns processor for events stream. - Parameters - ---------- - stream_id : int - stream ID. See SysViewTraceDataParser.STREAMID_xxx. - Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. - Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. - proc : SysViewTraceDataProcessor - processor object. + Parameters + ---------- + stream_id : int + stream ID. See SysViewTraceDataParser.STREAMID_xxx. + Parsers for SysViewTraceDataParser.STREAMID_SYS are ignored. + Top level parser is the default for SysViewTraceDataParser.STREAMID_SYS. + proc : SysViewTraceDataProcessor + processor object. """ if stream_id == SysViewTraceDataParser.STREAMID_SYS: return @@ -1132,25 +1197,21 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def get_trace_stream(self, core_id, stream_id): """ - Retrieves parser for specified stream and core. + Retrieves parser for specified stream and core. - Parameters - ---------- - core_id : int - Parser's core ID. - stream_id : int - Parser's stream ID. + Parameters + ---------- + core_id : int + Parser's core ID. + stream_id : int + Parser's stream ID. - Returns - ------- - SysViewTraceDataParser - parser object for specified stream and core + Returns + ------- + SysViewTraceDataParser + parser object for specified stream and core """ - if core_id not in self.traces and 0 in self.traces and self.traces[0].esp_ext: - # for Espressif extension there is one trace for all cores - trace = self.traces[0] - else: - trace = self.traces[core_id] + trace = self.traces[core_id] if stream_id == SysViewTraceDataParser.STREAMID_SYS: return trace if isinstance(trace, SysViewMultiTraceDataParser): @@ -1159,7 +1220,7 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def print_report(self): """ - Iterates over registered stream processors and prints their reports. + Iterates over registered stream processors and prints their reports. """ SysViewTraceDataProcessor.print_report(self) # need to sort stream procs by keys to print reports in the same order regardless of Python version @@ -1170,7 +1231,7 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def cleanup(self): """ - Iterates over registered stream processors and cleans them up. + Iterates over registered stream processors and cleans them up. """ for stream_id in self.stream_procs: self.stream_procs[stream_id].cleanup() @@ -1178,13 +1239,13 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor): def on_new_event(self, event): """ - Iterates over registered stream processors allowing them to do - the processing of event. + Iterates over registered stream processors allowing them to do + the processing of event. - Parameters - ---------- - event : SysViewEvent - Event object. + Parameters + ---------- + event : SysViewEvent + Event object. """ SysViewTraceDataProcessor.on_new_event(self, event) for stream_id in self.stream_procs: @@ -1222,11 +1283,26 @@ class SysViewTraceDataJsonEncoder(json.JSONEncoder): callers = [] for addr in obj.params['callers'].value: callers.append('0x{:x}'.format(addr)) - return {'ctx_name': obj.ctx_name, 'in_irq': obj.in_irq, 'id': obj.id, 'core_id': obj.core_id, - 'ts': obj.ts, 'addr': blk_addr, 'size': blk_size, 'callers': callers} + return { + 'ctx_name': obj.ctx_name, + 'in_irq': obj.in_irq, + 'id': obj.id, + 'core_id': obj.core_id, + 'ts': obj.ts, + 'addr': blk_addr, + 'size': blk_size, + 'callers': callers, + } if isinstance(obj, SysViewPredefinedEvent) and obj.id == SYSVIEW_EVTID_PRINT_FORMATTED: - return {'ctx_name': obj.ctx_name, 'in_irq': obj.in_irq, 'id': obj.id, 'core_id': obj.core_id, - 'ts': obj.ts, 'msg': obj.params['msg'].value, 'lvl': obj.params['lvl'].value} + return { + 'ctx_name': obj.ctx_name, + 'in_irq': obj.in_irq, + 'id': obj.id, + 'core_id': obj.core_id, + 'ts': obj.ts, + 'msg': obj.params['msg'].value, + 'lvl': obj.params['lvl'].value, + } if isinstance(obj, SysViewEvent): jobj = obj.to_jsonable() # remove unused fields @@ -1241,44 +1317,56 @@ class SysViewTraceDataJsonEncoder(json.JSONEncoder): class SysViewHeapTraceDataParser(SysViewTraceDataExtEventParser): """ - SystemView trace data parser supporting heap events. + SystemView trace data parser supporting heap events. """ + def __init__(self, print_events=False, core_id=0): """ - SystemView trace data parser supporting multiple event streams. - see SysViewTraceDataExtEventParser.__init__() + SystemView trace data parser supporting multiple event streams. + see SysViewTraceDataExtEventParser.__init__() """ - SysViewTraceDataExtEventParser.__init__(self, events_num=len(SysViewHeapEvent.events_fmt.keys()), core_id=core_id, print_events=print_events) + SysViewTraceDataExtEventParser.__init__( + self, events_num=len(SysViewHeapEvent.events_fmt.keys()), core_id=core_id, print_events=print_events + ) def read_extension_event(self, evt_id, core_id, reader): """ - Reads heap event. - see SysViewTraceDataParser.read_extension_event() + Reads heap event. + see SysViewTraceDataParser.read_extension_event() """ - if (self.events_off >= SYSVIEW_MODULE_EVENT_OFFSET and evt_id >= self.events_off and - evt_id < self.events_off + self.events_num): + if ( + self.events_off >= SYSVIEW_MODULE_EVENT_OFFSET + and evt_id >= self.events_off + and evt_id < self.events_off + self.events_num + ): return SysViewHeapEvent(evt_id, core_id, self.events_off, reader) return SysViewTraceDataParser.read_extension_event(self, evt_id, core_id, reader) def on_new_event(self, event): """ - Keeps track of heap module descriptions. + Keeps track of heap module descriptions. """ if self.root_proc == self: SysViewTraceDataParser.on_new_event(self, event) - if event.id == SYSVIEW_EVTID_MODULEDESC and event.params['desc'].value == 'M=ESP32 SystemView Heap Tracing Module': + if ( + event.id == SYSVIEW_EVTID_MODULEDESC + and event.params['desc'].value == 'M=ESP32 SystemView Heap Tracing Module' + ): self.events_off = event.params['evt_off'].value class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeapTraceDataProcessorImpl): """ - SystemView trace data processor supporting heap events. + SystemView trace data processor supporting heap events. """ - def __init__(self, toolchain_pref, elf_path, root_proc=None, traces=[], print_events=False, print_heap_events=False): + + def __init__( + self, toolchain_pref, elf_path, root_proc=None, traces=[], print_events=False, print_heap_events=False + ): """ - Constructor. - see SysViewTraceDataProcessor.__init__() - see apptrace.BaseHeapTraceDataProcessorImpl.__init__() + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseHeapTraceDataProcessorImpl.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, root_proc=root_proc, print_events=print_events) apptrace.BaseHeapTraceDataProcessorImpl.__init__(self, print_heap_events) @@ -1296,16 +1384,14 @@ class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeap def handle_event(self, event): heap_stream = self.root_proc.get_trace_stream(event.core_id, SysViewTraceDataParser.STREAMID_HEAP) if (event.id - heap_stream.events_off) == 0: - heap_event = apptrace.HeapTraceEvent(event, True, toolchain=self.toolchain, - elf_path=self.elf_path) + heap_event = apptrace.HeapTraceEvent(event, True, toolchain=self.toolchain, elf_path=self.elf_path) else: - heap_event = apptrace.HeapTraceEvent(event, False, toolchain=self.toolchain, - elf_path=self.elf_path) + heap_event = apptrace.HeapTraceEvent(event, False, toolchain=self.toolchain, elf_path=self.elf_path) apptrace.BaseHeapTraceDataProcessorImpl.on_new_event(self, heap_event) def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ if self.root_proc == self: SysViewTraceDataProcessor.print_report(self) @@ -1314,42 +1400,44 @@ class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeap class SysViewLogTraceEvent(apptrace.LogTraceEvent): """ - SystemView log event. + SystemView log event. """ + def __init__(self, ts, msg): """ - Constructor. + Constructor. - Parameters - ---------- - msg : string - Log message string. + Parameters + ---------- + msg : string + Log message string. """ self.msg = msg self.ts = ts def get_message(self, unused): """ - Retrieves log message. + Retrieves log message. - Returns - ------- - string - formatted log message + Returns + ------- + string + formatted log message """ return '[{:.9f}] LOG: {}'.format(self.ts, self.msg) class SysViewLogTraceDataParser(SysViewTraceDataParser): """ - SystemView trace data parser supporting log events. + SystemView trace data parser supporting log events. """ + def event_supported(self, event): return event.id == SYSVIEW_EVTID_PRINT_FORMATTED def on_new_event(self, event): """ - see SysViewTraceDataParser.on_new_event() + see SysViewTraceDataParser.on_new_event() """ if self.root_proc == self: SysViewTraceDataParser.on_new_event(self, event) @@ -1357,13 +1445,14 @@ class SysViewLogTraceDataParser(SysViewTraceDataParser): class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTraceDataProcessorImpl): """ - SystemView trace data processor supporting heap events. + SystemView trace data processor supporting heap events. """ + def __init__(self, traces=[], root_proc=None, print_events=False, print_log_events=False): """ - Constructor. - see SysViewTraceDataProcessor.__init__() - see apptrace.BaseLogTraceDataProcessorImpl.__init__() + Constructor. + see SysViewTraceDataProcessor.__init__() + see apptrace.BaseLogTraceDataProcessorImpl.__init__() """ SysViewTraceDataProcessor.__init__(self, traces, root_proc=root_proc, print_events=print_events) apptrace.BaseLogTraceDataProcessorImpl.__init__(self, print_log_events) @@ -1375,7 +1464,7 @@ class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTr def on_new_event(self, event): """ - Processes log events. + Processes log events. """ if self.root_proc == self: SysViewTraceDataProcessor.on_new_event(self, event) @@ -1385,7 +1474,7 @@ class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTr def print_report(self): """ - see apptrace.TraceDataProcessor.print_report() + see apptrace.TraceDataProcessor.print_report() """ if self.root_proc == self: SysViewTraceDataProcessor.print_report(self) diff --git a/tools/esp_app_trace/sysviewtrace_proc.py b/tools/esp_app_trace/sysviewtrace_proc.py index 474438b5d3..7a03653f87 100755 --- a/tools/esp_app_trace/sysviewtrace_proc.py +++ b/tools/esp_app_trace/sysviewtrace_proc.py @@ -7,7 +7,6 @@ # Trace data can be provided in multiple trace files (one per CPU). After processing phase # script prints report for every type of trace data stream which was found. # - import argparse import json import logging @@ -50,16 +49,13 @@ def split_segger_multicore_file(file_path): header = f.read(200) header_str = header.decode('utf-8', errors='ignore') - core0_offset = None core1_offset = None for line in header_str.split('\n'): - if '; Offset Core0' in line: - core0_offset = int(line.strip().split()[-1]) - elif '; Offset Core1' in line: + if '; Offset Core1' in line: core1_offset = int(line.strip().split()[-1]) - if core0_offset is None or core1_offset is None: - logging.error('Failed to parse core offsets') + if core1_offset is None: + logging.error('Failed to parse core1 offset') return None, None # Read the entire file @@ -258,12 +254,11 @@ def main(): proc.print_report() proc.cleanup() - if len(temp_files) > 0: - for file in temp_files: - try: - os.remove(file) - except Exception as e: - logging.warning('Failed to remove temporary file %s: %s', file, e) + for file in temp_files: + try: + os.remove(file) + except Exception as e: + logging.warning('Failed to remove temporary file %s: %s', file, e) if __name__ == '__main__':