aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-04-08 15:25:11 +0200
committerJakob Odersky <jodersky@gmail.com>2014-04-08 15:25:11 +0200
commit90b9086a79ce1b24a4efa7390b6920c1d2ea7393 (patch)
tree43f1300bbae0cba1e9b7eb5f4d78276d6b6f69ad
parent350437ef4b8ba0811d285f7454d2b54ffce6b029 (diff)
downloadmux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.tar.gz
mux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.tar.bz2
mux-90b9086a79ce1b24a4efa7390b6920c1d2ea7393.zip
fix problem with locks
-rw-r--r--kernel/include/mux/lock.h5
-rw-r--r--kernel/mcu/atmega2560/usart.c9
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