04-801-M2   Principles of Embedded Software

Location: Africa

Units: 6

Semester Offered: Intermittent

Course discipline


Course description

Sitting at the center of modern industrial processes, transportation, medicine, and consumer devices, embedded systems are already ubiquitous, and of growing importance. As more devices and processes connect in more sophisticated ways to the Internet, the demand for complex embedded software is likely to increase. This course provides students with a foundation in the software engineering principles necessary for embedded systems, and as such, will focus on developing a strong understanding of the C programming language as it is used in professional embedded software. The course will break down the interactions between software and hardware; study the implications of the C programming language to the underlying architecture; provide C programming applications; and instill efficient, high-performance, and robust software design techniques. Testing and debugging practices will be developed and refined.

The course will maintain a strong hands-on focus, with roughly biweekly individual coding assignments performed on an embedded development board. After completing the course, students will be well situated to pursue further study and eventually a career in embedded software development. Student progress is assessed by performance on the assignments and classroom participation.

Learning objectives

Students will be introduced to important features of the C programming language, including integer representation, pointers, structures, arrays, and strings. Students will learn about how the embedded toolchain works and will be introduced to ARM assembly language. After developing a firm grounding in the C language and the toolchain, we will move to introduce some of the subsystems common on many microprocessors: GPIO, timers and counters, PWM generation, I2C, and UARTs. Throughout the course, we will develop insights into robust software engineering practices; when and how to optimize; strategies for testing; and techniques for debugging.


Upon completing this course, students will be able to:

  • Develop embedded software in a “bare metal” (no operating system) context, using common design patterns such as state machines and interrupts.
  • Describe the tradeoffs between software generality and performance optimizations.
  • Employ a range of debugging techniques to understand why problems are happening and how to fix them.
  • Develop robust automated test suites to ensure software quality.
  • Explain how to write software around common microprocessor subsystems, including GPIO, timers and counters, PWM generation, I2C, and UARTs.

Content details

  • Overview of embedded systems
  • C language: Integer representations and bit operations
  • C language: Pointers, arrays, strings, structs, circular buffers
  • Testing strategies
  • Memory map on an embedded device
  • The embedded software toolchain
  • How to interpret a data sheet, and GPIO
  • State machines
  • Timers & PWM
  • Interrupts & Critical sections
  • Coding style and elegance
  • Serial communications, focusing on I2C and UART
  • Common protocols over serial, including an interactive command processor




Howdy Pierce