diff options
author | Kristofer Jonsson <kristofer.jonsson@arm.com> | 2022-12-01 17:20:31 +0100 |
---|---|---|
committer | Kristofer Jonsson <kristofer.jonsson@arm.com> | 2022-12-05 14:47:56 +0100 |
commit | 0eb6905521071ee93271832ec4d3f139a6e503df (patch) | |
tree | 522ee329b5289c58f610a0e691cc158bffddfe5d /scripts/ethosumonitor/main.py | |
parent | 4646ed102788fa8aacd5c0ee500640199d9e7a4a (diff) | |
download | ethos-u-core-platform-0eb6905521071ee93271832ec4d3f139a6e503df.tar.gz |
Ethos-U Monitor main function
Move main function into eventmonitor/main.py.
Change-Id: I7b0f53c9c3eecf2510286459d6fdada0fb49216c
Diffstat (limited to 'scripts/ethosumonitor/main.py')
-rw-r--r-- | scripts/ethosumonitor/main.py | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/scripts/ethosumonitor/main.py b/scripts/ethosumonitor/main.py new file mode 100644 index 0000000..bb7a7aa --- /dev/null +++ b/scripts/ethosumonitor/main.py @@ -0,0 +1,145 @@ +# +# SPDX-FileCopyrightText: Copyright 2022 Arm Limited and/or its affiliates <open-source-office@arm.com> +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the License); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an AS IS BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from ethosumonitor.inputs import * +from ethosumonitor.outputs import * +from sys import stderr, exit + +def eventLoop(input: InputInterface, output: OutputInterface): + count = 0 + + try: + while(True): + for record in input.readEventRecord(): + output.writeEventRecord(record) + count = count + 1 + except KeyboardInterrupt: + stderr.write(f'count={count}, input={input}\n') + pass + except EOFError: + pass + + output.flush() + +def getDAPLink(args): + return InputDAPLink(args.elf, args.target, args.reset) + +def getMem(args): + return InputMem(args.elf, args.memory_map) + +def getFile(args): + return InputFile(args.file) + +def getOutput(args): + if args.output_format == 'binary': + return OutputBinary(args.output) + else: + return OutputJson(args.output) + +def addOutputArguments(parser): + parser.add_argument('--output-format', choices=['binary', 'json'], default='json', help='Output format.') + parser.add_argument('-o', '--output', default='/dev/stdout', help='Output file.') + +def main(): + import argparse + + parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, + description='Ethos-U monitor downloading profiling data.', + epilog=''' +Event Recorder: + The Event Recorder library is used to write performance data to a ring buffer + in memory. The ring buffer has a limited size and must be continuously + streamed to a host machine before it overflows. + + This script demonstrates how to stream performance data using DAPLink or + /dev/mem. Support for other technologies can be added implementing the + InputInterface class in inputs.py. +''') + subparsers = parser.add_subparsers() + + subparser = subparsers.add_parser('daplink', + formatter_class=argparse.RawDescriptionHelpFormatter, + description='Download performance data using DAPLink.', + epilog=''' +DAPLink: + Arm Mbed DAPLink is an open source project that enables programming and + debugging application software running on an Arm Cortex CPU. A host machine + can connect to the target device using for example USB or JTAG. + + This script demonstrates how DAPLink can be used to stream Event Recorder + data from a target device. The ELF file passed to the script must be the + same application that is running on the device, and is used to find the + location of the Event Recorder ring buffer. + + $ ethosu_monitor.py daplink --target mps3_an540 myapplication.elf +''') + subparser.set_defaults(getInput=getDAPLink) + subparser.add_argument('--target', default='mps3_an540', help='DAPLink target platform.') + subparser.add_argument('-r', '--reset', action='store_true', help='Reset target.') + subparser.add_argument('elf', help='Elf file running on the target.') + addOutputArguments(subparser) + + subparser = subparsers.add_parser('memory', + formatter_class=argparse.RawDescriptionHelpFormatter, + description='Download performance data using /dev/mem.', + epilog=''' +/dev/mem: + For a Linux based system the Event Recorder buffer should be stored in shared + memory accessible from Linux. This allows Linux to read device the Event + Recorder ring buffer using /dev/mem. + + The address of the Event Recorder ring buffer is found parsing the ELF + file. Because the device and Linux do not share the same address space a + memory map is required to translate device addresses into host addresses. + Please see sample.json for reference. + + $ ethosu_monitor.py memory --memory-map config.json myapplication.elf +''') + subparser.set_defaults(getInput=getMem) + subparser.add_argument('--memory-map', required=True, help='JSON file describing physical memory map of target.') + subparser.add_argument('elf', help='Elf file running on the target.') + addOutputArguments(subparser) + + subparser = subparsers.add_parser('file', + formatter_class=argparse.RawDescriptionHelpFormatter, + description='Replay performance data stored in binary file.', + epilog=''' +file: + Event Recorder data can be written in binary format for later processing. + This will likely have less latency than the default JSON format, reducing + the risk over ring buffer overflows. + + $ ethosu_monitor.py daplink --output-format binary --output samples.bin myapplication.elf + + The binary data can later be unpacked to JSON. + + $ ethosu_monitor.py file samples.bin --output-format json +''') + subparser.set_defaults(getInput=getFile) + subparser.add_argument('file', help='Binary file containing recorded performance data.') + addOutputArguments(subparser) + + args = parser.parse_args() + + if 'getInput' not in args: + parser.print_help() + exit(2) + + input = args.getInput(args) + output = getOutput(args) + eventLoop(input, output) |