Fix: lab3 on-board problems
This commit is contained in:
@@ -24,11 +24,11 @@ int ringbuffer_push(ringbuffer_t *buf, uint8_t val)
|
||||
return ERR_OUT_OF_BOUND;
|
||||
|
||||
*buf->write++ = val;
|
||||
++buf->size;
|
||||
|
||||
if (buf->write == buf->data + buf->cap)
|
||||
buf->write = buf->data;
|
||||
|
||||
++buf->size;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -38,10 +38,18 @@ uint8_t ringbuffer_bump(ringbuffer_t *buf)
|
||||
exit(ERR_INVALID_OP);
|
||||
|
||||
uint8_t ret = *buf->read++;
|
||||
--buf->size;
|
||||
|
||||
if (buf->read == buf->data + buf->cap)
|
||||
buf->read = buf->data;
|
||||
|
||||
--buf->size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
uint8_t ringbuffer_peek(ringbuffer_t *buf)
|
||||
{
|
||||
if (buf->size == 0)
|
||||
exit(ERR_INVALID_OP);
|
||||
|
||||
return *buf->read;
|
||||
}
|
||||
|
||||
@@ -159,20 +159,41 @@ void _reboot(void)
|
||||
_reset(1 << 16);
|
||||
}
|
||||
|
||||
char *_shell_buf = (char *)0x0;
|
||||
int _shell_sz = 0;
|
||||
|
||||
static inline
|
||||
int _shell_operations(char ch)
|
||||
{
|
||||
switch (ch) {
|
||||
case 0x7f:
|
||||
if (_shell_sz > 0) {
|
||||
--_shell_sz;
|
||||
uart_puts("\b \b");
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int shell(file_node_t *initrd_root)
|
||||
{
|
||||
uart_puts("# ");
|
||||
char *buf = kmalloc(INPUT_BUFLEN * sizeof(char)), ch;
|
||||
int sz = 0;
|
||||
char ch;
|
||||
_shell_buf = kmalloc(INPUT_BUFLEN * sizeof(char));
|
||||
_shell_sz = 0;
|
||||
while ((ch = uart_getc()) != '\n') {
|
||||
buf[sz++] = ch;
|
||||
if (_shell_operations(ch))
|
||||
continue;
|
||||
_shell_buf[_shell_sz++] = ch;
|
||||
uart_putb((const uint8_t *)&ch, 1);
|
||||
}
|
||||
uart_puts(ENDL);
|
||||
buf[sz] = ' ';
|
||||
_shell_buf[_shell_sz] = ' ';
|
||||
|
||||
vector_t *args = make_vector(0);
|
||||
for (char *saveptr = 0x0, *tok = strtok_r(buf, " ", &saveptr);
|
||||
for (char *saveptr = 0x0, *tok = strtok_r(_shell_buf, " ", &saveptr);
|
||||
tok; tok = strtok_r((char *)0x0, " ", &saveptr)) {
|
||||
VEC_PUSH(args, tok);
|
||||
LOG(tok);
|
||||
|
||||
@@ -61,6 +61,16 @@ void _set_timer_interrrupt()
|
||||
}
|
||||
}
|
||||
|
||||
static inline
|
||||
void _traverse(timer_t *t)
|
||||
{
|
||||
if (!t) return;
|
||||
DEBUG_EXCEP(t->data.firing_tick);
|
||||
t->data.func(t->data.param);
|
||||
_traverse(t->_l);
|
||||
_traverse(t->_r);
|
||||
}
|
||||
|
||||
void add_task(task_t task)
|
||||
{
|
||||
DEBUG_EXCEP("add task");
|
||||
@@ -74,6 +84,8 @@ void add_task(task_t task)
|
||||
};
|
||||
|
||||
global_timer = _merge(global_timer, newtimer);
|
||||
|
||||
_traverse(global_timer);
|
||||
_set_timer_interrrupt();
|
||||
}
|
||||
|
||||
|
||||
@@ -162,6 +162,7 @@ size_t uart_getb_async(uint8_t *bytes, size_t len)
|
||||
for (; recvlen < len; ++bytes, ++recvlen) {
|
||||
while (!uart_readbuf->size)
|
||||
wfe(); // wait for interrupt
|
||||
|
||||
*bytes = ringbuffer_bump(uart_readbuf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user