BlueJoule® Benchmark

EMBite #3
The Question

Different hardware · Same software

Industry benchmarks typically run a common program on different processors.  Think CoreMark® …

These scores provide a familiar basis for comparing hardware – and often appear in vendor data sheets.

Same hardware · Different software

But what if we turn the comparison around – materially changing the software on the same hardware?

Let’s put that to the test – by quantifying software’s impact on energy efficiency in embedded systems.

The Benchmark

Run the same workload

BlueJoule measures the energy consumption within a system performing a defined BLE workload.

By prescribing behavior rather than source code, the benchmark suite leaves room for fundamentally different (yet compliant) software designs.

Add BLE connections

The original BlueJoule-ADV workload (defined in 2025) measured periodic advertising across a range of platforms from popular BLE silicon vendors.

BlueJoule-GATT now extends the benchmark suite with a connected transaction between a pair of BLE devices playing the Central and Peripheral roles:

BlueJoule-GATT Central and Peripheral exchange, with the Peripheral measurement window excluding advertising

Compare configurations

Each BlueJoule result reflects a complete HW/SW configuration performing the prescribed workload.

Transaction energy plus sleep power determine an EMerald score – higher means greater efficiency.

The same workload allows us to easily compare different hardware, different software, or both.

So let’s hold the hardware constant – and see what changing the software might reveal …

The Comparison

Pick the platform

Start with a single hardware device and a working software stack compliant with BlueJoule-GATT.

For this experiment, we chose Nordic’s nRF54L15 running Zephyr on its Cortex-M33 CPU – though this approach scales to other vendor silicon as well.

Change the software

Keep hardware and workload fixed – but replace Ze­phyr with compliant software written in EMScript.

Both programs complete the prescribed transaction with the same reference BLE Central – allowing us to quantify the impact of switching software.

Extend the experiment

Software changes can also dictate where the code runs – FLASH vs SRAM, or on one CPU vs another.

The nRF54L15 includes a second, RISC-V CPU that EMScript also supports – adding another compliant BlueJoule-GATT implementation to the experiment.

The Evidence

Compare the results

We measured three different BlueJoule-GATT soft­ware implementations using a Joulescope JS220.

Each transaction-energy result averages ten completed connections, excluding initial advertising.

nRF54L15 BlueJoule-GATT results at 3 V: Zephyr M33 scores 41.4 EM•eralds with 174.9 µJ event energy and 1652 nA sleep current; EM•Script M33 scores 56.0 with 137.9 µJ and 930 nA; EM•Script RISC-V scores 58.6 with 133.0 µJ and 846 nA. Scores use a 10-second period.

EMScript on the Cortex-M33 consumes 21% less overall transaction energy than Zephyr.

Lower sleep current further improves its EMerald score – which quantifies overall energy efficiency.

Remarkably, the EMScript implementation on the nRF54L15’s RISC-V CPU turned in the best scores.

Look inside an event

On the same Cortex-M33 CPU, zoom to a single corresponding Central · Peripheral packet exchange within the connection transaction.

Zephyr Cortex-M33 connection event power waveform
EM•Script Cortex-M33 connection event power waveform

Within this BLE packet exchange, EMScript uses 22% less energy and returns to idle 35% sooner.

What explains the difference?

The hardware and workload remain the same, but software takes a fundamentally different approach.

To understand these results, let’s examine another measurable difference – the amount of code required to implement the BlueJoule-GATT workload.

The Footprint

Count the bytes

Linker maps for this trio of compliant programs reveal how much code, constant storage, and writable data each implementation requires:

Basic-GATT section sizes in bytes for Zephyr M33, EM•Script M33, and EM•Script RISC-V respectively: executable code 114804, 6212, 8204; read-only constants 8764, 284, 384; initialized variables 2820, 68, 68; uninitialized variables 9940, 216, 216.

Needless to say, Zephyr dwarfs its EMScript counterpart on the M33 – using roughly 18× more code.  Other program sections show similar disparities.

Fits in SRAM

When targeting the RISC-V CPU, the EMScript pro­gram's code + const size grew ~30% – consistent with guidance provided by Nordic.

The entire program (including space for its stack) in fact fits within a single 16K block of SRAM – increasing throughput of the RISC-V CPU.

The Opportunity

“Tiny Code” does matter

Who doesn't want smaller programs when targeting resource-constrained MCUs?

Less code/data can fit in smaller, lower-cost chips – saving memory, board space, and system cost.

But tiny code also opens several paths for increasing overall energy efficiency :

➤execute fewer instructions · sleep sooner
➤reduce CPU instruction-cache pressure
➤minimize NVM access while active
➤retain less SRAM while sleeping

Specialize your software

The EMScript programming language targets resource-constrained MCUs – used in systems where every byte of memory and μJ of energy matters.

Using a novel translator, EMScript encourages build-time specialization – allowing application programs to tailor their run-time firmware content.

For BlueJoule-GATT we only implement the bench­mark’s prescribed behavior – without carrying unneeded features of a general-purpose BLE stack.

EMScript also generates an optimized, purpose-built GATT database – given a description of the bench­mark's BLE service and characteristics.

The EM Foundation has already initiated the Bluetooth Qualification Process for its compact EMScript stack.

Take the next steps

  💎 Explore BlueJoule ➜

  📖 Learn about EMScript ➜

  🔗 Talk to The EM Foundation ➜