emSim is a program that allows you to run SEGGER Embedded Studio's instruction set simulator from the command line.
The primary purpose of emSim is to enable command line tests to be run. The debug I/O provided by SEGGER Embedded Studio is supported, as are command line arguments and exit.
emSim will accept a single elf file, it will allocate and load memory regions based on the program sections in the elf file. emSim will start execution from the entry point symbol contained in the elf file. emSim will terminate when exit is called or execution reaches a specified symbol.
Assuming that app.c contains the following
#include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { int i; for (i = 1; i < argc; i++) printf("argv[%d]=%s\n", i, argv[i]); exit(EXIT_SUCCESS); }
and app.elf has been built with the preprocessor definition FULL_LIBRARY then
emSim app.elf hello world
will produce the output
argv[1]=hello argv[2]=world
if the debug I/O implementation has to set breakpoints or poll memory locations then you can supply the name of the symbol to breakpoint on that will enable the debug I/O
emSim app.elf -startup __startup_complete hello world
if the application uses memory that isn't allocated in the elf file then you can supply the memory segments that the simulator should create
emSim app.elf -segments 0x08000000;0x10000;0x20000000;0x10000
and there is an alternative form of this
emSim app.elf -memory-segments "FLASH RX 0x08000000 0x10000;SRAM RWX 0x20000000 0x10000"
The simulator attempts to determine the machine architecture from data in the elf file this can be override using
If the simulator doesn't support the architecture then the the list of supported architectures will be displayed.
The simulator will start executing at the entry point symbol in the elf file. If the application doesn't set the stack pointer then you can supply this
emSim app.elf -stackpointer __stack_end__
If the application doesn't call exit then you can supply a symbol to breakpoint on that will terminate the simulation
emSim app.elf -end _Exit
You can show an instruction trace
emSim app.elf -trace
Which will show the addresses of instructions, the instruction opcode and the disassembly
0x000002d8 E59F003C ldr r0, =0xE01FC000 0x000002dc E3A01000 mov r1, #0 0x000002e0 E5801000 str r1, [r0] 0x000002e4 E3A01003 mov r1, #3 0x000002e8 E5801004 str r1, [r0, #4] 0x000002ec E3A01002 mov r1, #2
You can display the instruction execution counts at the end of the simulation
emSim app.elf -counts
Which will show the addresses of instructions, with the number of times executed
0x08000298=1 0x0800029a=1 ... 0x080008ac=278 0x080008ae=2 ...
You can supply a list of memory word values to simulate ROM or hardware status registers
emSim app.elf -values "0xE0082000=0xFEEDFACE"
Which will always return 0XFEEDFACE when the address 0xE0082000 is read or fetched.
Similarly to you can supply a list of memory half word values
emSim app.elf -values2 "0xE0082000=0xFACE;0xE0082000=0xFEED"
The address is evaluated as a debug expression so you can supply symbol names
emSim app.elf -values2 "SystemInit=0x8082"
Which will cause the simulator to execute a RISC-V return instruction when SystemInit is called.
emSim file [options] args …
Option | Description |
-arch 'a' | Specify architecture to simulate |
-arch list | List supported architectures |
-counts | Show execution counts when the simulation ends |
-end 's' | Specify the symbol to end simulation |
-max 'c' | Specify the maximum number of instructions to simulate |
-memory-segments 'name [access] start size;…' | Specify the list of memory segments |
-segments 'start;size;…' | Specify the list of memory segments |
-stackpointer 's' | Specify the starting stackpoint symbol |
-startup 's' | Specify the startup completion point symbol |
-trace | Show instruction execution |
-values 'address=value;…' | Specify a list of memory word values to simulate |
-values2 'address=value;…' | Specify a list of memory half word values to simulate |