Learn Zephyr® – the new Era of Real Time OS
Real-time programming applied to the Zephyr operating system
In 2022, Zephyr OS became the largest open-source RTOS project by the number of commits and developers.
Build secure, connected, future-proof devices with Zephyr®
Zephyr RTOS is easy to deploy, secure, connect and manage. It has a growing set of software libraries that can be used across various applications and industry sectors such as Industrial IoT, wearables, machine learning and more. Zephyr is built with an emphasis on broad chipset support, security, dependability, long term support releases and a growing opensource ecosystem.
Objectives:
Learn how to develop, configure, debug and trace Zephyr applications
Discover the real time multitasking concept
Understand Real Time constraints, like determinism, preemption or interrupts
Understand the Zephyr kernel Services
Learn communication and synchronization mechanisms
Interactions with processor architecture features
Understand Zephyr memory management and data structures
Understand User mode and kernel mode
Writing a device tree
Writing a complete driver
Course environment:
Theoretical course
PDF course material (in English)
The trainer to answer trainees’ questions during the training and provide technical and pedagogical assistance
Practical activities
Practical activities represent from 40% to 50% of course duration
Example code, labs and solutions
Preconfigured Virtual Machine (VM) for doing labs during of after the training
STM3240G-Eval physical board or Qemu emulated STM32F4-Discovery board
Course Format:
Online course, 5 sessions, 6 hours each (excluding break time).
Lots of hands-on exercises during the course
Some Labs may be completed between sessions and are checked by the trainer on the next session.
Prerequisites
good C Language skills
Day One
Introduction to Zephyr
Zephyr Project
Zephyr Ecosystem
Why use Zephyr
Install and Use Zephyr
Build and Configuration Systems
West
CMake
Kconfig and configuration overlay
Configuration tools: menuconfig and guiconfig
Zephyr Without Threads
Operation without Threads
GPIO
Random Number Generation
Utilities
Data Structures
Single-linked List
Double-linked List
Ring Buffers
Exercise: Hello World from Zephyr, configure and blink LEDs using Zephyr
Exercise: Manage Zephyr linked list and understand container_of macro
Real-Time Concepts
Base real time concepts
The Real Time constraints
Multi-task and real time
Tasks and Task Descriptors
Content of the task descriptor
List of task descriptors
Context Switch
Demo: Analyse Context Switch internals
Scheduling
Task Scheduling and Preemption
Tick based or tickless scheduling
Scheduling systems and schedulability proof
Fixed priorities scheduling
RMA and EDF scheduling
Scheduling through Zephyr
Scheduling Algorithm
Cooperative Time Slicing
Preemptive Time Slicing
Day Two
Thread Management
Thread Control Block
Creating Threads
Threads Priorities
Thread States
Main and Idle Threads
Delays
Changing Thread Priority
Suspending Threads
Kernel Structures
Simple linked-list ready queue
Red/black tree ready queue
Traditional multi-queue ready queue
Thread Custom Data
Scheduling Traces
Runtime Statistics
User-Defined Tracing
Percepio Tracealyzer
Exercise: Create and manage threads
Exercise: Create periodic threads
Exercise: Create config overlay for visual trace diagnostics using Tracealyzer
Memory Management in Zephyr
Memory Managers
Dynamic memory managers
K_heap
System heap
Memory Slabs
Memory Blocks
Heap Listeners
Memory Domains and Partitions
Stack Overflow detection
User Mode
Memory Domains
Exercise: Understand dynamic memory allocation in Zephyr
Exercise: Display threads information and detect stack overflow
Day Tree
Resource Management
Mutual Exclusion
Critical Sections
Mutexes
Gatekeeper threads
Atomic
Lock-Free Data Structures
SpinLocks
Exercise: Implement mutual exclusion between threads
Synchronization Primitives
Synchronization
Semaphores
The Readers/Writer Problem
Condition variables
Events and Event Groups
Polling
Exercise: The producer-consumer problem, synchronize and avoid concurrent access problems
Exercise: Understanding event bit group by synchronizing several threads
Day Four
Data Passing
Message Queues
Pipes
Queues
FIFOs
LIFOs
Mailboxes
Stacks
Exercise: Create a print gatekeeper thread using message queue
Interrupt Management
Threads and Interrupts
Interrupts in zephyr
Interrupts on ARM
Handler thread
Queue within an ISR
Workqueue Threads
Power Management
Exercise: Understand how to wait on multiple events and interrupt safe APIs
Exercise: Understand how to pass data using Queues from an interrupt to a thread
Exercise: Create and submit work items from interrupts to custom WorkQueue
Software Timers
Timers
Defining a Timer
Using a Timer Expiry Function
Timer types
One-shot timers
Auto-reload timers
Timer Commands
Exercise: Understand the use of one-shot and auto-reload timers
Day Five
Modules
Why to use modules?
Module structure
Out-of-tree module
YAML files
Module CMakeLists.txt
How to add and use custom Kconfigs
Exercise: Create a simple hello world module
Exercise: Create a module that uses custom Kconfig options
Zephyr device driver model
Introduction to Device Drivers
Overview of the Zephyr device driver model
Standard Drivers
The struct device
Subsystems
API Extensions
Initialization Levels
Dependencies between device drivers
Define devices programmatically
Adding In-Tree Code to Zephyr Source Code
Exercise: Create a driver that respects the Zephyr Device Driver Model and define devices
Exercise: Writing in-tree drivers
Device Trees in Zephyr
Overview of Device Tree (DT) and its role in Zephyr
Device Tree VS Kconfig
Device Tree node structure
Device Tree bindings
Overlay and yaml files
APIs to access device tree properties
Write device drivers using device tree APIs
Device Tree in Zephyr VS Linux
Exercise: Create a driver that uses custom device tree and Kconfig
Nohau Training Partner
This course is provided by a Nohau Training Partner, a trusted provider of hands-on training for professionals in embedded systems, software development, and engineering.





