We may earn an affiliate commission when you visit our partners.
Victor Huerlimann

In this course you will learn how to create an Embedded OS, really from the ground up.

You will be guided step by step in the creation of each and every technical software module composing an embedded operating system, as well as in the development of your own target device on the bench (optional: you can use a free simulator or a ready-to-use Starter Kit), starting with basic electronic components and an industry-standard processor.

Read more

In this course you will learn how to create an Embedded OS, really from the ground up.

You will be guided step by step in the creation of each and every technical software module composing an embedded operating system, as well as in the development of your own target device on the bench (optional: you can use a free simulator or a ready-to-use Starter Kit), starting with basic electronic components and an industry-standard processor.

You will learn how to create device drivers step-by-step for real hardware components like displays, SD card storage, Wi-Fi, Inertial Movement Units (IMU, i.e. accelerometer and gyroscope), USB communication, analog Joysticks, thermal camera modules and more.

By the end of this course you will master system-level programming in the assembly and C languages, as well as the technical processes governing the interaction between CPU and memory. Thanks to the numerous hands-on experiences and practical demonstrations, you will develop the ability of gaining full control on the machine by manipulating CPU registers, stack, instruction pointer, return addresses, and much more. At the end of the software development part, you will learn how to create a porting to another architecture, like x86.

Although the hardware development part is optional, if you have access to an electronics lab you will also develop the ability of prototyping your circuit, designing and assembling your own target PCB (Printed Circuit Board).

Enroll now

Here's a deal for you

We found an offer that may be relevant to this course.
Save money when you learn. All coupon codes, vouchers, and discounts are applied automatically unless otherwise noted.

What's inside

Learning objectives

  • Learn how to build an embedded system from the ground up on the bench. this will give you a great insight into the target platform, but is not mandatory
  • Learn how to program a microcontroller from scratch by setting up wiring, clocking, connecting the programmer, and flashing binary applications to the chip
  • Get a deep insight into what an operating system is, when you need one, and how it works on embedded platforms
  • Understand kernels, multitasking, context switching, scheduling, critical sections, and task synchronization from a practical perspective
  • Understand cpu architectures in general and how to choose a target cpu. deep understanding of the mips32 arch internals, like registers and memory layout
  • Programming of advanced applications for the microchip pic32 (mips32) microcontroller
  • Develop board support packages (bsp) for a target platform
  • Deep and practical understanding of data communication over the spi and i2c busses, as well as serial communication via uart modules (including usb-to-serial)
  • Learn how to develop a preemptive and cooperative kernel based on cpu-specific assembly code for task context switching
  • Learn how to provide efficient internal services for time, task, and memory management
  • Learn how to create inter-process communication (ipc) with mailboxes and message queues
  • Get a deep understanding of - and learn how to implement - real-time constraints in order for an operating system to be considered an rtos (real-time os)
  • Understand the priority inversion problem and learn how to implement specific countermeasures
  • Learn device driver development. we will develop drivers step by step for our target platform's peripherals, such as the display and the microsd card
  • Interfacing user application to the os
  • Understand how to write a binary image to the target platform's program flash at runtime, and create a usb/uart bootloader
  • Learn how to make a porting of the os, making it executable on different cpu architectures
  • Understanding of the target platform's electrical schematic and pcb layout (optional)
  • Show more
  • Show less

Syllabus

Meet Victor and Get an overview of the course
Course Presentation
Motivation
Environment Preparation
Read more

This section contains the complete OS sources, ready-to-compile inside the Microchip MPLAB-X IDE.

In this lecture I am presenting how to port an existing IMU driver from Arduino to PIC32, easily and quickly.

This can be done thanks to the BSP that we have developed in chapter 6.

- MPU6500 Breakout PCB Design: https://oshwlab.com/hvictor/mpu6500_breakout

- The driver project is available in the resources of this Lecture: MPU6500_Driver.X.zip

- The Test Application (Windows) is available in the resources as well: MPU6500_TestApp.cs

For the Test Application, you will need to create a C# .NET project in Visual Studio.

The project will need the reference to the OpenTK 3.2.0 and OpenTK.GLControl 3.1.0 Nuget Packages.

If you have trouble setting up the Test Application, drop me a message and I will help you and/or provide you the Visual Studio Solution.

