From 9202327dd0cba767f163bb8192003a00e352e7c0 Mon Sep 17 00:00:00 2001 From: FallenSigh Date: Fri, 26 Jun 2026 23:48:23 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20batch=20UART=20FIFO=20writes=20?= =?UTF-8?q?=E2=80=94=20poll=20once=20per=2016=20bytes=20instead=20of=20per?= =?UTF-8?q?=20byte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit uart_puts: burst-write up to 16 chars before polling LSR uart_puthex: write all 8 hex digits without polling (8 < 16 FIFO depth) Reduces AXI register reads from ~50 to ~3 per CRC output. Each saved poll: -1 uncached AXI read (~390ns) --- sdk/software/examples/asm/user-sample.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sdk/software/examples/asm/user-sample.c b/sdk/software/examples/asm/user-sample.c index 3653892..40a298c 100644 --- a/sdk/software/examples/asm/user-sample.c +++ b/sdk/software/examples/asm/user-sample.c @@ -16,21 +16,31 @@ #define UART_THR (*(volatile unsigned char *)0xbf000000) #define UART_LSR (*(volatile unsigned char *)0xbf000005) #define LSR_THRE 0x20 +#define UART_FIFO_DEPTH 16 static inline void uart_tx(unsigned char c) { while (!(UART_LSR & LSR_THRE)) {} UART_THR = c; } +/* Burst-write a null-terminated string — polls only when FIFO may be full */ static void uart_puts(const char *s) { - while (*s) uart_tx(*s++); + int n = 0; + while (*s) { + UART_THR = *s++; + if (++n >= UART_FIFO_DEPTH) { + while (!(UART_LSR & LSR_THRE)) {} + n = 0; + } + } } +/* Write 8 hex digits + suffix in one burst to minimize AXI polls */ static void uart_puthex(unsigned int val) { int i; for (i = 28; i >= 0; i -= 4) { unsigned char nibble = (val >> i) & 0xF; - uart_tx(nibble < 10 ? '0' + nibble : 'a' + nibble - 10); + UART_THR = nibble < 10 ? '0' + nibble : 'a' + nibble - 10; } }