diff --git a/arch/sim/src/host.h b/arch/sim/src/host.h deleted file mode 100644 index 04884caf4c..0000000000 --- a/arch/sim/src/host.h +++ /dev/null @@ -1,69 +0,0 @@ -/************************************************************************** - * arch/sim/src/host.h - * - * Copyright (C) 2014 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - **************************************************************************/ - -#ifndef __ARCH_SIM_SRC_HOST_H -#define __ARCH_SIM_SRC_HOST_H - -/************************************************************************** - * Included Files - **************************************************************************/ - -/************************************************************************** - * Pre-processor Definitions - **************************************************************************/ - -/************************************************************************** - * Public Types - **************************************************************************/ - -/************************************************************************** - * Public Variables - **************************************************************************/ - -#ifndef __ASSEMBLY__ - -/************************************************************************** - * Public Function Prototypes - **************************************************************************/ - -/* up_uartwait.c **********************************************************/ -/* Exported to Nuttx domain files to host domain files */ - -void simuart_initialize(void); -void simuart_post(void); -void simuart_wait(void); - -#endif /* __ASSEMBLY__ */ -#endif /* __ARCH_SIM_SRC_HOST_H */ diff --git a/arch/sim/src/up_simuart.c b/arch/sim/src/up_simuart.c index ff2df7dc6d..239e5bd790 100644 --- a/arch/sim/src/up_simuart.c +++ b/arch/sim/src/up_simuart.c @@ -41,8 +41,6 @@ #include #include -#include "host.h" - /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ @@ -60,6 +58,17 @@ static char g_uartbuffer[SIMUART_BUFSIZE]; static volatile int g_uarthead; static volatile int g_uarttail; +/**************************************************************************** + * NuttX Domain Public Function Prototypes + ****************************************************************************/ + +void sched_lock(void); +void sched_unlock(void); + +void simuart_initialize(void); +void simuart_post(void); +void simuart_wait(void); + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -91,10 +100,8 @@ static void *simuart_thread(void *arg) { unsigned char ch; ssize_t nread; - - /* Put stdin into raw mode */ - - setrawmode(); + int next; + int prev; /* Now loop, collecting a buffering data from stdin forever */ @@ -108,9 +115,12 @@ static void *simuart_thread(void *arg) if (nread == 1) { + sched_lock(); + /* Get the index to the next slot in the UART buffer */ - int next = g_uarthead + 1; + prev = g_uarthead; + next = prev + 1; if (next >= SIMUART_BUFSIZE) { next = 0; @@ -122,11 +132,15 @@ static void *simuart_thread(void *arg) { /* No.. Add the character to the UART buffer */ - g_uartbuffer[g_uarthead] = ch; + g_uartbuffer[prev] = ch; + + /* Update the head index (BEFORE posting) */ + + g_uarthead = next; /* Was the buffer previously empty? */ - if (g_uarthead == g_uarttail) + if (prev == g_uarttail) { /* Yes.. signal any (NuttX) threads waiting for serial * input. @@ -134,11 +148,9 @@ static void *simuart_thread(void *arg) simuart_post(); } - - /* Update the head index */ - - g_uarthead = next; } + + sched_unlock(); } } @@ -179,6 +191,10 @@ void simuart_start(void) simuart_initialize(); + /* Put stdin into raw mode */ + + setrawmode(); + /* Start the simulated UART thread -- all default settings; no error * checking. */ @@ -224,7 +240,7 @@ int simuart_getc(void) /* The UART buffer show be non-empty... check anyway */ - if (g_uarthead == g_uarttail) + if (g_uarthead != g_uarttail) { /* Take the next byte from the tail of the buffer */