ECEN 5713
Advanced Embedded Software Development
(Advanced Embedded Linux Development)
University of Colorado at Boulder
Fall 2024
Course Objective:
This course provides students with the fundamentals of embedded operating systems including a working understanding of how to configure and deploy a Linux based Embedded System. Students will gain expertise in software tools and development methods which can be used to create applications and build custom Linux based Embedded Devices
Outcomes
This course will focus heavily on designing concurrent software for embedded systems applications using the Linux operating system. At the end of this course, students will be able to...
Configure, build and deploy the Linux kernel from source.
Understand fundamentals of an embedded operating system based on Linux.
Build their own Embedded Linux distribution using Buildroot or Yocto frameworks.
Use System Programming concepts to develop application software for Embedded Devices, including File I/O, Threading, Signals, and time related POSIX APIs.
Write software for inter-thread and inter-process communication using sockets and signals
Debug concurrent software applications with command line GDB, Valgrind, and other software tools for debug, profile and tracing.
Create a custom Linux Device Driver
Understand Linux Driver related development topics, including debugging techniques, concurrency techniques, timing, memory allocation.
Understand best practices related to software update of Embedded Devices in a production environment.
Showcase their knowledge in a final project which demonstrates course concepts on hardware.
Logistics
3 Credit Hours
Workload: 15 hours per week for work including Lectures, Programming Assignments, Course Projects, Readings, and Quizzes
Lecture: Asynchronous video content and weekly synchronous review sessions in ECCR 105
Class Period: Class Virtual/Remote via Zoom Wednesdays 3:35 to 6:05 PM. All students have the option to attend in-person or via Zoom.
Contact:
Instructor: Dan Walkes <daniel.walkes@colorado.edu>
Teaching Assistants: Pranjal Gupta, Sai Mandadi
Prerequisite(s)
ECEN5813 - Principles of Embedded Software
Knowledge of C Programming and embedded computer architecture.
Working knowledge of Linux command line operations, shell programming, Git, makefiles
Course Topics
Linux Operating System
System Calls
Kernel Space vs User Space
Kernel Modules
Processes, Threads, pThreads
IPC Mechanisms & Communication
Process Synchronization
Interrupts
Scheduling
Virtual Memory
Remote Debugging using GDB
Linux Kernel Driver Development
Building and running modules
Developing Character Drivers
Driver Debug Techniques
Time, Delays and Deferred Work
Data types in the Kernel
Software Engineering and Programming Topics
Course Materials
Course materials include textbooks, papers, lecture slides, project guides, and other online materials.
Textbooks (CU Bookstore/Online)
Textbooks are optional, but will cover the background of the course content and are used as references for course material.
Mastering Embedded Linux Programming (2nd Edition), Chris Simmonds (ISBN 9781787283282 )
Linux System Programming (2nd Edition), Robert Love (ISBN 978-1449339531)
Linux Device Drivers (Latest Edition) - Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman
PC Requirements
Students need a computing platform for this course (laptop machine preferrably) with at least 16GB of RAM (8GB of which you can devote to a virtual machine) and running Windows or MacOS x86_64, supporting VirtualBox minimum requirements, with at least 100GB of free disk space (ideally 200GB or more). Only x86_64 based host computing environments are supported currently. You may use a Cloud Based Development Host if necessary/desired. See the Development Host Setup Instructions used to setup the build platform used for this course. Alternatively, you can use dedicated hardware capable of running Ubuntu 18.04 with at least 8GB of RAM and 100GB of disk space. All students should ensure the have a computer available with web camera and microphone (for use with lecture, project scrum, and proctored exams). Please note that Windows Subsystem for Linux (WSL) is unfortunately not yet sufficient for completion of course content.
Required Development Board
The first 2/3 of the course will use an emulator for development. The last 1/3 of the course will require hardware of a student's choosing for their final project. Platforms supported by the department include Beaglebone Black and Raspberry Pi. The department has limited inventory of these platforms available for on campus students. Remote students will need to procure their own hardware for the last 5 weeks of the course.
Required for Distance students:
Students attending the class remotely (off the CU Boulder campus) should ensure they have a reliable internet connection with broadband bandwidth speeds.
Course Content
Course lectures, assignments, grades, quizzes, and announcements will use Canvas.
The midterm and final exam will be proctored online through Canvas. All remote students must have A PC with a microphone and web camera and a reliable internet connection (minimum 5 megabits per second download speed) to support online proctored testing. On campus students will take these tests in-person with an in-room proctor.
Other online materials
Example Final Project Submissions
See links to previous class final project submissions below:
Honor code
A complete description of the honor code can be found here .
To summarize: "Violations of the Honor Code are acts of academic dishonesty and include but are not limited to plagiarism, cheating, fabrication, aid of academic dishonesty, lying to course instructors, lying to representatives of the Honor Code, bribery or threats pertaining to academic matters, or an attempt to do any of the aforementioned violations."
ESE Academic Integrity Policy
Any suspected violations of the Honor Code will be submitted to our Office of Student Conduct and Conflict Resolution (OSCCR). Students found responsible by our faculty for violating the cheating policy of the Honor Code will be expelled from the course with a failing grade. A second such violation will result in expulsion from the ESE program and courses. Further non-academic sanctions may be rendered by the OSCCR. We have a zero-tolerance policy and there are NO first-offense warnings. We take these issues seriously and have a responsibility to all students who uphold the Honor Code, and to the highest industry standards for which we are preparing students. If you have any questions whatsoever regarding what collaboration is permissible in the course, consult your instructor directly before proceeding. Sharing of knowledge between students is highly encouraged; however, each student is expected to independently create and implement their own project files and submit original content for all assignments and exams. Students may find that they are able to leverage firmware designs from books, magazines, the internet, or their work environments; however, in these cases, students are expected and required to fully credit the source of the information clearly and completely. Again, by default, students are expected to turn in their own original work and cite any and all portions they did not create. All aspects of the Honor Code apply.
You Should Consider Taking This Course If...
You have a basic understanding of C/C++ and embedded systems programming but may have less experience with Linux development.
You have some level of experience with Linux development but have less experience with development or deployment of Linux based Embedded Devices.
You have some user space Linux Programming experience but less experience with Linux Driver and Linux Kernel development.
You want to learn more about the details of how a Linux system works from boot time to the login terminal.
You need to learn latest best practices for building production Embedded Systems and the tradeoffs when choosing from available build systems.
Interview Questions You Will Be Able To Answer After Completing This Course
What are some common open source licenses and what are the differences between them?
What are the fundamental components of an Embedded Linux software?
What is a cross toolchain and how does it work?
What is the difference between Linux Processes and Linux Threads?
What are some strategies for dealing with concurrency in Linux multithreaded programs?
What are some examples of Linux Interprocess Communication mechanisms and what are tradeoffs of each example?
What are some build frameworks for Embedded Linux devices and some tradeoffs of each?
Describe at a high level how user space software interacts with the Linux Kernel.
What are some differences in writing code for user space vs kernel space?
What are the steps involved in writing or modifying a Linux Kernel Driver?
Describe strategies for OTA or field update of Embedded Linux devices.