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
Mon 1/9
Introduction and Welcome ( slides)


Lab/assign Lab 0: Orientation ( writeup)

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

Assignment 0: Git oriented ( writeup)
Fri 1/13
ARM processor and architecture ( slides, code )
Week 2
Mon 1/16
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)
Fri 1/20
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
Mon 1/23
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.
  • 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)
Fri 1/27
C Functions ( slides, code )
Week 4
Mon 1/30
Communication and the Serial Protocol
Lab/assign Lab 3: Debugging and Testing Assignment 3: Implement a String Formatting Library
Fri 2/3
Modules, Libraries, and Linking
Week 5
Mon 2/6
Memory Management
Lab/assign Lab 4: Linked and Loaded Assignment 4: Backtrace and Malloc
Fri 2/10
C Mastery
Week 6
Mon 2/13
Keyboards and the PS/2 Protocol
Lab/assign Lab 5: Keyboard Surfin' Assignment 5: Keyboard and Simple Shell
Fri 2/17
Graphics and the framebuffer
Week 7
Mon 2/20
Presidents Day
Lab/assign Lab 6: Drawing into the Framebuffer Assignment 6: Graphics Library and Console
Fri 2/24
Week 8
Mon 2/27
Interrupts, cont'd
Lab/assign Lab 7: Raspberry Pi, Interrupted Assignment 7: System Monitor with Interrupts
Fri 3/3
Week 9
Mon 3/6
Lab/assign Lab 8: Project Team Meeting 1 Final Project
Fri 3/10
Computer Arithmetic
Week 10
Mon 3/13
Lab/assign Lab 9: Project Team Meeting 2
Fri 3/17
Wrap or There and Back Again
Week 11
Final Project
Demo session Fri 3/24 at 9:00 am
Code submission due Fri 3/24 at 11:59 pm