Standalone Application¶
Introduction¶
A Standalone Application is a Java Application directly linked to the C code to produce an Executable.
Such an application must define a main entry point (i.e., a class containing a public static void main(String[])
method).
The following figure shows the general process of building a Standalone Application to an Executable.
Standalone Application Options¶
To run a Standalone Application on a VEE Port, a set of options must be defined. Options can be of different types:
- Memory Allocation options (e.g., set the Java Heap size). These options are usually called link-time options.
- Simulator & Debug options (e.g., enable periodic Java Heap dump).
- Deployment options (e.g., copy
microejapp.o
to a suitable BSP location). - Foundation Library specific options (e.g., embed UTF-8 encoding).
The following section describes options provided by the latest Architecture version. Please consult the appropriate Pack(s) documentation for options related to other Foundation Libraries (MicroUI, NET, SSL, FS, …) integrated to your VEE Port.
Notice that some options may not be supported by your VEE Port, in the following cases:
- Option is specific to the Core Engine capability (tiny/mono/multi).
- Option is specific to the target (Core Engine or Simulator).
- Option has been introduced in a newer Architecture version.
Defining an Option with SDK 6¶
Using a Properties File¶
With the SDK 6, the Applications options can be defined in a properties file located in the configuration
folder of the project.
Usually, the options are defined in a file named common.properties
,
but all properties files located in this folder are loaded, no matter what their name is.
To set an option in a properties file, open the file in a text editor and add a line to set the desired option to the desired value, for example:
soar.generate.classnames=false
Using System Properties¶
Application options can be defined by System properties using the microej.option.*
prefix.
System properties can either be defined in command line using -D
argument, or in gradle.properties
file using systemProp.*
prefix.
For instance, in command line:
-Dmicroej.option.soar.generate.classnames=false
or in gradle.properties
file:
systemProp.microej.option.soar.generate.classnames=false
See the How To Pass a Property to Project Build Script for more information about System properties.
Note
When Application options are also defined in properties from the configuration
folder of the project, they will be overridden by System properties.
Defining an Option with SDK 5 or lower¶
With the SDK 5 or lower, a Standalone Application option can be defined either from a launcher or from a properties file. It is also possible to use both together. Each MicroEJ Architecture and MicroEJ Pack option comes with a default value, which is used if the option has not been set by the user.
Using a Launcher¶
To set an option in a launcher, perform the following steps:
- In the SDK, select Run > Run Configurations… menu,
- Select the launcher of the application under MicroEJ Application or create a new one,
- Select the Configuration tab,
- Find the desired option and set it to the desired value. If the option does not appear in the page, there are two cases: - the option has been introduced in a newer Architecture version, - the option is an advanced option. It is set using a system property in the JRE Tab. See the JRE Tab section for more details.
It is recommended to index the launcher configuration to your version control system. To export launcher options to the filesystem, perform the following steps:
- Select the Common tab,
- Select the Shared file: option and browse the desired export folder,
- Press the Apply button. A file named
[launcher_configuration_name].launch
is generated in the export folder.
Using a Properties File¶
Options can be also be defined in properties files.
When a Standalone Application is built using the firmware-singleapp
skeleton,
options are loaded from properties files located in the build
folder at the root of the project.
The properties files are loaded in the following order:
- Every file matching
build/sim/*.properties
, for Simulator options only (Virtual Device build). These files are optional. - Every file matching
build/emb/*.properties
, for Device options only (Firmware build). These files are optional. - Every file matching
build/*.properties
, both for Simulator and Device options. At least one file is required.
Usually, the build
folder contains a single file named common.properties
.
In case an option is defined in multiple properties files, the option of the first loaded file is taken into account and the same option defined in the other files is ignored (a loaded option cannot be overridden).
The figure below shows the expected tree of the build
folder:
It is recommended to index the properties files to your version control system.
To set an option in a properties file, open the file in a text editor and add a line to set the desired option to the desired value. For example: soar.generate.classnames=false
.
To use the options declared in properties files in a launcher, perform the following steps:
- In the SDK, select Run > Run Configurations…,
- Select the launcher of the application,
- Select the Execution tab,
- Under Option Files, press the Add… button,
- Browse the
sim.properties
file for Simulator or theemb.properties
file for Device (if any) and press Open button, - Add the
common.properties
file and press the Open button.
Note
An option set in a properties file can not be modified in the Configuration
tab.
Options are loaded in the order the properties files are added (you can use Up
and Down
buttons to change the file order).
In Configuration
tab, hovering the pointer over an option field will show the location of the properties file that defines the option.
Generating a Properties File¶
In order to export options defined in a .launch
file to a properties file, perform the following steps:
- Select the
[launcher_configuration_name].launch
file, - Select File > Export > MicroEJ > Launcher as Properties File,
- Browse the desired output
.properties
file, - Press the Finish button.
Warning
The Simulator uses some system properties to configure internal memory limits. See Group: Advanced Simulation Options for more information.
Category: Runtime¶
Group: Types¶
Option(checkbox): Embed all type names¶
Option Name: soar.generate.classnames
Default value: true
Description:
Embed the name of all types. When this option is disabled, only names of declared required types are embedded.
Group: Assertions¶
Option(checkbox): Execute assertions on Simulator¶
Option Name: core.assertions.sim.enabled
Default value: false
Description:
When this option is enabled, assert
statements are executed. Please note
that the executed code may produce side effects or throw
java.lang.AssertionError
.
Option(checkbox): Execute assertions on Device¶
Option Name: core.assertions.emb.enabled
Default value: false
Description:
When this option is enabled, assert
statements are executed. Please note
that the executed code may produce side effects or throw
java.lang.AssertionError
.
Group: Trace¶
Option(checkbox): Start execution traces automatically¶
Option Name: core.trace.autostart
Default value: false
Category: Memory¶
Group: Heaps¶
Option(text): Java heap size (in bytes)¶
Option Name: core.memory.javaheap.size
Default value: 65536
Description:
Specifies the Java heap size in bytes.
A Java heap contains live Java objects. An OutOfMemory error can occur if the heap is too small.
Option(text): Immortal heap size (in bytes)¶
Option Name: core.memory.immortal.size
Default value: 4096
Description:
Specifies the Immortal heap size in bytes.
The Immortal heap contains allocated Immortal objects. An OutOfMemory error can occur if the heap is too small.
Group: Threads¶
Description:
This group allows the configuration of application and library thread(s). A thread needs a stack to run. This stack is allocated from a pool and this pool contains several blocks. Each block has the same size. At thread startup the thread uses only one block for its stack. When the first block is full it uses another block. The maximum number of blocks per thread must be specified. When the maximum number of blocks for a thread is reached or when there is no free block in the pool, a StackOverflow error is thrown. When a thread terminates all associated blocks are freed. These blocks can then be used by other threads.
Option(text): Number of threads¶
Option Name: core.memory.threads.size
Default value: 5
Description:
Specifies the number of threads the application will be able to use at the same time.
Option(text): Number of blocks in pool¶
Option Name: core.memory.threads.pool.size
Default value: 15
Description:
Specifies the number of blocks in the stacks pool.
Option(text): Block size (in bytes)¶
Option Name: core.memory.thread.block.size
Default value: 512
Description:
Specifies the thread stack block size (in bytes).
Option(text): Maximum size of thread stack (in blocks)¶
Option Name: core.memory.thread.max.size
Default value: 4
Description:
Specifies the maximum number of blocks a thread can use. If a thread requires more blocks a StackOverflow error will occur.
Category: Simulator¶
Group: Options¶
Description:
This group specifies options for MicroEJ Simulator.
Option(checkbox): Use target characteristics¶
Option Name: s3.board.compliant
Default value: false
Description:
When selected, this option forces the MicroEJ Simulator to use the MicroEJ Platform exact characteristics. It sets the MicroEJ Simulator scheduling policy according to the MicroEJ Platform one. It forces resources to be explicitly specified. It enables log trace and gives information about the RAM memory size the MicroEJ Platform uses.
Option(text): Slowing factor (0 means disabled)¶
Option Name: s3.slow
Default value: 0
Description:
Format: Positive integer
This option allows the MicroEJ Simulator to be slowed down in order to match the MicroEJ Platform execution speed. The greater the slowing factor, the slower the MicroEJ Simulator runs.
Group: HIL Connection¶
Description:
This group enables the control of HIL (Hardware In the Loop) connection parameters (connection between MicroEJ Simulator and the Mocks).
Option(checkbox): Specify a port¶
Option Name: s3.hil.use.port
Default value: false
Description:
When selected allows the use of a specific HIL connection port, otherwise a random free port is used.
Option(text): Port¶
Option Name: s3.hil.port
Default value: 8001
Description:
Format: Positive integer
Values: [1024-65535]
It specifies the port used by the MicroEJ Simulator to accept HIL connections.
Option(text): Timeout (s)¶
Option Name: s3.hil.timeout
Default value: 10
Description:
Format: Positive integer
It specifies the time the MicroEJ Simulator should wait before failing when it invokes native methods.
Option(text): Maximum frame size (bytes)¶
Option Name: com.microej.simulator.hil.frame.size
Default value: 262144
Description:
Maximum frame size in bytes. Must be increased to transfer large arrays to native side.
Group: Shielded Plug server configuration¶
Description:
This group allows configuration of the Shielded Plug database.
Option(text): Server socket port¶
Option Name: sp.server.port
Default value: 10082
Description:
Set the Shielded Plug server socket port.
Group: Advanced Simulation Options¶
When running large applications, the Simulator can abruptly reach a memory limit with the following trace:
[...] An error message [...]
"Internal limits reached. Please contact [email protected]"
See error log file: /tmp/microej/s3/s3_1616489929186.log
Depending on the error message, one of the following options must be set to increase the size of the memory area which is full.
Option: Objects Heap Size¶
Error Message: java.lang.OutOfMemoryError
exception thrown
Option Name: S3.JavaMemory.HeapSize
Default value: 4096
(kilobytes)
Description:
This memory area contains any kind of objects (regular, immortal and immutable objects).
If you get a java.lang.OutOfMemoryError
exception but your Java Heap is not full, most likely you should augment this option.
It must be greater than the sum of Java Heap and Immortal Heap.
Option: System Chars Size¶
Error Message: Failed to allocate internString.
Option Name: S3.JavaMemory.SystemCharsSize
Default value: 1024
(kilobytes)
Description:
This memory area contains system interned strings. System interned strings are likely allocated by the debugger.
If you get a Failed to allocate internString.
message while debugging an Application, most likely you should augment this option.
Option: Application Chars Size¶
Error Message: Failed to allocate internString.
Option Name: S3.JavaMemory.ApplicationCharsSize
Default value: 4096
(kilobytes)
Description:
This memory area contains Application interned strings (String literals).
If you get a Failed to allocate internString.
message while the Simulator is starting the Application, most likely you should augment this option.
Option: Methods Size¶
Error Message: Failed to allocate method's code.
Option Name: S3.JavaMemory.MethodsSize
Default value: 10000
(kilobytes)
Description:
This memory area contains loaded methods code.
Option: Thread Stack Size¶
Error Message: The simulator has encountered a stack overflow error while analyzing method [...]
Option Name: S3.JavaMemory.ThreadStackSize
Default value: 300
(kilobytes)
Description:
This memory area contains all Application threads stacks.
Option: Icetea Heap End¶
Error Message: S3 internal heap is full.
Option Name: IceteaRuntimeSupport.S3.HeapEnd
Default value: 64000000
(bytes)
Description:
This is the overall Simulator memory limit. It includes fixed sizes internal structures and all memory areas. The value must be greater than the size of the memory areas that can be parameterized above.
Option: Symbol Table Size¶
Error Message: Symbols table area is full.
Option Name: S3.SymbolTable.MaxNbState
Default value: 500000
Description:
This is the number of symbols that can be handled by the internal symbol table (any kind of names: class names, method names, …).
Category: Code Coverage¶
Group: Code Coverage¶
Description:
This group is used to set parameters of the code coverage analysis tool.
Option(checkbox): Activate code coverage analysis¶
Option Name: s3.cc.activated
Default value: false
Description:
When selected it enables the code coverage analysis by the MicroEJ Simulator. Resulting files are output in the cc directory inside the output directory. You can process these files to an HTML report afterward with the built-in Code Coverage Analyzer .
Option(text): Saving coverage information period (in sec.)¶
Option Name: s3.cc.thread.period
Default value: 15
Description:
It specifies the period between the generation of .cc files.
Category: Debug¶
Category: Heap Dumper¶
Group: Heap Inspection¶
Description:
This group is used to specify heap inspection properties.
Option(checkbox): Activate heap dumper¶
Option Name: s3.inspect.heap
Default value: false
Description:
When selected, this option enables a dump of the heap each time the System.gc() method is called by the MicroEJ Application.
Category: Logs¶
Group: Logs¶
Description:
This group defines parameters for MicroEJ Simulator log activity. Note that
logs can only be generated if the Simulator > Use target characteristics
option is selected.
Some logs are sent when the Simulator executes some specific action (such as start thread, start GC, etc), other logs are sent periodically (according to defined log level and the log periodicity).
Option(checkbox): system¶
Option Name: console.logs.level.low
Default value: false
Description:
When selected, System logs are sent when the Simulator executes the following actions:
start and terminate a thread
start and terminate a GC
exit
Option(checkbox): thread¶
Option Name: console.logs.level.thread
Default value: false
Description:
When selected, thread information is sent periodically. It gives information about alive threads (status, memory allocation, stack size).
Option(checkbox): monitoring¶
Option Name: console.logs.level.monitoring
Default value: false
Description:
When selected, thread monitoring logs are sent periodically. It gives information about time execution of threads.
Option(checkbox): memory¶
Option Name: console.logs.level.memory
Default value: false
Description:
When selected, memory allocation logs are sent periodically. This level allows to supervise memory allocation.
Option(checkbox): schedule¶
Option Name: console.logs.level.schedule
Default value: false
Description:
When selected, a log is sent when the Simulator schedules a thread.
Option(checkbox): monitors¶
Option Name: console.logs.level.monitors
Default value: false
Description:
When selected, monitors information is sent periodically. This level permits tracing of all thread state by tracing monitor operations.
Option(text): period (in sec.)¶
Option Name: console.logs.period
Default value: 2
Description:
Format: Positive integer
Values: [0-60]
Defines the periodicity of periodical logs.
Category: Libraries¶
Category: EDC¶
Group: Java System.out¶
Option(checkbox): Use a custom Java output stream¶
Option Name: core.outputstream.disable.uart
Default value: false
Description:
Select this option to specify another Java System.out
print stream.
If selected, the default Java output stream is not used by the Java application. The Core Engine will not use the default Java output stream at startup.
Option(text): Class¶
Option Name: core.outputstream.class
Default value: (empty)
Description:
Format: Java
class like packageA.packageB.className
Defines the Java class used to manage System.out
.
At startup the Core Engine will try to load this class using the Class.forName()
method. If the given class is not available, it will use the default
Java output stream as usual. The specified class must be available in the
application classpath.
Group: Runtime options¶
Description:
Specifies the additional classes to embed at runtime.
Option(checkbox): Embed UTF-8 encoding¶
Option Name: cldc.encoding.utf8.included
Default value: true
Description:
Embed UTF-8 encoding.
Option(checkbox): Enable SecurityManager checks¶
Option Name: com.microej.library.edc.securitymanager.enabled
Default value: false
Description:
Enable the security manager Permission checks.
Category: Shielded Plug¶
Category: External Resources Loader¶
Group: External Resources Loader¶
Description:
This group allows to specify the external resources input folder. The content of this folder will be copied in an application output folder and used by SOAR and the Simulator. If empty, the default location will be [output folder]/externalResources, where [output folder] is the location defined in Execution tab.
Option(browse):¶
Option Name: ej.externalResources.input.dir
Default value: (empty)
Description:
Browse to specify the external resources folder..
Category: Device¶
Category: Core Engine¶
Group: Memory¶
Option(text): Maximum number of monitors per thread¶
Option Name: core.memory.thread.max.nb.monitors
Default value: 8
Description:
Specifies the maximum number of monitors a thread can own at the same time.
Option(text): Maximum number of frames dumpers on OutOfMemoryError¶
Option Name: core.memory.oome.nb.frames
Default value: 5
Description:
Specifies the maximum number of stack frames that can be dumped to the standard output when Core Engine throws an OutOfMemoryError.
Option(checkbox): Enable Java heap usage monitoring¶
Option Name: com.microej.runtime.debug.heap.monitoring.enabled
Default value: false
Option(text): Java heap initial size¶
Option Name: com.microej.runtime.debug.heap.monitoring.init.size
Default value: 0
Description:
Specify the initial size (in bytes) of the Java Heap.
Group: SOAR¶
Option(checkbox): Enable Bytecode Verifier¶
Option Name: soar.bytecode.verifier
Default value: Standalone Application: false
, Sandboxed Application: true
Description:
Enables Binary Code Verifier during application build.
In the context of building a Standalone Application, the bytecode verifier is, by default, disabled to prioritize performance. In this case, the code is considered trusted. Conversely, when building a Sandboxed Application, the bytecode verifier is automatically enabled by default. This is particularly important when dealing with untrusted third-party code.
Group: Garbage Collector¶
Option(text): GC mark stack size¶
Option Name: com.microej.runtime.core.gc.markstack.levels.max
Default value: 32
Description:
Indicates the quantity of items in the Garbage Collector’s mark stack. The mark stack is used by the Garbage Collector for identifying live objects within the heap through a depth-first search approach. Once the mark stack reaches its capacity, the Garbage Collector proceeds to inspect heap memory, which may slow down garbage collection performance.
You can receive a notification when the mark stack limit is reached by implementing the following hook:
void LLMJVM_on_GC_MarkStackOverflow_reached(void) {
// When entering here, the GC mark stack is undersized, which may affect GC performance.
// It is recommended to either increase the GC mark stack size or reduce the object graph depth.
}
Category: Kernel¶
Group: Threads¶
Option(text): Maximum number of threads per Feature¶
Option Name: core.memory.feature.max.threads
Default value: 5
Description:
Specifies the maximum number of threads a Feature is allowed to use at the same time.
Option(text): Feature stop timeout¶
Option Name: com.microej.runtime.kf.waitstop.delay
Default value: 2000
Description:
Specifies the maximum time allowed for the FeatureEntryPoint.stop() method to return (value in milliseconds).
Group: Features Installation¶
Option(text): Maximum number of installed Features¶
Option Name: com.microej.runtime.kernel.dynamicfeatures.max
Default value: 16
Description:
Specifies the maximum number of Features that can be installed to this Kernel (see Kernel.install() method).
Option(text): Code chunk size¶
Option Name: com.microej.soar.kernel.featurecodechunk.size
Default value: 65536
Description:
Specifies the size in bytes of the code chunk in RAM. See Code Chunk Size section for more details.
Option(text): InputStream transfer buffer size¶
Option Name: com.microej.runtime.kf.link.transferbuffer.size
Default value: 512
Description:
Specifies the size in bytes of the temporary byte array for reading in the Feature InputStream. See InputStream Transfer Buffer Size section for more details.
Option(text): Maximum number of relocations applied simultaneously¶
Option Name: com.microej.runtime.kf.link.chunk.relocations.count
Default value: 128
Group: Feature Portability Control¶
Option(checkbox): Enable Feature Portability Control¶
Option Name: com.microej.soar.kernel.featureportabilitycontrol.enabled
Default value: false
Option(browse): Kernel Metadata File¶
Option Name:
com.microej.soar.kernel.featureportabilitycontrol.metadata.path
Default value: (empty)
Description:
Specifies the path to the Kernel metadata file for Feature Portability Control.
Category: Deploy¶
Description:
Configures the output locations where store the Application, the Architecture libraries and Abstraction Layer header files.
See Board Support Package (BSP) connection chapter for more details.
Group: Configuration¶
Option(checkbox): Deploy the Application (microejapp.o) at a location known by the 3rd-party BSP project.¶
Option Name: deploy.bsp.microejapp
Default value: true
Description:
Deploy the Application (microejapp.o) at a location known by the 3rd-party BSP project.
Option(browse):¶
Option Name: deploy.dir.microejapp
Default value: (empty)
Description:
Choose an output folder where to deploy the Application. An empty value means no deployment (file is available in the Application output folder).
Option(checkbox): Deploy the Architecture library (microejruntime.a) at a location known by the 3rd-party BSP project.¶
Option Name: deploy.bsp.microejlib
Default value: true
Description:
Deploy the Architecture library (microejruntime.a) at a location known by the 3rd-party BSP project.
Option(browse):¶
Option Name: deploy.dir.microejlib
Default value: (empty)
Description:
Choose an output folder where to deploy the Architecture library. An empty value means no deployment (file is available in the Application output folder).
Option(checkbox): Deploy the Abstraction Layer header files (*.h
) at a location known by the 3rd-party BSP project.¶
Option Name: deploy.bsp.microejinc
Default value: true
Description:
Deploy the Abstraction Layer header files (*.h
) at a location known by the
3rd-party BSP project.
Option(browse):¶
Option Name: deploy.dir.microejinc
Default value: (empty)
Description:
Choose an output folder where to deploy the Architecture library. An empty value means no deployment (file is available in the Application output folder).
Option(checkbox): Execute the MicroEJ build script (build.bat) at a location known by the 3rd-party BSP project.¶
Option Name: deploy.bsp.microejscript
Default value: false
Description:
Execute the MicroEJ build script (build.bat) at a location known by the 3rd-party BSP project.
Option(browse):¶
Option Name: deploy.dir.microejscript
Default value: (empty)
Description:
Choose an output folder where is located the MicroEJ build script (build.bat) to execute. An empty value means no execution.
Option(browse):¶
Option Name: deploy.bsp.root.dir
Default value: (empty)
Description:
Choose an output folder where is located the 3rd-party BSP project. An empty value means not set (3rd-party BSP project location may have been configured by the VEE Port).