#include "printf.h" typedef unsigned long long uint64_t; typedef unsigned long uint32_t; typedef unsigned char uint8_t; #define MTIME_BASE 0x0200BFF8 volatile uint32_t* mtime_upper = (uint32_t*)(MTIME_BASE+4); volatile uint32_t* mtime_lower = (uint32_t*)MTIME_BASE; #define FRAMEBUFFER_BASE 0x1D385000 uint64_t read_mtime_atomic() { uint32_t upper1, lower, upper2; do { upper1 = *mtime_upper; lower = *mtime_lower; upper2 = *mtime_upper; } while (upper1 != upper2); // Repeat if upper changed during the process return ((uint64_t)upper1 << 32) | lower; } uint32_t timediff_ms(uint64_t start, uint64_t end) { uint64_t total = end-start; // Clock rate is currently 1MHz return (uint32_t)total / 1000; } int fib(int n) { if (n == 0 || n == 1) return 1; return fib(n-1) + fib(n-2); } void draw() { for (int k = 0; k < 200; k++) { for (int i = 0; i< 320; i++) { for (int j = 0; j < 200; j++) { uint8_t color = i*(j + k); uint8_t* addr = (uint8_t*)(FRAMEBUFFER_BASE + (j*320) + i); *addr = color; } } } } int main() { uint64_t start = read_mtime_atomic(); draw(); uint64_t end = read_mtime_atomic(); int n = 24; int res = fib(n); uint32_t total_msec = timediff_ms(start, end); printf("fib(%d) = %d\n", n, res); printf("time: %dms\n", total_msec); return 0; }