diff options
author | Jakob Odersky <jodersky@gmail.com> | 2014-04-08 15:25:11 +0200 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2014-04-08 15:25:11 +0200 |
commit | 90b9086a79ce1b24a4efa7390b6920c1d2ea7393 (patch) | |
tree | 43f1300bbae0cba1e9b7eb5f4d78276d6b6f69ad | |
parent | 350437ef4b8ba0811d285f7454d2b54ffce6b029 (diff) | |
download | mux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.tar.gz mux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.tar.bz2 mux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.zip |
fix problem with locks
-rw-r--r-- | kernel/include/mux/lock.h | 5 | ||||
-rw-r--r-- | 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 <avr/interrupt.h> 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 <avr/interrupt.h> @@ -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 |