The majority of my teaching and my true passion has always been in undergraduate education. I have taught a wide variety of Computer Engineering and Computer Science courses at Indiana University (IU) and Cornell including digital systems, computer structures, embedded systems, computer architecture, computer networks, and operating systems. I have created a number of substantial and successful ``hands-on'' undergraduate courses. These efforts included the design and implementation of the laboratory experiments and laboratory infrastructure, writing open source tutorial materials, and successfully soliciting in excess of $800,000 of industry support for course development.
For the past decade I have taught Computer Structures C|H335, which previously was a course on assembly language programming. While I still teach some assembly programming, I use this as a way to understand the stack-based execution model utilized by most compilers. In contrast with the approach often taken in such courses, I examine in depth the application binary interface (ABI) that serves as a contract between assembler and compiler by defining how objects are represented in memory, how registers and the stack are used to both interact with procedures and for temporary storage by procedures. My lecture notes for this course are available at lecture notes. I derived this approach directly from my experiences with the Lx/ST200 VLIW project at Hewlett-Packard Laboratories.
Computer Structures is also a major laboratory course -- while the lecture focuses on the core processor, the weekly three hour laboratory focuses upon the interaction between the processor and the physical world. During the time I have taught this course I have completed two major (and several minor) revisions. Initially I had the students use a modified children's toy, goofy giggles (An early document from this effort is goofy), to which we added a small processor board (initially an MSP430 and later an ARM based NXP) to allow the students to augment the toy's repertoire -- for example performing a small dance. Recognizing that this was an extremely successful (and popular) learning exercise, I wanted to do even more to prepare students for independent design work. This led me to redevelop the laboratory using readily available off-the-shelf modules with the hope that students could use the course as a launchpad for creating their own systems. The manual for this more recent approach is lab manual.
The following are courses I have taught at IU.