From 23b700cf73b7b01b4737db106226bd4220799290 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 25 Jun 2015 14:08:39 +0200 Subject: Added basic IRQ support --- firmware/sieve.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) (limited to 'firmware/sieve.c') diff --git a/firmware/sieve.c b/firmware/sieve.c index c3372f4..7f1c82e 100644 --- a/firmware/sieve.c +++ b/firmware/sieve.c @@ -18,6 +18,11 @@ static bool bitmap_get(int idx) return (bitmap[idx/32] & (1 << (idx % 32))) != 0; } +static void print_chr(char ch) +{ + *((volatile uint32_t*)OUTPORT) = ch; +} + static void print_str(const char *p) { while (*p != 0) @@ -37,6 +42,13 @@ static void print_dec(int val) } } +static void print_hex(unsigned int val) +{ + int i; + for (i = 32-4; i >= 0; i -= 4) + *((volatile uint32_t*)OUTPORT) = "0123456789ABCDEF"[(val >> i) % 16]; +} + static void print_prime(int idx, int val) { if (idx < 10) @@ -76,3 +88,92 @@ void sieve() } } +void irq(uint32_t *regs, uint32_t irqnum) +{ + static int ext_irq_count = 0; + static int timer_irq_count = 0; + + if (irqnum == 0) { + ext_irq_count++; + // print_str("[EXT-IRQ]"); + return; + } + + if (irqnum == 1) { + timer_irq_count++; + // print_str("[TIMER-IRQ]"); + return; + } + + if (irqnum == 2) + { + int i, k; + uint32_t pc = regs[0] - 4; + uint32_t instr = *(uint32_t*)pc; + + print_str("\n"); + print_str("------------------------------------------------------------\n"); + + if (instr == 0x00100073) { + print_str("SBREAK instruction at 0x"); + print_hex(pc); + print_str("\n"); + } else { + print_str("Illegal Instruction at 0x"); + print_hex(pc); + print_str(": 0x"); + print_hex(instr); + print_str("\n"); + } + + for (i = 0; i < 8; i++) + for (k = 0; k < 4; k++) + { + int r = i + k*8; + + if (r == 0) { + print_str("pc "); + } else + if (r < 10) { + print_chr('x'); + print_chr('0' + r); + print_chr(' '); + print_chr(' '); + } else + if (r < 20) { + print_chr('x'); + print_chr('1'); + print_chr('0' + r - 10); + print_chr(' '); + } else + if (r < 30) { + print_chr('x'); + print_chr('2'); + print_chr('0' + r - 20); + print_chr(' '); + } else { + print_chr('x'); + print_chr('3'); + print_chr('0' + r - 30); + print_chr(' '); + } + + print_hex(regs[r]); + print_str(k == 3 ? "\n" : " "); + } + + print_str("------------------------------------------------------------\n"); + + print_str("Number of external IRQs counted: "); + print_dec(ext_irq_count); + print_str("\n"); + + print_str("Number of timer IRQs counted: "); + print_dec(timer_irq_count); + print_str("\n"); + + __asm__("sbreak"); + return; + } +} + -- cgit