From d4331491a87aa27fb77e5971c887e345886de2be Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Fri, 26 Jun 2015 22:02:22 +0200 Subject: Test firmware refactoring --- firmware/sieve.c | 158 +++++++------------------------------------------------ 1 file changed, 19 insertions(+), 139 deletions(-) (limited to 'firmware/sieve.c') diff --git a/firmware/sieve.c b/firmware/sieve.c index 6fb5b17..10fd1e0 100644 --- a/firmware/sieve.c +++ b/firmware/sieve.c @@ -1,12 +1,17 @@ // A simple Sieve of Eratosthenes -#include -#include +#include "firmware.h" #define BITMAP_SIZE 64 -#define OUTPORT 0x10000000 static uint32_t bitmap[BITMAP_SIZE/32]; +static uint32_t hash; + +static uint32_t mkhash(uint32_t a, uint32_t b) +{ + // The XOR version of DJB2 + return ((a << 5) + a) ^ b; +} static void bitmap_set(int idx) { @@ -18,37 +23,6 @@ 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) - *((volatile uint32_t*)OUTPORT) = *(p++); -} - -static void print_dec(int val) -{ - char buffer[10]; - char *p = buffer; - while (val || p == buffer) { - *(p++) = val % 10; - val = val / 10; - } - while (p != buffer) { - *((volatile uint32_t*)OUTPORT) = '0' + *(--p); - } -} - -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) @@ -66,12 +40,16 @@ static void print_prime(int idx, int val) print_str(" prime is "); print_dec(val); print_str(".\n"); + + hash = mkhash(hash, idx); + hash = mkhash(hash, val); } void sieve() { int i, j, k; int idx = 1; + hash = 5381; print_prime(idx++, 2); for (i = 0; i < BITMAP_SIZE; i++) { if (bitmap_get(i)) @@ -86,113 +64,15 @@ void sieve() bitmap_set(k); } } -} -uint32_t *irq(uint32_t *regs, uint32_t irqs) -{ - static int ext_irq_4_count = 0; - static int ext_irq_5_count = 0; - static int timer_irq_count = 0; + print_str("checksum: "); + print_hex(hash); - if ((irqs & (1<<4)) != 0) { - ext_irq_4_count++; - // print_str("[EXT-IRQ-4]"); + if (hash == 0x1772A48F) { + print_str(" OK\n"); + } else { + print_str(" ERROR\n"); + asm volatile ("sbreak"); } - - if ((irqs & (1<<5)) != 0) { - ext_irq_5_count++; - // print_str("[EXT-IRQ-5]"); - } - - if ((irqs & 1) != 0) { - timer_irq_count++; - // print_str("[TIMER-IRQ]"); - } - - if ((irqs & 6) != 0) - { - int i, k; - uint32_t pc = regs[0] - 4; - uint32_t instr = *(uint32_t*)pc; - - print_str("\n"); - print_str("------------------------------------------------------------\n"); - - if ((irqs & 2) != 0) { - 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"); - } - } - - if ((irqs & 4) != 0) { - print_str("Bus error in 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 fast external IRQs counted: "); - print_dec(ext_irq_4_count); - print_str("\n"); - - print_str("Number of slow external IRQs counted: "); - print_dec(ext_irq_5_count); - print_str("\n"); - - print_str("Number of timer IRQs counted: "); - print_dec(timer_irq_count); - print_str("\n"); - - __asm__("sbreak"); - } - - return regs; } -- cgit