Skip to main content

Initialized data compression for embedded systems

Project description

lean-init

Compression of initialized data for embedded systems.

Features

  • Use a fast decompressor (lz4)
  • Produce a fully debuggable elf file

Installation

Python package

pipenv shell
pip install leaninit

Native dependencies

The python package relies on lz4 to perform the compression and binutils to parse/edit elf files. Binutils package need to match the target CPU.

How to integrate

LD file

  • User add a new section .leaninit:
    • It shall be the last section in the load memory.
    • Use ASCIZ statement to specify the name of each section to compress.
    • Add BYTE(0) to mark the end of the list.
    • Add a LONG with the total size of the load memory.
    • Consume the remaining space of the load memory (optional).
  • Remove AT statement for sections to compress.

Example of .leaninit section:

/* .leaninit: shall be the last section in FLASH */
	.leaninit (READONLY): ALIGN(4)
	{
		__leaninit_table = .;
        /* 
        The tool will replace this with the compressed content.
        */

        /* Here we list the sections to compress. You can add more.*/
            ASCIZ ".rodata"
        ASCIZ ".preinit_array?" /* the final ? mark this section as optional, i.e. the tool won't complain if it is not in the elf file */
        ASCIZ ".init_array?"
        ASCIZ ".fini_array?"
        ASCIZ ".text" 
        ASCIZ ".data"

        /* end of table marker, don't change */
        BYTE(0)
            
        /* indicates the total size to the tool for reporting purposes */
        LONG(LENGTH(FLASH))
    
		/* Take all the remaining flash, hoping it is enough */
		. = ORIGIN(FLASH)+LENGTH(FLASH);
	} > FLASH

Start up file

  • Replace uncompressed initialization loop by a call to the compressed initialization function.

C code

  • Include leaninit.h in main.c.

Build system

  • Invoke leansys.cli at the end of the build to generate the final elf file.

How to test

Native dependencies

The test use Renode.

Launching a test

The testit_env scripts build the python package in an isolated environment and then test the basic example for a particular build preset.

cd examples/basic
./testit_env minSizeRel

Examples overview

basic example

It is a bare metal application which outputs the full text of Saint Exupery's novel "Le petit prince" on a UART.

In this example, we compress the .data section. It contains all initialized variables including the array petitprince.

whole_fw example

It is a bare metal application which outputs the full text of Saint Exupery's novel "Le petit prince" on a UART.

In this example, we compress the whole firmware. Everything is compressed except the startup file and the decompressor. At startup the firmware is decompressed into RAM and executed from there.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

leaninit-0.0.4.tar.gz (215.9 kB view details)

Uploaded Source

Built Distribution

leaninit-0.0.4-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file leaninit-0.0.4.tar.gz.

File metadata

  • Download URL: leaninit-0.0.4.tar.gz
  • Upload date:
  • Size: 215.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for leaninit-0.0.4.tar.gz
Algorithm Hash digest
SHA256 495c41bd734ee457e559ffe4b346dc8048e80e6f49bc67f48a5bda0e9d61b06e
MD5 da6f59e044e8a93059eb98e5b0c3fe47
BLAKE2b-256 3d02158396b84f1f915885928a52d6103f658e639971015417506bb9d0f507ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for leaninit-0.0.4.tar.gz:

Publisher: workflow.yml on sebastien-riou/lean-init

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file leaninit-0.0.4-py3-none-any.whl.

File metadata

  • Download URL: leaninit-0.0.4-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for leaninit-0.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 3bca70b0cd43069efbc501134e17d76a7558484b2f242ddfd5b4540cf73264dd
MD5 73f39d597b5e9714ed994663aed4e90a
BLAKE2b-256 a90e7bf44ae4210fc08ed3b9d4df553b50a53b8b75caf15cfdcc83af5a5387f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for leaninit-0.0.4-py3-none-any.whl:

Publisher: workflow.yml on sebastien-riou/lean-init

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page