In this lecture I'd like to guide you through the whole process of designing a functional ESP32-based Wireless Device featuring Wi-Fi and Bluetooth! You will learn how to make a circuit board built around the Espressif ESP32,  and to write firmware for it using the industry-standard FreeRTOS real-time kernel, creating a wireless video-streaming application. In the lecture resources you can find the complete source code, as well as the hardware schematics, Gerber files, BOM and pick-and-place file.

Learn how to build an FM modulating circuit, and use it to transmit the analog video from a camera! You can build your own radio CCTV system, or many cool devices that use the FM modulation to transmit video and audio.

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
Provides hands-on experience with assembly and C languages, which are essential for low-level system programming and embedded systems development
Covers the development of device drivers for real hardware components, such as displays, SD cards, and Wi-Fi modules, which is a practical skill for embedded systems development
Explores CPU architecture concepts like registers and memory layout, providing a foundation for understanding how software interacts with hardware at a low level
Includes an optional hardware development component, allowing learners to prototype circuits and design PCBs, which is valuable for those interested in hardware engineering
Focuses on the Microchip PIC32 microcontroller, which may limit the breadth of knowledge gained about other microcontroller architectures
Requires access to electronic components and potentially an electronics lab for the optional hardware development part, which may be a barrier for some learners

Save this course

Create your own learning path. Save this course to your list so you can find it easily later.
Save

Reviews summary

Deep dive into embedded os development

According to students, this course offers a deep, practical dive into embedded systems and OS development. Learners particularly praise the hands-on approach, allowing them to build a real OS from scratch. The course provides a solid foundation in low-level programming, covering assembly, C, and hardware interaction. While the material is comprehensive and well-structured, many reviewers note it requires a strong prerequisite in C and assembly and can have a steep learning curve. The practical labs and projects, especially building the kernel and device drivers, are frequently highlighted as the most valuable parts, offering significant real-world skills.
Can follow with simulator or real hardware.
"Appreciated the option to use the simulator initially before getting hardware."
"Using actual hardware (PIC32) made the learning experience much richer, though optional."
"The hardware setup guide was helpful if you choose to go that route."
"Simulation is possible, but real hardware is recommended for the full experience."
Logical progression through OS concepts.
"The course structure builds concepts logically from basics to advanced topics."
"Modules are well-organized, making it easy to follow the progression."
"Content flows smoothly from theory to practical implementation."
"Lectures and labs are integrated effectively."
Practical experience building hardware drivers.
"Learning to write device drivers step-by-step was incredibly valuable."
"The examples for SPI, I2C, and UART drivers were very practical."
"Developing the BSP is a key takeaway for real-world embedded projects."
"The driver porting example was a great demonstration of applying the concepts."
Detailed look at C, assembly, hardware interaction.
"The course goes deep into assembly and C, which is essential for embedded work."
"Understanding CPU registers and memory layout was explained very well."
"Excellent coverage of interrupts, context switching, and system tick implementation."
"I learned how to manipulate CPU registers and stack pointers effectively."
Build a real OS kernel from scratch.
"Building an OS from the ground up gives you a deep understanding of how things work."
"The practical labs and coding exercises are excellent, really solidify the concepts."
"I loved getting my hands dirty and implementing the kernel myself."
"This is not just theory; we actually code a functional embedded OS."
Material can be challenging and dense.
"The course is challenging, but rewarding. Be prepared to invest significant time."
"Some sections moved quite fast, requiring me to re-watch lectures."
"This is a very deep topic, and the course reflects that difficulty."
"It's tough material, but worth it if you stick with it."
Demands solid C and assembly background.
"Definitely not for beginners. A strong understanding of C and assembly is crucial."
"If you're not comfortable with pointers and low-level concepts, you'll struggle."
"Make sure your C programming skills are solid before starting this course."
"Previous experience with microcontrollers or assembly is highly recommended."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Embedded Systems and Operating System Development with these activities:
Review Assembly Language Fundamentals
Strengthen your understanding of assembly language, which is crucial for understanding CPU architecture and low-level system programming in this course.
Browse courses on Assembly Language
Show steps
  • Review basic assembly instructions and syntax.
  • Practice writing simple assembly programs.
  • Understand memory addressing modes.
Read 'Operating System Design and Implementation'
Supplement your learning with a classic text on operating system design to gain a deeper understanding of the underlying principles.
View Melania on Amazon
Show steps
  • Read the chapters related to kernel design and process management.
  • Take notes on key concepts and algorithms.
  • Compare the book's approach to the course's practical implementation.
