Lecture notes (Digital Systems)
Each lecture title is a link to notes for that lecture. The notes for some lectures have a section at the end for questions asked during or after that lecture by audiences in previous years.
The first few lectures will be about programming a microprocessor in assembly language, including the detail of how each kind of instruction operates.
 Microcontrollers and embedded programming. Architecture of the micro:bit. Programmer's model. Execution of an instruction.
 Building a program. Compiling and building a program.
 Number representations. Signed and unsigned numbers. Numeric comparisons.
 Loops and subroutines. A better multiplication algorithm. Stack frames. Recursive calculation of binomial coefficients.
 Memory and addressing. Addressing modes. Arrays. Example: Catalan numbers.
 Buffer overrun attacks. A hacker's guide.
- A set of slides used in the lectures, put here as a convenient way to make them available for displaying – and updated when necessary. (All contain the same information as in the notes.)
Input and output
The next lectures are about different kinds of I/O interaction, including interrupts.
 Introducing I/O. Memory-mapped I/O. GPIO. Multiplexed LED display.
 Serial I/O. Serial protocol. A simple, polling UART driver.
 Programming with interrupts. Interrupt-based driver for UART.
 The interrupt mechanism. What the hardware does with interrupts.
Embedded operating systems
The last part of Hilary Term has lectures about using and then implementing a simple process scheduler, allowing asynchronous events to be handled in a manageable way.
 Introducing Phōs. Processes and messages.
 Device drivers. Server processes. Interrupts as messages from the hardware.
 Context switching. Implementing interleaving of processes by saving and restoring context.
 Implementing processes and messages. Process table. Ready queue. Send and receive.
 We're going on a bug hunt!. Exploring the operating system by fixing a bug.
In the first part of Trinity Term, the lectures are about constructing logic gates from transistors, and then building those logic gates into modules we can later use to design a computer. Helpful reading for this part of the course is the appendix on Basics of Logic Design from the recommended book by Patterson and Hennessy.
 Introduction. Plan for the term. Combinational logic.
 Transistors and logic gates. Building gates from transistors. CMOS logic.
 Sequential logic. Flip-flops. Designing sequential circuits.
 Architectural elements. Circuits for arithmetic. Multiplexers. Register files. Arithmetic-Logic Unit. Barrel shifter.
The second part of Trinity Term has lectures about using architectural modules to build a simplified implementation of the Thumb instruction set.
 Designing a datapath.
 Phōs device drivers – a sample exam question.
 Three instructions. Using the datapath to implement three typical instructions.
An integrated circuit that contains a complete CPU.
A symbolic representation of the machine code for a program.
(General-Purpose Input/Output). A peripheral interface that provides direct access to pins of the microcontroller chip. Pins may be configured as inputs or outputs, and interrupts may be associated with state changes on certain input pins. On the micro:bit, the LEDs and pushbuttons are connected to GPIO pins.
(Universal Asynchronous Receiver/Transmitter). A peripheral interface that is able to send and receive characters serially, commonly used in the past for communication between a computer and an attached terminal. It is commonly used in duplex mode, with the transmitter of one device connected to the receiver of the other with one wire, and the receiver of the one connected to transmitter of the other with a different wire. The asynchronous part of the name refers to the fact that the transmitter and receiver on each wire do not share a common clock, but rely instead on the signalling protocol and precise timing to achieve synchronisation.
An alternative instruction encoding for the ARM in which each instruction is encoded in 16 rather than 32 bits. The advantage is compact code, the disadvantage that only a selection of instructions can be encoded, and only the first 8 registers are easily accessible. In Cortex-M microcontrollers, the Thumb encoding is the only one provided.