diff options
Diffstat (limited to 'test/locks/main.c')
-rw-r--r-- | test/locks/main.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/locks/main.c b/test/locks/main.c new file mode 100644 index 0000000..526d75f --- /dev/null +++ b/test/locks/main.c @@ -0,0 +1,55 @@ +#include <stddef.h> +#include <stdio.h> +#include <avr/pgmspace.h> +#include <avr/interrupt.h> +#include "task/task.h" +#include "task/sched.h" +#include "bug/panic.h" +#include "bug/debug.h" +#include "task/lock.h" +#include "time/clock.h" +#include "mcu/task/context.h" +#include "tshield/tshield.h" + +#define WAIT_CYCLES(cycles) for (volatile unsigned long i = 0; i < cycles; ++i) {} + +spin_lock_t on_lock = SPIN_LOCK_UNLOCKED; +volatile char on = 0; + +void read(char id) { + while(1) { + spin_lock(&on_lock); + debug_led(0,on); + spin_unlock(&on_lock); + } +} + +void write( char id) { + while(1) { + spin_lock(&on_lock); + on = !on; + WAIT_CYCLES(30000); + spin_unlock(&on_lock); + } +} + + +DECLARE_TASK(task1, DEFAULT_STACK_SIZE, read, 1); +DECLARE_TASK(task2, DEFAULT_STACK_SIZE, write, 2); + + +int main(int argc, char *argv[]) { + cli(); + tshield_init(); + + + spawn(&task1); + spawn(&task2); + + sei(); + clock_init(10, schedule); + clock_start(); + sched_init(); + panic(); //should never reach here + while(1){} +} |