ess logo  
  Events & Promos  

  SEGGER emCompress  

Shrink data with emCompress Data management

emCompress is a compression system that is able to reduce the storage requirements of data to be embedded into an application. A compressed version of the data is stored in the flash memory of the target system. In the target, a small, fast decompressor can decompress the data on-the-fly, whenever it is required. The decompressor can decompress into RAM or send the output to an application defined function.


  • Highly efficient compression.
  • Small decompressor ROM footprint.
  • Fixed decompressor RAM use, chosen when compressing .
  • Wide range of codecs to choose from.
  • Automatic selection of best codec for each file.
  • Works with any operating system to accomplish a thread-safe environment.
  • Easy-to-understand and simple-to-use.
  • Simple to configure and integrate.
  • Royalty free.

Software only grows in one direction

With increasing complexity of today's devices, customers expect firmware updates over the lifetime of a device. It's important to be able to replace both firmware images and FPGA configuration bitstreams in the field. Typically, firmware upgrades and other static content grow in size over the lifetime of a device: features are added to software, not taken away, it's just what happens. This is where emCompress can help. emCompress will compress your data so that it takes much less space on the target device. The decompressors are tiny in ROM, but the benefits of compression means you reclaim more space in your device for the features you're trying to add. Because emCompress decompressors can be tailored for RAM use, you can decompress static content early in your application and not devote RAM to decompression buffers.

Typical example Configuring an FPGA

For instance, configuring an FPGA is one of the first things that an application will do, decompressing a bitstream and sending it to the FPGA. In this case, a small decompression buffer can be held on the stack even though the compressed bitstream is hundreds of kilobytes in size: the temporary buffer is a known size that is configured at compression time, and that RAM is free for reuse the moment any decompression completes. emCompress enables microcontrollers with small internal flash memory to store FPGA image bitstreams which otherwise would require the system designer to use a bigger version of the microcontroller.

Decompressing and Processing Data

emCompress features two decompression functions. The first one is decompression into memory. The complete data is decompressed and stored in a user-provided memory buffer. Although the buffer can be temporary, this requires to have enough free memory for the complete uncompressed data and the workspace. Decompression into memory can for example be useful for dynamic firmware images. The second function is decompression in streamed mode. emCompress will use a small temporary buffer whose size is set by the user when compressing. Once a fragment of data is decompressed and the buffer is filled, the user-provided output function is called and the next buffer filled again with the next fragment. Streamed decompression is particularly effective for programming FPGAs or serving web content.

Performance and Memory Footprint

ROM use

The amount of ROM that emCompress uses for decompression varies with the codec selected between 0.5 kByte and 2.1 kByte. The total ROM requirement includes a single decoder, and all supporting functions, excluding integrity checks.

RAM use

The amount of RAM that emCompress uses is under complete control as it is specified at compression time. Typically, 2KB of temporary RAM for decompression yield good compression ratios, but even without temporary RAM, good compression ratios can be achieved in many cases. No static RAM is required, stack usage is well below 512 bytes.

Typical uses of emCompress

Compression has many fields of application. Static data that is not frequently used and or has exceptionally high compression rates are the prime target applications. Typical examples are the configuration bitstreams to program FPGA and CPLD devices, permanent files for embedded web server static content, firmware updates and the user interface messages for multiple languages.