CS-454/654 - Spring 2024

Computing is undergoing a drastic shift. It is becoming ubiquitous, as ordinary objects become increasingly more connected and “smart”. This transformation is only possible thanks to the recent and drastic progress in the design and availability of low-power, low-cost, yet powerful embedded microcontrollers. Embedded systems significantly differ from traditional computing systems as they are tightly coupled with their physical environment via sensors and actuators. This course explores challenges in design and implementation that are specific to this class of systems. These include: bare-metal (i.e. without OS) application development, understanding of I/O protocols and communication, microprocessor debugging, sensing and filtering of environmental metrics, practical and efficient implementation of sense-control-actuate loops (PIDs). Concepts delivered in this course are fundamental to provide a required know-how for students interested in smart systems, Internet of Things (IoT), safety-critical systems, autonomous systems, and the like.

This course is intended to complement the strong theoretical backbone of CS courses with a hands-on learning experience that delves down to the raw interfaces between a computing platform and I/O peripherals, which are in turns the gateway to the physical world (sensors & actuators). The course will allow students to apply some of the concepts explored in system courses such as CS210, CS350 and CS451. At the same time, it will constitute a one-of-a-kind opportunity to explore the boundary between software/firmware and hardware. The course is designed to have the following learning outcomes: (1) design of embedded systems for automatic and autonomous control of cyber-physical systems; (2) modeling and analysis of schedulability, temporal correctness, and soundness in usage of memory resources; (3) demonstration of system design principles in the lab.


  • CAS CS-210: Programming and basic software/hardware interface concepts.
  • (recommended) CAS CS-350: Fundamentals of Computing Systems.
  • Please contact the instructor(s) ahead of time if you do not satisfy any of these prerequisites.

Credit Hours: 4

Course Objectives:
The typical know-how that students are expected to acquire with this course should allow them to:

  • understand the units that compose a bare-metal firmware;
  • interface with I/O devices in a micro-controller;
  • understand the intricacies of interfaces between the digital and the physical world;
  • experiment the programming models of popular communication interfaces (e.g. SPI, UART, USB);
  • apply concepts in signal processing to noisy sensor data streams;
  • apply concepts in contro theory to synthesize digital stability controllers;
  • handle real-time periodic and aperiodic application workloads;
  • and familiarize with the structure of RTOS's (e.g. FreeRTOS).

The course will require the students to write code that operates on the Amazin Ball platform (consult the Syllabus for more info), and on Linux. A (small) room (EMA 305) has been dedicated for this purpose, and will be accessible to all the enrolled students from 10am to 10pm on all the days of the week (including weekends), and except for Friday. On Friday, the lab will be accessible from 10am to 6pm.

There will be a total of 10 labs touching on the more practical aspects of the course. Theoretical concepts will be covered in a set of 5 homework assignments.

Labs will be conducted in teams of 2-3 people. You are supposed to work together to solve the lab assignment at hand. It is fine to work as a team and divide responsibilities, but each and every team member is expected to know in detail each lab solution produced by their team.

All the documentation for the pieces of equipment used in the lab will be available here, as well as on the official Piazza page.