
Identify and map the 44-pin device pinout, including 3.3v power, ground, reset, and clock pins. Connect a 20 MHz crystal with load capacitors and configure programming pins and reset pull-up.
Explore simulators like MPLAB X and Proteus to develop and debug embedded software for PICs, run code without hardware, and visualize circuits, LEDs, and LCDs.
Introduce decoupling through a base support package and a unified system call interface to portable embedded software across MCUs. Explore tasks with priorities, preemption, and IPC, including periodic executions.
Explore shared resources in a primitive kernel prototype, learning how preemption, race conditions, and mutual exclusion affect LCD and TFT displays through system calls and BSP interactions.
Learn how a preemptive task switch saves each task's 32 registers and stack pointer to preserve its execution context on the stack, then restores it for seamless resumption.
Explore how kernels manage cpu time, perform context switching, and provide inter task communication, contrasting non-preemptive and preemptive scheduling with led-based visualizations and practical examples.
Explore how the system tick, driven by a crystal-fed hardware timer and a prescaler, steers the scheduler; use PWM on timer two to produce 1 kHz and 2 kHz tones.
Explore the PIC32 microcontroller, a MIPS 32 platform with timers, UART, SPI, I2C, ADC and DMA, and learn assembly basics—from load/store to procedure calls and delay slots.
Explore the microchip embedded connectivity starter kit with harmony three to rapidly prototype adc-based joystick input, spi-driven tft output, and usb/uart interfaces, enhanced by an analog multiplexer.
Build an essential board support package for target system, configuring stage one hardware (LEDs, micro SD, SPI-2, UART over USB via the MCP2221), and a boot loader with DFU upgrade.
Perform uart testing by sending capital a every two seconds, observe start and stop bits, eight lsb data bits, and echo uppercase received characters back through the serial console.
Implement a simple preemptive scheduler that checks the highest priority ready task against the running task, waking tasks on time delays or events and preempting the running one.
Implement mutexes to enforce mutual exclusion on shared resources, explain lock, unlock, and ownership mechanics, and introduce semaphores and priority inversion protection in an embedded systems OS development context.
Explore the priority inversion problem and implement priority inheritance to avoid it in a mutex-based system, enabling high-priority tasks to proceed by elevating the mutex owner's priority.
Implement inter-task communication via a mailbox, a fifo queue of os messages with sender and data fields, supporting create, delete, push, pull, and blocking or non-blocking behavior.
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).