A collection of courses to learn Embedded Systems Programming with focus on learning by Hands-On Experiments.
We have done all the research, organized and structured the content with focus on reasoning from first principles, becoming productive fast, and insights.





































aarch64 based Cortex-A72 on the Raspberry-Pi4B - from scratch! You will…





aarch64 based Cortex-A72 on the Raspberry-Pi4B - from scratch! You will…














Experiments are performed on one of the following Hardware (or the Emulator option available on QEMU). The hardware is not included and needs to be bought separately.





Start here - If you are looking to get a good idea of what is embedded systems and what are the typical journeys available to you based on your background in Electrical Engineering, Electronics Engineering or Computer Science.
An overview of what Embedded Systems is and what the basics one needs to know.
Dive into the details of what Firmware engineering means and what are the skills one should have.
Understand the meaning of what System is and what systems programming means in the context of Embedded systems software.

Collection of stories on how to become a Embedded Systems engineer. Vlog style recording from Piyush, reflecting back on his journey in the field of Embedded Systems. Includes interview experiences, pressures and the decisions taken along the way.
Reflecting on the early years, the personal background and the pressures that shaped the journey.
The internship journey at Intel - from the interview to working on real projects.
Other interview adventures and opportunities explored along the way.

We are writing a book to teach C by understanding the CPU/Memory programmers model, exploring the ISA for RISC-V, the assembly, writing baremetal firmware/driver, and ends with printing 'Hello, World!'' on the UART.
The book covers lot more than just C. Things like Assembly, Makefile, GDB based Debugging, Linker Scripts, C, Driver Writing etcโฆ The public draft is available for FREE for online reading.

A short course on the four fundamental ideas in the C language that will enable you to be productive and work with code bases written in C.

This course dives into the practical applications of the C language, emphasizing hands-on learning to solidify key concepts. Delivered in an engaging and unconventional style, the lessons go beyond theory, equipping you with the skills to apply C programming in real-world scenarios.
By the end of the course, youโll feel confident in your mastery of the C language, adept at using it alongside the tools and utilities professional C programmers rely on daily.
A quick hands on tour of the C language and a demo to experience it's raw power.
How to think like a computer scientist when working in the C language.
Introduction to the RISC-V ISA and how the text gets converted to 0s and 1s.
How to write assembly programs using the RISC-V RV32I instructions.
Explore the C Keywords to understand the scope and powers of the language.
Exploring the branching instructions the C language provides by means of hands on experiments.
How to save data and group instructions together.
Using the concepts learned in the previous sections to implement an interactive program.
Understanding strings, arrays, pointers, and the relation/differences between them.
Project based on the concepts learned in the previous sections. Implement a program to generate digital audion.
Exploring ways in which we can define data types that C doesn't already provide.
Using the concepts from previous sections to implement a sensor management system.
Exploring and understanding the operators available in the C language and how to use them.
Understand and learn how to use the Bitwise operations for bit manipulation. More importantly, discover the insights and reasons to use such manipulations.

In one intense, code-first course youโll build rock-solid mental models, wield multi-level pointers, function callbacks, void*, and heap safely, then read real kernel source like a pro.
From '&' vs '*' to dodging leaks and dangling pointers, leave with the exact pointer super-powers that separate junior coders from firmware ninjas.
`Zero fluff, 100 % hands-on.`
Youโll trade confusion for clarity in under an hour. Instead of dry definitions, youโll lock in a single, vivid mental image that turns every pointer into something you can literally see on a whiteboard or sketch on a napkin. Youโll discover what a pointer truly is (spoiler: itโs not just โa variable holding an addressโ), why the Linux kernel, FreeRTOS, Zephyr, and every serious RTOS lean on them like oxygen, and the three everyday firmware disasters that disappear once pointers click. By the end, youโll explain pointers to a five-year-old!
Youโll fire up a real dev environment in five minutes and start writing pointer code that compiles and runs on your laptop. Youโll declare your first pointer, watch the & operator spit out raw memory addresses, and use * to reach inside that address like a surgeon. By the time you finish, the difference between a pointer variable and the memory it guards will feel as natural as breathing, and youโll never again mix up โvalueโ versus โaddressโ in your sleep. No slides, no theoryโjust you, a terminal, and the exact four lines of code that make every kernel tick.
Youโll level-up from baby steps to ninja territory in one adrenaline-fueled sprint. Youโll chain ** together until youโre juggling triple-star pointers like a circus pro, then watch & peel them back layer by layer. Youโll see why an array name is secretly a pointer, where the two diverge, and how to build an array of pointers that makes qsort() and Linux device tables look trivial. By the final keystroke, youโll wield โmany *s and many &sโ without blinking, turn pointer-to-pointer into your secret weapon, and laugh at code that once looked like hieroglyphics, ready to debug any kernel structure on sight.
Youโll step inside actual RAM and treat memory like clay in your hands. Youโll point to ints, floats, and custom structs with surgical precision, then swap the clumsy (*p).field for the sleek p->field arrow that every Linux driver lives by. Youโll stride through arrays with p+1, discover why char* walks one byte at a time while int* leaps four, and sketch the exact memory map that turns a flat address into a living struct. By the end, youโll read any kernel data structure blindfolded, fix off-by-one bugs before breakfast, and never again wonder โwhere exactly does this pointer land?
Youโll discover exactly what a function pointer is, master its complete syntax, and clean it up with a single typedef. Youโll then build and run a real function-pointer array that stores multiple functions and calls any one by index.
Youโll master the shapeshifting void*: what it is, why it exists, and how to wield it safely. Youโll see NULL in action, learn the exact difference between a null pointer and NULL itself, and then dive straight into real Linux kernel code where void* carries structs, buffers, and callbacks across subsystems.
Youโll master the heap with malloc() and free(), catch allocation failures the moment they happen, hunt down every byte lost to memory leaks, rescue code from dangling pointers, stop double-free crashes cold, and lock out pointer manipulation that wanders into unowned memory.
You will examine pointers in Baremetal Code, trace their use in FreeRTOS, and study how they work in Linux.

