Schedule


Below is a preview of our week-by-week plan for the entire quarter. There may be slight adjustments and rearrangements as we go. The schedule for the final project is set and will not change.

In the readings below, K&R refers to Kernighan and Ritchie's classic text The C Programming Language (accessible via Stanford's subscription to Safari Books Online). Nick Parlante's EssentialC is another great C reference. Please do the recommended readings before lecture for best effect!

Date Topics/Readings
Week 1
Lecture
Mon 3/28
Introduction and Welcome ( slides)

Readings:

Lab/assign Lab 0: Orientation ( writeup)

Please do the Lab 0 prelab preparation before coming to lab.

Assignment 0: Git oriented ( writeup)
Lecture
Wed 3/30
ARM processor and architecture ( slides, code )
Week 2
Lecture
Mon 4/4
ARM assembly and machine code ( slides, code )
Lab/assign Lab 1: Setup your Raspberry Pi ( writeup)

Please do the Lab 1 prelab preparation before coming to lab.

Assignment 1: Implement a Larson Scanner ( writeup)
Lecture
Wed 4/6
From Assembly to C ( slides, code )
  • Review sections A3.2 and A3.3 on conditional execution and branch instructions from the ARM Instruction Set manual
  • Our one-page guide to ARM.
  • Brush up on C basics (syntax, data types, operators, control structures) via your favorite C reference; sections 1-2 of Nick Parlante's EssentialC; or chapters 1, 2, and 3 of K&R. Skip content on I/O and standard libraries (we are bare metal!)
  • Read Dennis Ritchie's account of the history of C
  • Try out the Compiler Explorer demoed in lecture
  • Read our guides on make and gcc
Week 3
Lecture
Mon 4/11
C Pointers and Arrays ( slides, code )
  • Before lecture, read EssentialC chapters 3 (skip material on structures) and 6 (skip material on the heap and memory management) or K&R 5.1-5.4. C-strings are primitive compared to Java/C++ strings; take note of the manual effort required to use and pitfalls to avoid.
  • Poul-Henning Kamp's essay on The Most Expensive One-byte Mistake. Did Ken, Dennis, and Brian choose wrong with NUL-terminated text strings?
  • C volatile can be subtle and tricky. See GeeksForGeeks advice on correct use and John Regehr's blog on what NOT to do with volatile
Lab/assign Lab 2: Below C Level ( writeup)

Prelab to prep before lab.

Assignment 2: Implement a Clock ( writeup)
Lecture
Wed 4/13
C Functions ( slides, code )
Week 4
Lecture
Mon 4/18
Communication and the Serial Protocol ( slides, code )
  • Read about characters and strings, IO functions (putc,puts,printf), and structures (Sections 1.5, 1.6, 1.9, 5.5, 6, 7 in K&R; or Section 3 in EssentialC).
  • Read Sparkfun's tutorial on serial communication.
Lab/assign Lab 3: Debugging and Testing ( writeup)

Prelab to prep before lab.

Assignment 3: Implement a String Formatting Library ( writeup)
Lecture
Wed 4/20
Modules, Libraries, and Linking ( slides, code )
Week 5
Lecture
Mon 4/25
Memory Management ( slides, code )
  • Read our overview of ARM stack frames
  • Review dynamic memory allocation (malloc/free in C) and the operation of the heap (K&R 5.6-5.9 or Essential C Section 6). Consider the comparison/contrast between stack and heap allocation and use cases for each.
Lab/assign Lab 4: Linked and Loaded ( writeup)

Prelab to prep before lab.

Assignment 4: Backtrace and Malloc ( writeup)
Lecture
Wed 4/27
C Mastery ( slides, code )

We've crossed the halfway point! We will use this lecture to catch-up/expand on lecture content covered lightly on first pass, and discuss how to further your mastery of C.

Readings:

Week 6
Lecture
Mon 5/2
Keyboards and the PS/2 Protocol ( slides, code )
  • Read Adam Chapweske's overview of the PS/2 protocol for keyboards and mice.
Lab/assign Lab 5: Keyboard Surfin' ( writeup)

Prelab to prep before lab.

Assignment 5: Keyboard and Simple Shell ( writeup)
Lecture
Wed 5/4
Graphics and the framebuffer ( slides, code )
Week 7
Lecture
Mon 5/9
Interrupts ( slides, code )

In this first lecture on interrupts, we'll focus on the low-level mechanics and what needs to happen at the assembly level to enable and process an interrupt.

Lab/assign Lab 6: Drawing into the Framebuffer ( writeup)

Prelab to prep before lab.

Assignment 6: Graphics Library and Console ( writeup)
Lecture
Wed 5/11
Interrupts, cont'd ( slides, code )

Now we move up to the higher-level abstractions for interrupts, including library support for managing interrupt handlers and reviewing best practices for interrupt-safe code.

Week 8
Lecture
Mon 5/16
Sensors ( slides, code )
Lab/assign Lab 7: Raspberry Pi, Interrupted ( writeup)

Prelab to prep before lab.

Assignment 7: System Monitor with Interrupts ( writeup)
Lecture
Wed 5/18
Anna & Maria on Performance ( slides, code )

Tips and tricks from Anna and Maria on making your code fly! Also, some quick tips for final projects.

Week 9
Lecture
Mon 5/23
Matt on Trust and Safety ( slides)

Matt's "whirlwind tour" of important topics including Trust and Safety, the Memory Hierarchy and Caching, Memory Safety, and Recommended Future Classes. Also includes some fun intermissions.

Lab/assign Lab 8: Project Team Meeting 1 ( writeup)
  • Prelab to prep before lab.
  • Lab will be a project work session. Plan to attend same lab session as your teammates.
Final Project ( writeup)
Lecture
Wed 5/25
Computer Arithmetic ( slides, code )

Representation of signed and unsigned numbers, types and type conversion.

Week 10
Lecture
Mon 5/30
No lecture (public holiday)
Lab/assign Lab 9: Project Team Meeting 2
Lecture
Wed 6/1
tbd
Week 11
Lecture
Mon 6/6
/lectures/Sound
Lab/assign
Lecture
Wed 6/8
Week 12
Final Project
Demo session Sun 6/5 at 2:00 pm
Code submission due Mon 6/6 at 11:59 pm