From 90b9086a79ce1b24a4efa7390b6920c1d2ea7393 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 8 Apr 2014 15:25:11 +0200 Subject: fix problem with locks --- kernel/include/mux/lock.h | 5 +++-- kernel/mcu/atmega2560/usart.c | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/include/mux/lock.h b/kernel/include/mux/lock.h index b5ac4d9..252237e 100644 --- a/kernel/include/mux/lock.h +++ b/kernel/include/mux/lock.h @@ -2,11 +2,12 @@ #define MUX_LOCK_H #include "mux/sched.h" +#include typedef volatile char spin_lock_t; -#define SPIN_LOCK_UNLOCKED 0 -#define SPIN_LOCK_LOCKED 0 +#define SPIN_LOCK_UNLOCKED (volatile char) 0 +#define SPIN_LOCK_LOCKED (volatile char) 1 static inline void spin_lock(spin_lock_t* lock) { while(*lock != SPIN_LOCK_UNLOCKED) {yield();}; diff --git a/kernel/mcu/atmega2560/usart.c b/kernel/mcu/atmega2560/usart.c index f07e137..803c204 100644 --- a/kernel/mcu/atmega2560/usart.c +++ b/kernel/mcu/atmega2560/usart.c @@ -2,6 +2,7 @@ #include "mux/list.h" #include "mux/rbuffer.h" #include "mux/sched.h" +#include "mux/lock.h" #include "mcu/usart.h" #include "mcu/context.h" #include @@ -72,11 +73,13 @@ ssize_t usart_write(struct file* usart, const char* const buffer, size_t length) sei(); *ucsrxb |= write_enable; } while (r == 0 && wrote < length); + return wrote; } ssize_t usart_read(struct file* usart, char* const buffer, size_t length) { struct usart_private* priv = (struct usart_private*) usart->private_data; + while (rbuffer_empty(&priv->rx_buffer)) { sleep_queue(&priv->rx_queue); yield(); @@ -104,7 +107,7 @@ struct file_operations usart_fops = { .close = usart_close }; -struct usart_private _usart0 = { +static struct usart_private _usart0 = { .ucsrxa = &UCSR0A, .ubrrxh = &UBRR0H, .ubrrxl = &UBRR0L, @@ -135,14 +138,10 @@ ISR(USART0_UDRE_vect) { //called when byte is received ISR(USART0_RX_vect) { - //context_save(); struct usart_private* priv = (struct usart_private*) usart0.private_data; char c = UDR0; rbuffer_write(&priv->rx_buffer, c); wake_all_queue(&priv->rx_queue); - - //context_restore(); - //asm volatile ("reti"); } \ No newline at end of file -- cgit v1.2.3