A Short course focused on how to do bit-manipulation in the C Language work.
Understanding the concept of bit-manipulation, various operators available and doing hands on experiments to learn those.

A quick course on GDB and how to use it for debugging C based applications running on Linux as native applications and Firmware Code running on a development board.
Environment setup and a quick demo.
understanding what is GDB and how it works.
Hands on experiments to explore various GDB commands.
Diving into the basics of how the GDB commands can be automated by scripting.
Concluding thoughts and recommended next steps.

Data structures are heavily used in sophisticated embedded system software. This course focuses on the commonly used data structures and their use in applications using the C Language.
Course introduction and Environment setup to run the experiment.
A quick overview of the important concepts in the C language that will help with implementing Data Structures.
Understanding the terminology used to describe the performance aspect of the data structure.
Diving into the concepts of the foundational data structure of Linked Lists.
Understanding and implementing the Queues data structures
Understanding and implementing the Stack data structure in C.
Understanding why we would need the Tree data structure, the details and implementation in the C language.

An introductory course on the ARM Cortex-M CPUs. How to go about learning them.
Recommended for those new to the ARM M Class CPUs
Understanding the concept of bit-manipulation, various operators available and doing hands on experiments to learn those.
Understanding the vocabulary used in describing CPU architectures.
Learn ways to master any CPU architecture.
Explore how to think and reason about the CPU internals as a Software Engineer.
Explore the programmers model and the boot sequence of the ARM-M CPUs.
Concluding remarks and next steps.

A rigorous course on mastering the ARM Cortex-M CPU's programmer's model by implementing a Round Robin scheduler written in pure assembly language.
Learn the assembly programming for ARM Cortex-M CPUs by writing a scheduler from scratch, without using any IDE, SDK or boiler plate code.
The courses uses the QEMU emulator for a real hardware board (the experiments should also run on real hardware). To ensure that everyone has the same setup and doesn't get tangled in the setup issues - we use the GitHub Codespaces instance running a virtual machine configuration we defined. This section guides through the steps of accessing it.
This section provides a comprehensive introduction to the core concepts of ARM Cortex-M CPUs, laying the foundation for understanding their architecture and operation. Explore the mental model of the CPU, systems, and the Cortex-M controller, gaining insight into how these components interact.
Introduces the essentials of assembly programming for ARM Cortex-M CPUs, focusing on practical implementation. Start by exploring the processor boot-up process and writing their first assembly program, gaining hands-on experience with the Cortex-M environment. The section delves into the structure of instructions, their encoding, and how to analyze binary dumps to understand the low-level representation of code. Examine the anatomy of an assembly file, learning its components and organization. Master stack manipulation instructions, understanding their critical role in managing data and CPU context.
Covers the theoretical foundations of implementing a scheduler on ARM Cortex-M CPUs, enabling multitasking on a single processor. Explore how a single CPU can run multiple processes, uncovering the principles behind concurrent task execution. Covers the anatomy of a task, detailing its structure and role within a scheduler. Discover the critical techniques for context switching and scheduling, including the `trick` that facilitates seamless task transitions.
Practical implementation of a scheduler. Program the SysTick timer and verify its associated exception handling to ensure accurate timing for task scheduling. Covers techniques for saving and restoring CPU context, a critical step for seamless task switching. Set up tasks and their respective stacks, configuring the system to enable round-robin scheduling. Through hands-on exercises, implement round-robin scheduling and achieve process switching.
Final thoughts and next steps.

Make is a build automation tool that automatically updates files in your project based on their dependencies. It's primarily used for compiling source code, but can also be used to run other commands or perform tasks.
Understanding what make is and what it is used for.
Diving into the internals of how makefiles are to be written.
Implementing a project using the concepts learned in previous sections.
Exploring some other features of make.

