winIDEA SDK
Loading...
Searching...
No Matches
trace_controller.py
1# This script is licensed under BSD License, see file LICENSE.txt, or search for `License` in the SDK online help.
2#
3# (c) TASKING Germany GmbH, 2023
4
5"""
6This script demonstrates usage of trace with isystem.connect API.
7"""
8
9from __future__ import print_function
10
11import os
12import time
13import isystem.connect as ic
14
15
16def initTarget(cmgr):
17
18 debugCtrl = ic.CDebugFacade(cmgr)
19
20 debugCtrl.download()
21 debugCtrl.runUntilFunction("main")
22 debugCtrl.waitUntilStopped()
23
24 return debugCtrl
25
26
27def recordTrace(debugCtrl, traceDoc):
28
29 # We could use existing predefined trigger, but
30 # let's try to create a new one. First we have to make sure, that
31 # the trigger does not already exist.
32 traceDoc.removeTrigger('testTraceTrigger')
33 triggerIdx = traceDoc.createTrigger('testTraceTrigger')
34
35 # make the created trigger the active one
36 traceDoc.select(triggerIdx)
37
38 # configure trace with wizard
39 traceCfgWizard = ic.CTraceConfigWizard.createCodeExecTrigger('test_fibonacci')
40
41 # Uncomment the following line to set a data access trigger
42 # traceCfgWizard = ic.CTraceConfigWizard.createDataAccessTrigger('main_loop_counter',
43 # True, '',
44 # ic.CTraceConfigWizard.EWrite)
45
46 # Uncomment the following line to set AUX state trigger
47 #traceCfgWizard = ic.CTraceConfigWizard.createAUXStateTrigger(0xfe, 0x5a)
48
49 traceDoc.applyTriggerWizard(traceCfgWizard, triggerIdx)
50
51 # decrease the default buffer size. 1 Mb is enough for demo.
52 traceDoc.setTriggerOption(triggerIdx, 'HW.Recorder.BufferSize', '1 MB')
53
54 print('Target is running, trace_doc is recording data...')
55 traceDoc.start()
56 debugCtrl.run()
57 time.sleep(1)
58 debugCtrl.stop()
59
60 print('Target stopped, loading trace data...')
61 traceDoc.waitUntilLoaded()
62
63
64def recordTraceAdvanced(debugCtrl, traceDoc):
65 traceDoc.removeTrigger('testTraceTrigger')
66 triggerIdx = traceDoc.createTrigger('testTraceTrigger')
67 traceDoc.select(triggerIdx)
68
69 # configure trace with wizard
70 traceCfgWizard = ic.CTraceConfigWizard.createImmediateTrigger()
71 traceCfgWizard.setRecordingContent(ic.CTraceConfigWizard.ERecordProgramFlow,
72 'test_fibonacci',
73 'test_fibonacci',
74 ic.CTraceConfigWizard.EReadWrite)
75
76 traceDoc.applyTriggerWizard(traceCfgWizard, triggerIdx)
77
78 # decrease the default buffer size. 1 Mb is enough for demo.
79 traceDoc.setTriggerOption(triggerIdx, 'HW.Recorder.BufferSize', '1 MB')
80
81 print('Target is running, trace_doc is recording data...')
82 traceDoc.start()
83 debugCtrl.run()
84 time.sleep(3)
85 debugCtrl.stop()
86
87 print('Target stopped, loading trace data...')
88 traceDoc.waitUntilLoaded()
89
90
91def exportTrace(traceDoc):
92
93 exportCfg = ic.CTraceExportConfig()
94 print(exportCfg.toString())
95
96 print('-------------------------\nWriting export file in XML format with default settings:\n')
97 formatter = ic.CTraceXMLExportFormat()
98 exportCfg.setFileName('traceSample-default.xml') \
99 .setFormatter(formatter)
100 traceDoc.exportData(exportCfg)
101
102 print('-------------------------\nWriting export file in binary format with full contents:\n')
103 formatter = ic.CTraceBinExportFormat()
104 # It is highly recommended to use header version 2, because
105 # this way file format is described in the header.
106 formatter.setTraceItemFlags(0) # resets all trace item flags
107 formatter.setHeader(True) \
108 .setHeaderVersion(ic.CTraceBinExportFormat.EHeaderVer2) \
109 .addTraceItem(ic.CTraceBinExportFormat.EPresenceFlagsItem) \
110 .addTraceItem(ic.CTraceBinExportFormat.EDataItem) \
111 .addTraceItem(ic.CTraceBinExportFormat.EAddressItem) \
112 .addTraceItem(ic.CTraceBinExportFormat.EMemAreaItem) \
113 .addTraceItem(ic.CTraceBinExportFormat.ETimeStampItem) \
114 .addTraceItem(ic.CTraceBinExportFormat.ETraceSourceIdItem) \
115 .addTraceItem(ic.CTraceBinExportFormat.EBusStatusItem) \
116 .addTraceItem(ic.CTraceBinExportFormat.ESampleIndexItem) \
117 .addTraceItem(ic.CTraceBinExportFormat.EOCDItem) \
118 .addTraceItem(ic.CTraceBinExportFormat.EAUXItem)
119
120 exportCfg.setFileName('traceSample-full.bin') \
121 .setFormatter(formatter)
122
123 startTime = time.time()
124 traceDoc.exportData(exportCfg)
125 print('t[s] = ', time.time() - startTime, ' ', exportCfg.getFileName())
126
127 print('-------------------------\nWriting export file in XML format with '
128 + 'customized settings (same info as bin export):\n')
129 formatter = ic.CTraceXMLExportFormat()
130 formatter.setIndex(True) \
131 .setTime(True) \
132 .setTraceSourceId(True) \
133 .setAddress(True) \
134 .setMemArea(True) \
135 .setData(True) \
136 .setDasm(True) \
137 .setDasmData(False) \
138 .setDasmAddress(False) \
139 .setFunction(False) \
140 .setLabel(False) \
141 .setActivity(False) \
142 .setBusStatus(False)
143
144 exportCfg.setFileName('traceSample-customized.xml') \
145 .setFormatter(formatter)
146
147 startTime = time.time()
148 traceDoc.exportData(exportCfg)
149 print('t[s] = ', time.time() - startTime, ' ', exportCfg.getFileName())
150
151
152def parse(trace_doc: ic.CTraceController):
153 # export and print trace binary data
154 binTraceData = ic.CTraceData.createInstance(trace_doc,
155 'traceSample-full.bin',
156 -12000, -11000,
157 True)
158
159 warnings = binTraceData.getParserWarnings()
160 if warnings:
161 print('WARNING(S) (bin): ', warnings)
162
163 binExportFromFile = binTraceData.getBinaryExportConfig()
164 print('header version: ', binExportFromFile.getHeaderVersionAsStr())
165 print('is data: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EDataItem))
166 print('is address: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EAddressItem))
167 print('is mem area: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EMemAreaItem))
168 print('is time: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ETimeStampItem))
169 print('is source ID: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ETraceSourceIdItem))
170 print('is bus status: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EBusStatusItem))
171 print('is index: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ESampleIndexItem))
172 print('is OCD: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EOCDItem))
173 print('is AUX: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EAUXItem))
174
175
176 binIter = binTraceData.getTimelineIterator()
177
178 print("Binary export:")
179 while binIter.hasNext():
180 binEvent = binIter.next()
181 print(binEvent.toString(), '\n')
182
183 binTraceData.closeParser()
184
185 # export and print XML trace data
186 print("\n\n\n---------------------------------------------------\n\nXML export:\n")
187
188 xmlTraceData = ic.CTraceData.createInstance(trace_doc,
189 'traceSample-default.xml',
190 11000, 12000,
191 False)
192
193 warnings = xmlTraceData.getParserWarnings()
194 if warnings:
195 print('WARNING(S) (bin): ', warnings)
196
197
198 xmlIter = xmlTraceData.getTimelineIterator()
199 while xmlIter.hasNext():
200 xmlEvent = xmlIter.next()
201 print(xmlEvent.toString(), '\n')
202
203 xmlTraceData.closeParser()
204
205
206def printStatus(doc):
207 status = doc.getStatus()
208
209 print('Status after tracing:')
210 print('Was there an error?', status.isErrorInBuffer())
211 print('Was there a buffer overrun?', status.isBufferOverrun())
212 print('Was there a recording error?', status.isRecordingError())
213 print('Was there an error?', status.isError() )
214 print('Full status:')
215 print(status.toString())
216
217
218if __name__ == '__main__':
219 winidea_id = ''
220 print('isystem.connect version: ' + ic.getModuleVersion())
221
222
223 # main
224 cmgr = ic.ConnectionMgr()
225 cmgr.connect(ic.CConnectionConfig().instanceId(winidea_id))
226
227 debugCtrl = initTarget(cmgr)
228
229 # create trace document and record
230 traceDoc = ic.CTraceController(cmgr, 'sample_trace.trd', 'w')
231 recordTrace(debugCtrl, traceDoc)
232
233 exportTrace(traceDoc)
234 parse(traceDoc)
235
236 printStatus(traceDoc)
237
238 print("Recording trace with custom range setting...")
239 recordTraceAdvanced(debugCtrl, traceDoc)
240 exportCfg = ic.CTraceExportConfig()
241 exportCfg.setFileName('traceAdvanced.xml')
242 traceDoc.exportData(exportCfg)