If you need urgent consulting help click here

Kernel Services

The Zephyr kernel lies at the heart of every Zephyr application. It provides a low footprint, high performance, multi-threaded execution environment with a rich set of available features. The rest of the Zephyr ecosystem, including device drivers, networking stack, and application-specific code, uses the kernel’s features to create a complete application.

The configurable nature of the kernel allows you to incorporate only those features needed by your application, making it ideal for systems with limited amounts of memory (as little as 2 KB!) or with simple multi-threading requirements (such as a set of interrupt handlers and a single background task). Examples of such systems include: embedded sensor hubs, environmental sensors, simple LED wearable, and store inventory tags.

Applications requiring more memory (50 to 900 KB), multiple communication devices (like Wi-Fi and Bluetooth Low Energy), and complex multi-threading, can also be developed using the Zephyr kernel. Examples of such systems include: fitness wearables, smart watches, and IoT wireless gateways.

Scheduling, Interrupts, and Synchronization

These pages cover basic kernel services related to thread scheduling and synchronization.

Data Passing

These pages cover kernel objects which can be used to pass data between threads and ISRs.

The following table summarizes their high-level features.

Object

Bidirectional?

Data structure

Data item size

Data Alignment

ISRs can receive?

ISRs can send?

Overrun handling

FIFO

No

Queue

Arbitrary [1]

4 B [2]

Yes [3]

Yes

N/A

LIFO

No

Queue

Arbitrary [1]

4 B [2]

Yes [3]

Yes

N/A

Stack

No

Array

Word

Word

Yes [3]

Yes

Undefined behavior

Message queue

No

Ring buffer

Power of two

Power of two

Yes [3]

Yes

Pend thread or return -errno

Mailbox

Yes

Queue

Arbitrary [1]

Arbitrary

No

No

N/A

Pipe

No

Ring buffer [4]

Arbitrary

Arbitrary

No

No

Pend thread or return -errno

[1] Callers allocate space for queue overhead in the data elements themselves.

[2] Objects added with k_fifo_alloc_put() and k_lifo_alloc_put() do not have alignment constraints, but use temporary memory from the calling thread’s resource pool.

[3] ISRs can receive only when passing K_NO_WAIT as the timeout argument.

[4] Optional.

Memory Management

See Memory Management.

Timing

These pages cover timing related services.