Skip to content

Commit febe559

Browse files
committed
fixup! ethos: move bulk of state machine out of ISR context
1 parent c19bbf9 commit febe559

1 file changed

Lines changed: 35 additions & 8 deletions

File tree

drivers/ethos/ethos.c

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,23 +83,52 @@ static void _reset_state(ethos_t *dev)
8383
dev->frametype = 0;
8484
}
8585

86+
static void _reset_tsrb(tsrb_t *tsrb)
87+
{
88+
tsrb->reads = 0;
89+
tsrb->writes = 0;
90+
}
91+
92+
static void _fail_frame(ethos_t *dev)
93+
{
94+
switch (dev->frametype) {
95+
case ETHOS_FRAME_TYPE_DATA:
96+
_reset_tsrb(&dev->inbuf);
97+
/* signal to handler thread that frame is at an end (makes handler thread to
98+
* truncate frame) */
99+
tsrb_add_one(&dev->inbuf, ETHOS_FRAME_DELIMITER);
100+
break;
101+
case ETHOS_FRAME_TYPE_TEXT:
102+
mutex_lock(&ethos_stdio_isrpipe.mutex);
103+
_reset_tsrb(&ethos_stdio_isrpipe.tsrb);
104+
mutex_unlock(&ethos_stdio_isrpipe.mutex);
105+
/* signal to handler thread that frame is at an end (makes handler thread to
106+
* truncate frame) */
107+
isrpipe_write_one(&ethos_stdio_isrpipe, ETHOS_FRAME_DELIMITER);
108+
break;
109+
case ETHOS_FRAME_TYPE_ERRORED:
110+
return;
111+
default:
112+
assert(0);
113+
break;
114+
}
115+
dev->frametype = ETHOS_FRAME_TYPE_ERRORED;
116+
}
117+
86118
static void _handle_char(ethos_t *dev, char c)
87119
{
88120
switch (dev->frametype) {
89121
case ETHOS_FRAME_TYPE_DATA:
90122
if (tsrb_add_one(&dev->inbuf, c) < 0) {
91123
//puts("lost frame");
92-
dev->inbuf.reads = 0;
93-
dev->inbuf.writes = 0;
94-
dev->frametype = 0;
124+
_fail_frame(dev);
95125
}
96126
break;
97127
case ETHOS_FRAME_TYPE_TEXT:
98128
#ifdef MODULE_STDIO_ETHOS
99129
if (isrpipe_write_one(&ethos_stdio_isrpipe, c) < 0) {
100130
//puts("lost frame");
101-
dev->inbuf.reads = 0;
102-
dev->inbuf.writes = 0;
131+
_fail_frame(dev);
103132
}
104133
break;
105134
#endif
@@ -175,9 +204,7 @@ static void ethos_isr(void *arg, uint8_t c)
175204
return;
176205
default:
177206
/* unknown escaped character or raw delimiter */
178-
dev->frametype = ETHOS_FRAME_TYPE_ERRORED;
179-
dev->inbuf.reads = 0;
180-
dev->inbuf.writes = 0;
207+
_fail_frame(dev);
181208
return;
182209
}
183210
dev->state = IN_FRAME;

0 commit comments

Comments
 (0)