Implement a Simple Task Scheduler
Solidify your understanding of task scheduling by implementing a basic scheduler with context switching.
Show steps
  • Design the data structures for tasks and their states.
  • Implement context switching using assembly language.
  • Create a simple scheduler that switches between tasks.
  • Test the scheduler with multiple tasks.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Create a Blog Post on Interrupt Handling
Reinforce your knowledge of interrupt handling by explaining the concepts in a clear and concise blog post.
Show steps
  • Research different types of interrupts and their uses.
  • Write a blog post explaining interrupt handling in embedded systems.
  • Include code examples and diagrams to illustrate the concepts.
  • Publish the blog post on a personal blog or online platform.
Practice SPI and I2C Communication
Improve your proficiency in SPI and I2C communication by practicing with different devices and configurations.
Show steps
  • Set up a development environment with SPI and I2C peripherals.
  • Write code to communicate with different SPI and I2C devices.
  • Debug and troubleshoot communication issues.
  • Experiment with different clock speeds and configurations.
Read 'Embedded Systems Architecture'
Expand your knowledge of embedded systems architecture to make informed decisions about hardware selection and system design.
Show steps
  • Read the chapters related to CPU architecture and memory organization.
  • Take notes on key concepts and design considerations.
  • Relate the book's content to the course's hardware development section.
Contribute to an Open-Source Embedded OS Project
Deepen your understanding of embedded OS development by contributing to an open-source project.
Show steps
  • Find an open-source embedded OS project on platforms like GitHub.
  • Explore the project's codebase and documentation.
  • Identify a bug or feature to work on.
  • Submit a pull request with your changes.

Career center

