mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-02 12:14:32 +02:00
change(sysview): drop ESP mcore extension
This commit is contained in:
@@ -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('<B', reader.read(1))
|
||||
(b,) = struct.unpack('<B', reader.read(1))
|
||||
if b & 0x80:
|
||||
val |= (b & 0x7F) << (7 * sz)
|
||||
else:
|
||||
val |= b << (7 * sz)
|
||||
break
|
||||
sz += 1
|
||||
return (sz + 1,val)
|
||||
return (sz + 1, val)
|
||||
|
||||
|
||||
def _decode_id(reader):
|
||||
@@ -240,10 +240,10 @@ def _decode_u64(reader):
|
||||
tuple
|
||||
a tuple containg number of read bytes and decoded value.
|
||||
"""
|
||||
sz,val = _decode_u32(reader)
|
||||
sz2,high = _decode_u32(reader)
|
||||
sz, val = _decode_u32(reader)
|
||||
sz2, high = _decode_u32(reader)
|
||||
sz += sz2
|
||||
return sz,(val | (high << 32))
|
||||
return sz, (val | (high << 32))
|
||||
|
||||
|
||||
def _decode_str(reader):
|
||||
@@ -262,15 +262,15 @@ def _decode_str(reader):
|
||||
"""
|
||||
sz = 0
|
||||
val = ''
|
||||
sz, = struct.unpack('<B', reader.read(1))
|
||||
(sz,) = struct.unpack('<B', reader.read(1))
|
||||
if sz == 0xFF:
|
||||
buf = struct.unpack('<2B', reader.read(2))
|
||||
sz = (buf[0] << 8) | buf[1]
|
||||
val, = struct.unpack('<%ds' % sz, reader.read(sz))
|
||||
(val,) = struct.unpack('<%ds' % sz, reader.read(sz))
|
||||
val = val.decode('utf-8')
|
||||
if sz < 0xFF:
|
||||
return (sz + 1,val) # one extra byte for length
|
||||
return (sz + 3,val) # 3 extra bytes for length
|
||||
return (sz + 1, val) # one extra byte for length
|
||||
return (sz + 3, val) # 3 extra bytes for length
|
||||
|
||||
|
||||
def _decode_plen(reader):
|
||||
@@ -288,9 +288,9 @@ def _decode_plen(reader):
|
||||
decoded value.
|
||||
"""
|
||||
plen = 0
|
||||
b0, = struct.unpack('<B', reader.read(1))
|
||||
(b0,) = struct.unpack('<B', reader.read(1))
|
||||
if b0 & 0x80:
|
||||
b1, = struct.unpack('<B', reader.read(1))
|
||||
(b1,) = struct.unpack('<B', reader.read(1))
|
||||
plen = b1 # higher part
|
||||
plen = (plen << 7) | (b0 & ~0x80) # lower 7 bits
|
||||
else:
|
||||
@@ -302,6 +302,7 @@ class SysViewTraceParseError(apptrace.ParseError):
|
||||
"""
|
||||
SystemView parse error exception.
|
||||
"""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
@@ -309,6 +310,7 @@ class SysViewEvent(apptrace.TraceEvent):
|
||||
"""
|
||||
Generic SystemView event class. This is a base class for all events.
|
||||
"""
|
||||
|
||||
def __init__(self, evt_id, core_id, reader, events_fmt_map=None):
|
||||
"""
|
||||
Constructor. Reads and optionally decodes event.
|
||||
@@ -332,7 +334,7 @@ class SysViewEvent(apptrace.TraceEvent):
|
||||
self._read_payload(reader, events_fmt_map)
|
||||
else:
|
||||
reader.forward(self.plen)
|
||||
_,self.ts = _decode_u32(reader)
|
||||
_, self.ts = _decode_u32(reader)
|
||||
|
||||
def _read_payload(self, reader, events_fmt_map):
|
||||
"""
|
||||
@@ -359,15 +361,23 @@ class SysViewEvent(apptrace.TraceEvent):
|
||||
event_param = copy.deepcopy(evt_params_templates[i])
|
||||
try:
|
||||
cur_pos = reader.get_pos()
|
||||
sz,param_val = event_param.decode(reader, self.plen - params_len)
|
||||
sz, param_val = event_param.decode(reader, self.plen - params_len)
|
||||
except Exception as e:
|
||||
raise SysViewTraceParseError('Failed to decode event {}({:d}) {:d} param @ 0x{:x}! {}'.format(self.name, self.id, self.plen, cur_pos, e))
|
||||
raise SysViewTraceParseError(
|
||||
'Failed to decode event {}({:d}) {:d} param @ 0x{:x}! {}'.format(
|
||||
self.name, self.id, self.plen, cur_pos, e
|
||||
)
|
||||
)
|
||||
event_param.idx = i
|
||||
event_param.value = param_val
|
||||
self.params[event_param.name] = event_param
|
||||
params_len += sz
|
||||
if self.id >= 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,13 +385,16 @@ 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.
|
||||
"""
|
||||
|
||||
def __init__(self, name, decode_func):
|
||||
"""
|
||||
Constructor.
|
||||
@@ -413,7 +426,7 @@ class SysViewEventParam:
|
||||
Returns
|
||||
-------
|
||||
tuple
|
||||
a tuple containg number of read bytes and decoded value.
|
||||
a tuple containing number of read bytes and decoded value.
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -428,6 +441,7 @@ class SysViewEventParamSimple(SysViewEventParam):
|
||||
"""
|
||||
Simple SystemView event's parameter class.
|
||||
"""
|
||||
|
||||
def decode(self, reader, max_sz):
|
||||
"""
|
||||
see SysViewEventParam.decode()
|
||||
@@ -439,6 +453,7 @@ class SysViewEventParamArray(SysViewEventParamSimple):
|
||||
"""
|
||||
Array SystemView event's parameter class.
|
||||
"""
|
||||
|
||||
def __init__(self, name, decode_func, size=-1):
|
||||
"""
|
||||
Constructor.
|
||||
@@ -463,19 +478,20 @@ class SysViewEventParamArray(SysViewEventParamSimple):
|
||||
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.
|
||||
"""
|
||||
|
||||
_predef_events_fmt = {
|
||||
SYSVIEW_EVTID_NOP: ('svNop', []),
|
||||
SYSVIEW_EVTID_OVERFLOW: ('svOverflow', [SysViewEventParamSimple('drop_cnt', _decode_u32)]),
|
||||
@@ -484,12 +500,19 @@ class SysViewPredefinedEvent(SysViewEvent):
|
||||
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_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),
|
||||
SYSVIEW_EVTID_TASK_INFO: (
|
||||
'svTaskInfo',
|
||||
[
|
||||
SysViewEventParamSimple('tid', _decode_id),
|
||||
SysViewEventParamSimple('prio', _decode_u32),
|
||||
SysViewEventParamSimple('name', _decode_str)]),
|
||||
SysViewEventParamSimple('name', _decode_str),
|
||||
],
|
||||
),
|
||||
SYSVIEW_EVTID_TRACE_START: ('svTraceStart', []),
|
||||
SYSVIEW_EVTID_TRACE_STOP: ('svTraceStop', []),
|
||||
SYSVIEW_EVTID_SYSTIME_CYCLES: ('svSysTimeCycles', [SysViewEventParamSimple('cycles', _decode_u32)]),
|
||||
@@ -501,23 +524,45 @@ class SysViewPredefinedEvent(SysViewEvent):
|
||||
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),
|
||||
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('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('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)]),
|
||||
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),
|
||||
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)]),
|
||||
SysViewEventParamSimple('unused', _decode_u32),
|
||||
],
|
||||
),
|
||||
SYSVIEW_EVTID_NUMMODULES: ('svNumModules', [SysViewEventParamSimple('mod_cnt', _decode_u32)]),
|
||||
}
|
||||
|
||||
@@ -533,6 +578,7 @@ class SysViewOSEvent(SysViewEvent):
|
||||
"""
|
||||
OS related SystemView events class.
|
||||
"""
|
||||
|
||||
def __init__(self, evt_id, core_id, reader, events_fmt_map):
|
||||
"""
|
||||
see SysViewEvent.__init__()
|
||||
@@ -550,12 +596,20 @@ class SysViewHeapEvent(SysViewEvent):
|
||||
events_fmt : dict
|
||||
see return value of _read_events_map()
|
||||
"""
|
||||
|
||||
events_fmt = {
|
||||
0: ('esp_sysview_heap_trace_alloc', [SysViewEventParamSimple('addr', _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)]),
|
||||
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):
|
||||
@@ -574,8 +628,8 @@ class SysViewHeapEvent(SysViewEvent):
|
||||
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'
|
||||
|
||||
@@ -593,6 +647,7 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor):
|
||||
STREAMID_HEAP : int
|
||||
heap events stream ID.
|
||||
"""
|
||||
|
||||
STREAMID_SYS = -1
|
||||
STREAMID_LOG = 0
|
||||
STREAMID_HEAP = 1
|
||||
@@ -614,7 +669,6 @@ 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):
|
||||
"""
|
||||
@@ -632,7 +686,7 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor):
|
||||
"""
|
||||
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):
|
||||
@@ -683,7 +737,7 @@ 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):
|
||||
"""
|
||||
@@ -701,24 +755,18 @@ class SysViewTraceDataParser(apptrace.TraceDataProcessor):
|
||||
SysViewEvent
|
||||
pre-defined, OS-related or extension event object.
|
||||
"""
|
||||
evt_hdr, = struct.unpack('<B', reader.read(1))
|
||||
(evt_hdr,) = struct.unpack('<B', reader.read(1))
|
||||
# read ID and core num
|
||||
evt_id = 0
|
||||
if evt_hdr & 0x80:
|
||||
# evt_id (2 bytes)
|
||||
b, = struct.unpack('<B', reader.read(1))
|
||||
(b,) = struct.unpack('<B', reader.read(1))
|
||||
# higher part
|
||||
if self.esp_ext:
|
||||
evt_id,core_id = self._decode_core_id(b)
|
||||
else:
|
||||
evt_id = b
|
||||
core_id = self.core_id
|
||||
evt_id = (evt_id << 7) | (evt_hdr & ~0x80) # lower 7 bits
|
||||
else:
|
||||
# evt_id (1 byte)
|
||||
if self.esp_ext:
|
||||
evt_id,core_id = self._decode_core_id(evt_hdr)
|
||||
else:
|
||||
evt_id = evt_hdr
|
||||
core_id = self.core_id
|
||||
if evt_id <= SYSVIEW_EVENT_ID_PREDEF_MAX:
|
||||
@@ -779,14 +827,22 @@ class SysViewTraceDataExtEventParser(SysViewTraceDataParser):
|
||||
self.events_num = events_num
|
||||
|
||||
def event_supported(self, event):
|
||||
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
|
||||
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.
|
||||
"""
|
||||
|
||||
def __init__(self, print_events=False, core_id=0):
|
||||
"""
|
||||
see SysViewTraceDataParser.__init__()
|
||||
@@ -850,10 +906,11 @@ class SysViewMultiTraceDataParser(SysViewTraceDataParser):
|
||||
self.stream_parsers[stream_id].on_new_event(event)
|
||||
|
||||
|
||||
class SysViewEventContext():
|
||||
class SysViewEventContext:
|
||||
"""
|
||||
SystemView event context.
|
||||
"""
|
||||
|
||||
def __init__(self, handle, irq, name=''):
|
||||
"""
|
||||
Constructor.
|
||||
@@ -876,6 +933,7 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor):
|
||||
"""
|
||||
Base SystemView trace data processor class.
|
||||
"""
|
||||
|
||||
def __init__(self, traces, root_proc=None, print_events=False, keep_all_events=False):
|
||||
"""
|
||||
Constructor.
|
||||
@@ -903,7 +961,8 @@ 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):
|
||||
@@ -966,13 +1025,13 @@ 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
|
||||
|
||||
@@ -1000,14 +1059,6 @@ class SysViewTraceDataProcessor(apptrace.TraceDataProcessor):
|
||||
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)
|
||||
else:
|
||||
trace = self.traces[event.core_id]
|
||||
@@ -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,12 +1111,18 @@ 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):
|
||||
"""
|
||||
@@ -1105,6 +1169,7 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor):
|
||||
"""
|
||||
SystemView trace data processor supporting multiple event streams.
|
||||
"""
|
||||
|
||||
def __init__(self, traces, print_events=False, keep_all_events=False):
|
||||
"""
|
||||
see SysViewTraceDataProcessor.__init__()
|
||||
@@ -1146,10 +1211,6 @@ class SysViewMultiStreamTraceDataProcessor(SysViewTraceDataProcessor):
|
||||
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]
|
||||
if stream_id == SysViewTraceDataParser.STREAMID_SYS:
|
||||
return trace
|
||||
@@ -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
|
||||
@@ -1243,20 +1319,26 @@ class SysViewHeapTraceDataParser(SysViewTraceDataExtEventParser):
|
||||
"""
|
||||
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__()
|
||||
"""
|
||||
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()
|
||||
"""
|
||||
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)
|
||||
|
||||
@@ -1266,7 +1348,10 @@ class SysViewHeapTraceDataParser(SysViewTraceDataExtEventParser):
|
||||
"""
|
||||
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
|
||||
|
||||
|
||||
@@ -1274,7 +1359,10 @@ class SysViewHeapTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseHeap
|
||||
"""
|
||||
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__()
|
||||
@@ -1296,11 +1384,9 @@ 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):
|
||||
@@ -1316,6 +1402,7 @@ class SysViewLogTraceEvent(apptrace.LogTraceEvent):
|
||||
"""
|
||||
SystemView log event.
|
||||
"""
|
||||
|
||||
def __init__(self, ts, msg):
|
||||
"""
|
||||
Constructor.
|
||||
@@ -1344,6 +1431,7 @@ class SysViewLogTraceDataParser(SysViewTraceDataParser):
|
||||
"""
|
||||
SystemView trace data parser supporting log events.
|
||||
"""
|
||||
|
||||
def event_supported(self, event):
|
||||
return event.id == SYSVIEW_EVTID_PRINT_FORMATTED
|
||||
|
||||
@@ -1359,6 +1447,7 @@ class SysViewLogTraceDataProcessor(SysViewTraceDataProcessor, apptrace.BaseLogTr
|
||||
"""
|
||||
SystemView trace data processor supporting heap events.
|
||||
"""
|
||||
|
||||
def __init__(self, traces=[], root_proc=None, print_events=False, print_log_events=False):
|
||||
"""
|
||||
Constructor.
|
||||
|
@@ -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,7 +254,6 @@ def main():
|
||||
proc.print_report()
|
||||
proc.cleanup()
|
||||
|
||||
if len(temp_files) > 0:
|
||||
for file in temp_files:
|
||||
try:
|
||||
os.remove(file)
|
||||
|
Reference in New Issue
Block a user