Feat: lab 3

This commit is contained in:
2025-04-01 17:13:46 +08:00
parent 96cfdc4de2
commit 5ae11ac062
10 changed files with 197 additions and 65 deletions

View File

@@ -1,4 +1,6 @@
#include <uart.h>
#include <kmalloc.h>
#include <interrupt.h>
#include <logger.h>
#include <errcode.h>
#include <utils.h>
@@ -87,11 +89,31 @@ void uart_transmit_interrupt_handler()
_uart_write_data(ringbuffer_bump(uart_writebuf));
}
typedef struct {
ringbuffer_t *buf;
uint8_t val;
} uart_interrupt_callback_payload_t;
static inline
void uart_receive_interrupt_callback(uint64_t param)
{
uart_interrupt_callback_payload_t *payload = (void *)param;
ringbuffer_push(payload->buf, payload->val);
kfree(payload);
}
void uart_receive_interrupt_handler()
{
if (uart_readbuf->size < uart_readbuf->cap) {
uint8_t b = _uart_read_data();
ringbuffer_push(uart_readbuf, b);
uart_interrupt_callback_payload_t *param = kmalloc(
sizeof(uart_interrupt_callback_payload_t));
*param = (uart_interrupt_callback_payload_t){
.buf = uart_readbuf,
.val = b,
};
add_interrupt_task(10, uart_receive_interrupt_callback, (uint64_t)param);
}
}
@@ -139,7 +161,7 @@ size_t uart_getb_async(uint8_t *bytes, size_t len)
size_t recvlen = 0;
for (; recvlen < len; ++bytes, ++recvlen) {
while (!uart_readbuf->size)
asm volatile("wfe"); // wait for interrupt
wfe(); // wait for interrupt
*bytes = ringbuffer_bump(uart_readbuf);
}