Learners who complete Embedded Systems and Operating System Development will develop knowledge and skills that may be useful to these careers:
Embedded Systems Engineer
As an Embedded Systems Engineer, you'll design, develop, and test embedded systems, often involving both hardware and software components. This course directly aligns with the role by providing hands-on experience in creating an embedded operating system from the ground up. You will gain expertise in system-level programming and low-level interactions between the CPU and memory. The course's focus on device driver development, particularly for components like displays and SD cards, is crucial for success as an Embedded Systems Engineer. The deep dive into CPU architectures, assembly and C languages, and board support packages offered by the course helps build a strong foundation for this career.
Firmware Engineer
A Firmware Engineer develops the low-level software that controls hardware devices. This course provides practical experience in writing device drivers and system-level code, essential skills for a firmware engineer. The course covers the creation of a basic embedded operating system including kernel aspects such as multitasking, context switching, and scheduling. Also this course helps build a foundation in low-level programming using assembly and C, giving you the knowledge to work effectively with hardware interfaces and CPU architecture. The course's curriculum emphasizes practical programming which is very applicable to the work of a Firmware Engineer.
Operating Systems Developer
An Operating Systems Developer works on the core software that manages computer hardware and resources. Taking this course helps build a strong understanding of operating system principles and their practical implementation. The course focuses on building an embedded operating system from scratch. It provides hands-on experience with kernels, multitasking, context switching, scheduling, and task synchronization. The course allows you to master system-level programming in assembly and C languages. The learnings in this course help build a good foundation for working on operating systems for various platforms.
Internet of Things Engineer
An Internet of Things Engineer designs and develops connected devices and systems. This course is highly relevant as it covers the creation of embedded operating systems, which are the foundation for many IoT devices. The course's device driver development section will give you practical experience in interfacing with real hardware components, which is essential for designing IoT solutions. You will learn about data communication protocols like SPI, I2C, and UART, all of which are commonly used in IoT devices. The practical demonstrations and hands-on experiences in the course help build a strong understanding of the underlying technologies used in the IoT space.
Robotics Engineer
A Robotics Engineer designs, builds, and programs robots and automated systems. This course allows you to develop skills in embedded systems and operating system development, which are crucial for controlling robotic hardware. The course's focus on device drivers for sensors like IMUs, accelerometers, and gyroscopes helps build practical expertise in interfacing with robotic components. The course content around low-level programming, CPU architectures, and real-time constraints contribute to your ability to build robust and responsive robotic systems. This course will help you gain a deep understanding of the software and hardware aspects of robotics.
Device Driver Developer
A Device Driver Developer creates the software that enables operating systems to interact with hardware devices. This course places a strong emphasis on device driver development, guiding you step-by-step through creating drivers for real hardware components like displays and SD cards. This practical, hands-on approach separates this course from theoretical treatments of the same material. In addition, the course covers low-level programming in assembly and C, giving you the in-depth knowledge needed to effectively control hardware. The course will help you to develop a strong skillset for a successful career as a Device Driver Developer.
Automation Engineer
An Automation Engineer designs and implements automated systems for various industries. This course is beneficial because it provides a foundation in embedded systems and operating system development, often used in automation controllers. The course offers practical experience in programming microcontrollers and creating device drivers, skills directly applicable to automation projects. The course touches on real-time constraints and inter-process communication, important considerations when designing reliable automation systems. The knowledge gained in this course helps in understanding how to build and customize automation solutions for different applications.
Kernel Developer
A Kernel Developer works on the core of an operating system, responsible for managing system resources. This course directly contributes to this career path by providing hands-on experience in building an embedded operating system from the ground up. The course focuses on kernels, multitasking, context switching, scheduling, and task synchronization. You'll learn how to implement these fundamental concepts in practice, using assembly and C languages. The course helps build a strong grasp of the internal workings of an operating system, equipping you with the skills needed for Kernel Developer roles.
Hardware Engineer
Hardware Engineers design, develop, and test computer hardware components and systems. This course may be useful as it offers insights into the interactions between hardware and software, particularly in embedded systems. The course covers CPU architectures, memory layout, and device driver development, which can help you understand how software interacts with hardware at a low level. The optional hardware development part of the course, where you can prototype circuits and design PCBs, can be valuable practical experience. The course may help you gain a broader perspective on hardware design, enabling you to create more efficient and integrated systems.
Systems Architect
A Systems Architect is responsible for designing the overall structure and integration of complex software and hardware systems. This course may be useful for understanding the low-level details of embedded systems and operating system design, which can inform high-level architectural decisions. The course covers CPU architectures, memory management, and inter-process communication, providing insights into the constraints and capabilities of embedded platforms. The course can help a Systems Architect make informed decisions when designing systems that incorporate embedded components.
Technical Lead
A Technical Lead guides a team of engineers in designing and developing technical solutions. This course may be helpful by helping you understand the fundamentals of embedded systems and operating system development. The course's emphasis on CPU architectures, assembly and C languages, and device driver development provides a solid technical foundation. The ability to create a porting to another architecture, like x86, could be valuable when leading projects involving different platforms. The course potentially provides a broader understanding of the technologies involved in embedded systems, helping a Technical Lead guide their team effectively.
Software Engineer
A Software Engineer designs, develops, and tests software applications. Although this course focuses on embedded systems, it may be useful in providing a deeper understanding of low-level programming and system architecture. The course covers assembly and C languages, CPU architectures, and memory management, which can be beneficial for optimizing performance in software applications. Understanding device driver development and inter-process communication can also broaden your knowledge as a software engineer. The course may help you understand the underlying hardware and operating system, leading to better software design.
Test Engineer
A Test Engineer designs and implements tests to ensure the quality and reliability of software and hardware products. This course may be useful for Test Engineers who work on embedded systems, providing a deeper understanding of the underlying technologies. The course covers CPU architectures, device driver development, and real-time constraints, which are important factors to consider when testing embedded devices. The ability to understand the system-level programming and low-level interactions helps in designing effective test strategies. The course may help you to develop comprehensive test plans for embedded systems.
Product Manager
A Product Manager is responsible for defining and managing the strategy, roadmap, and feature set for a product. This course may be useful for Product Managers who work on products that incorporate embedded systems. By understanding the fundamentals of embedded operating systems, device drivers, and CPU architectures, a Product Manager can make more informed decisions about product features and technical feasibility. The knowledge of real-time constraints and inter-process communication can also help in defining product requirements. The course may help a Product Manager communicate effectively with engineering teams and make strategic decisions about embedded products.
Technical Sales Engineer
A Technical Sales Engineer uses technical knowledge to explain the benefits of a company's products or services to potential customers. This course may be useful for Technical Sales Engineers who sell embedded systems or related technologies. By understanding the fundamentals of embedded operating systems, device drivers, and CPU architectures, a Technical Sales Engineer can effectively communicate the technical advantages of their products. The knowledge of real-time constraints and inter-process communication can also help in addressing customer concerns. The course may help a Technical Sales Engineer build credibility with customers and close deals.

Reading list

We've selected two books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Embedded Systems and Operating System Development.
Provides a detailed overview of embedded systems architecture, covering topics such as CPU selection, memory organization, and peripheral interfaces. It valuable resource for understanding the hardware aspects of embedded systems development. This book is more valuable as additional reading to provide breadth to the existing course. It is commonly used by industry professionals.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser