timer.zig (1648B)
1 // Interrupt sanity check (by spamming interrupts) 2 const std = @import("std"); 3 const pi = @import("pi"); 4 5 const uart = pi.devices.mini_uart; 6 const timer = pi.devices.timer; 7 const interrupts = pi.interrupts; 8 9 comptime { 10 asm ( 11 \\ .global infinite_loop; 12 \\ .type infinite_loop, %function; 13 \\ infinite_loop: 14 \\ mov r0, 0 15 \\ mov r1, 1 16 \\ mov r2, 2 17 \\ mov r3, 3 18 \\ mov r4, 4 19 \\ mov r5, 5 20 \\ mov r6, 6 21 \\ mov r7, 7 22 \\ mov r8, 8 23 \\ mov r9, 9 24 \\ mov r10, 10 25 \\ mov r11, 11 26 \\ mov r12, 12 27 \\ cmp r0, r1 28 \\ bne infinite_loop 29 \\ bx lr 30 ); 31 } 32 extern fn infinite_loop() void; 33 34 noinline fn tick(regs: interrupts.Registers) void { 35 for (regs.gp, 0..regs.gp.len) |r, i| { 36 uart.print("r{d} = 0x{X}\n", .{ i, r }); 37 } 38 uart.print("sp = 0x{X}\n", .{regs.sp}); 39 uart.print("lr = 0x{X}\n", .{regs.lr}); 40 uart.print("pc = 0x{X}\n", .{regs.pc}); 41 uart.print("psr = {s}\n", .{@tagName(regs.psr.mode)}); 42 uart.flush(); 43 } 44 45 pub fn main() !void { 46 uart.print("testing timer\n", .{}); 47 uart.print("sp = 0x{X}\n", .{pi.get_sp()}); 48 uart.print("mode = {s}\n", .{@tagName(pi.PSR.get_c().mode)}); 49 uart.flush(); 50 51 timer.set_tick(tick); 52 uart.print("set tick\n", .{}); 53 54 timer.initialize(.Sixteen, 0x256); 55 uart.print("timer initialized, entering loop\n", .{}); 56 const sp = pi.get_sp(); 57 pi.mem.barrier(.Compiler); 58 uart.print("initial sp = 0x{X}\n", .{sp}); 59 60 infinite_loop(); 61 62 uart.print("this is unreachable", .{}); 63 }