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; } }