RIOT/sys/uart0/uart0.c
Ludwig Ortmann 0f066befeb use CREATE_WOUT_YIELD on uart0 thread creation
This should remove a race condition in the case that some uart event
occurs after the uart0 thread has started and before control has
returned to the calling thread, as uart0_handler_pid would not have
been set yet.
2013-10-23 22:13:53 +02:00

56 lines
1.1 KiB
C

#include <chardev_thread.h>
#include <ringbuffer.h>
#include <stdio.h>
#include <thread.h>
#include <msg.h>
#include <posix_io.h>
#include <board_uart0.h>
#define UART0_BUFSIZE (32)
#define UART0_STACKSIZE (MINIMUM_STACK_SIZE + 256)
ringbuffer_t uart0_ringbuffer;
int uart0_handler_pid;
static char buffer[UART0_BUFSIZE];
static char uart0_thread_stack[UART0_STACKSIZE];
static void uart0_loop(void)
{
chardev_loop(&uart0_ringbuffer);
}
void board_uart0_init(void)
{
ringbuffer_init(&uart0_ringbuffer, buffer, UART0_BUFSIZE);
int pid = thread_create(uart0_thread_stack, sizeof(uart0_thread_stack), PRIORITY_MAIN - 1, CREATE_STACKTEST|CREATE_WOUT_YIELD, uart0_loop, "uart0");
uart0_handler_pid = pid;
puts("uart0_init() [OK]");
}
void uart0_handle_incoming(int c)
{
rb_add_element(&uart0_ringbuffer, c);
}
void uart0_notify_thread(void)
{
msg_t m;
m.type = 0;
msg_send_int(&m, uart0_handler_pid);
}
int uart0_readc(void)
{
char c = 0;
posix_read(uart0_handler_pid, &c, 1);
return c;
}
void uart0_putc(int c)
{
putchar(c);
}