summaryrefslogtreecommitdiff
path: root/src/stm/ao_serial_stm.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-03-24 15:00:20 -0700
committerKeith Packard <keithp@keithp.com>2013-03-24 15:00:20 -0700
commitf3dc025a764ca6a2c44fb514ccaf22e6210f769d (patch)
tree05c0be2a58f2bfc84d2916d90baaea0f1609d890 /src/stm/ao_serial_stm.c
parent0365df9ed5a638bfdefb29eec830e51301c13936 (diff)
altos: Do not release interrupts from any pollchar function
getchar relies on interrupts being blocked across the pollchar calls and into the sleep call or it may go to sleep with data pending. This prefixes all pollchar functions with _ to indicate that they are to be called with interrupts blocked and eliminates all interrupt manipulation calls from within the pollchar functions. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm/ao_serial_stm.c')
-rw-r--r--src/stm/ao_serial_stm.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/src/stm/ao_serial_stm.c b/src/stm/ao_serial_stm.c
index ce33f97e..2133c584 100644
--- a/src/stm/ao_serial_stm.c
+++ b/src/stm/ao_serial_stm.c
@@ -59,24 +59,11 @@ ao_usart_isr(struct ao_stm_usart *usart, int stdin)
}
}
-char
-ao_usart_getchar(struct ao_stm_usart *usart)
-{
- char c;
- ao_arch_block_interrupts();
- while (ao_fifo_empty(usart->rx_fifo))
- ao_sleep(&usart->rx_fifo);
- ao_fifo_remove(usart->rx_fifo, c);
- ao_arch_release_interrupts();
- return c;
-}
-
int
-ao_usart_pollchar(struct ao_stm_usart *usart)
+_ao_usart_pollchar(struct ao_stm_usart *usart)
{
int c;
- ao_arch_block_interrupts();
if (ao_fifo_empty(usart->rx_fifo))
c = AO_READ_AGAIN;
else {
@@ -84,10 +71,20 @@ ao_usart_pollchar(struct ao_stm_usart *usart)
ao_fifo_remove(usart->rx_fifo,u);
c = u;
}
- ao_arch_release_interrupts();
return c;
}
+char
+ao_usart_getchar(struct ao_stm_usart *usart)
+{
+ int c;
+ ao_arch_block_interrupts();
+ while ((c = _ao_usart_pollchar(usart)) == AO_READ_AGAIN)
+ ao_sleep(&usart->rx_fifo);
+ ao_arch_release_interrupts();
+ return (char) c;
+}
+
void
ao_usart_putchar(struct ao_stm_usart *usart, char c)
{
@@ -201,9 +198,9 @@ ao_serial1_putchar(char c)
}
int
-ao_serial1_pollchar(void)
+_ao_serial1_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart1);
+ return _ao_usart_pollchar(&ao_stm_usart1);
}
void
@@ -232,9 +229,9 @@ ao_serial2_putchar(char c)
}
int
-ao_serial2_pollchar(void)
+_ao_serial2_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart2);
+ return _ao_usart_pollchar(&ao_stm_usart2);
}
void
@@ -263,9 +260,9 @@ ao_serial3_putchar(char c)
}
int
-ao_serial3_pollchar(void)
+_ao_serial3_pollchar(void)
{
- return ao_usart_pollchar(&ao_stm_usart3);
+ return _ao_usart_pollchar(&ao_stm_usart3);
}
void
@@ -309,7 +306,7 @@ ao_serial_init(void)
stm_nvic_set_enable(STM_ISR_USART1_POS);
stm_nvic_set_priority(STM_ISR_USART1_POS, 4);
#if USE_SERIAL_1_STDIN
- ao_add_stdio(ao_serial1_pollchar,
+ ao_add_stdio(_ao_serial1_pollchar,
ao_serial1_putchar,
NULL);
#endif
@@ -346,7 +343,7 @@ ao_serial_init(void)
stm_nvic_set_enable(STM_ISR_USART2_POS);
stm_nvic_set_priority(STM_ISR_USART2_POS, 4);
#if USE_SERIAL_2_STDIN
- ao_add_stdio(ao_serial2_pollchar,
+ ao_add_stdio(_ao_serial2_pollchar,
ao_serial2_putchar,
NULL);
#endif
@@ -390,7 +387,7 @@ ao_serial_init(void)
stm_nvic_set_enable(STM_ISR_USART3_POS);
stm_nvic_set_priority(STM_ISR_USART3_POS, 4);
#if USE_SERIAL_3_STDIN
- ao_add_stdio(ao_serial3_pollchar,
+ ao_add_stdio(_ao_serial3_pollchar,
ao_serial3_putchar,
NULL);
#endif