This ๐ต๐ฎ๐ป๐ฑ๐-๐ผ๐ป ๐ฐ๐ผ๐๐ฟ๐๐ฒ dives into the ๐ฑ๐ฒ๐๐ฎ๐ถ๐น๐ ๐ผ๐ณ ๐๐ฟ๐ถ๐๐ถ๐ป๐ด ๐น๐ถ๐ป๐ธ๐ฒ๐ฟ ๐๐ฐ๐ฟ๐ถ๐ฝ๐๐ (based on GNU LD). Linker scripts are a must-have skill for firmware and systems engineers who have to deal with scenarios where the placement of various sections (code, data, etc) in the memory needs granular control. Engineers who work on Bootrom, Firmwares, Bootloaders, or otherwise are involved in lower-level systems code.

This course teaches the Rust programming language by programming a ARM Cortex-M3 controller from scratch.
You will learn the rust internals by disassembling the code into assembly and reason about the CPU memory interactions.
This section guides on the setup we use and dives into the detail of executing the Rust code on a Cortex-M3 based emulation target.
Lectures are being recorded and will be added to the course...

Learn FreeRTOS kernel by tearing it down to it's bare minimum and doing a port for a new target from scratch. This includes booting the CPU from scratch and placing the code in memory manually.

A short course introducing the Zephyr OS with hands on execution of an example. Recommended for beginners

Git and Gerrit are pivotal tools in the software development industry, each serving distinct yet complementary roles that enhance collaboration, code quality, and workflow efficiency.

ARM based CPUs powers majority of the modern Compute. This includes Phones, Tablets, Servers, Watches, Automotive infotainment among many others.
Assuming no prior experience, this course introduces the ARM 64 bit architecture (referred to as aarch64), how to think about it, and how to master it. Intended for anyone interested or getting started with the architecture.

Get a deeper insight into the ARM 64 Bit CPUs by booting and programming the `aarch64` based Cortex-A72 on the Raspberry-Pi4B - from scratch!
You will code both in Assembly and C to get the CPU to print 'Hello, World!' on the UART. There will be no IDE used. Everything right from the Linker script to the Makefile for the automation will be written from scratch.
Assumes no prior knowledge. Recommended for anyone wanting to understand how a application grade CPU boots from scratch.

A Course dedicated to understand the concepts of Virtual memory and the hardware components that enable it - the Memory Management Unit (MMU) and the System Memory Management Unit (SMMU).

Unlock the power of low-level system development with this hands-on video course, designed to guide you through the process of building a Linux kernel from source for the ARM64 architecture and running it on the QEMU virtual machine.
Perfect for developers, system administrators, and enthusiasts eager to dive into kernel development, this course provides a step-by-step approach to compiling, configuring, and deploying a custom Linux kernel, using BusyBox to create a lightweight userspace environment.

A hands on Introduction to Linux Device Driver development. Recommended for those getting started with driver development.

Course on writing and understanding how the Linux Device Drivers controls real hardware. In this course, we write a kernel driver for the GPIO port of Raspberry Pi - 4.
A quick demo of a device driver written from scratch controlling the GPIO hardware directly.
This section introduces the hardware components and the boot flow for the SoC powering the Raspberry-Pi 4B. To prove the point we boot a baremetal firmware that prints on the UART.
Moving away from the baremetal boot, we prepare the SD-Card and flash a Linux image that we will develop and the load our device driver.
Write a quick-n-dirty GPIO driver to turn the LED ON/OFF. Reason about the character driver.

The Linux kernel doesn't use the Standard C Library and implements the functions as it's own modern libraries. This course is focused on exploring the facilities and helper functions the kernel provides to manage data and different activities from the driver.

Learn how to tame huge code bases written in C. Techniques, tricks and general patterns that help understanding the structure and abstractions used in a repository.

This course focuses on Digital Circuit Design using FPGAs (Field Programmable Gate Arrays). Recommended for Software Engineers to help them understand how the underlying electronic machines work.

Casual Conversations with Embedded Systems Experts. We show up with the guests, you show up with ๐ฟ!!

Organised collection of topics, projects and questions from the web that a Embedded Engineer should know and be able to reasons about.

Live Tech Syncs with learners every once in a while where we discuss ad-hoc topics relating to Firmware and System Software Engineering.

A Community to grow with
Members get access to exclusive feed and chat space. You can chat with each other and us.


Electrical Engineer holding a Masterโs degree in Embedded Systems, with a proven track record at industry giants. At Intel, contributed expertise to Navigation Firmware, Bluetooth Driver development, and RF validation software.
Currently thriving as an Embedded Software Engineer at Google, drove innovation in Firmware development for the Power Management Sub-system on Tensor SoCs (Pixel Phones) and presently advancing system software for the Pixel Watch.

Computer Engineer holding a Masterโs degree in Embedded Systems. Worked on improving the debug architecture of the Bluetooth Firmware at Intel. Worked on ARM64 architecture, programming and exercising latest ARMv8/v9 extensions - programming in low-level FWs (ARM TF-A, trusty) and kernels (LK and Linux) at Google.
Currently exploring the Pixel Watch Kernel and BSP (boot-loaders, Linux Kernel, Android HALs and frameworks).

