sylveos

Toy Operating System
Log | Files | Refs

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 }