From 9b1badb3100dfc3952a46a9ca69be9e362c6c6fb Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 18 Aug 2025 18:03:24 +0200 Subject: [PATCH] avr: introduce reference counter for network buffers. --- avr/common/m_fixedbuffers.asm | 2 +- avr/modules/network/buffer.asm | 49 +++++++++++++++++++++++++++++++++- avr/modules/network/defs.asm | 12 ++++++--- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/avr/common/m_fixedbuffers.asm b/avr/common/m_fixedbuffers.asm index b2831e1..9ad97a3 100644 --- a/avr/common/m_fixedbuffers.asm +++ b/avr/common/m_fixedbuffers.asm @@ -52,7 +52,7 @@ l_loop: brcs l_loop rjmp l_end ; use cleared CFLAG l_foundfree: - ldi r16, 0x80 ; mark as used + ldi r16, 0x10 ; mark as used st X, r16 mov r16, r17 sec ; set CFLAG, return bufnum in r16, pointre in X diff --git a/avr/modules/network/buffer.asm b/avr/modules/network/buffer.asm index 5404450..c8e54e9 100644 --- a/avr/modules/network/buffer.asm +++ b/avr/modules/network/buffer.asm @@ -62,7 +62,7 @@ NET_Buffer_Alloc_noIrq: ldi xh, HIGH(netBuffers) m_fixedbuf_reserve NET_BUFFERS_SIZE, NET_BUFFERS_NUM brcc NET_Buffer_Alloc_end - ldi r17, (1< not in use + dec r16 + breq NET_Buffer_ReleaseByAddr_release + swap r16 + push r17 + ld r17, X + andi r17, 0x0f + or r16, r17 + st X, r16 + pop r17 + rjmp NET_Buffer_ReleaseByAddr_done +NET_Buffer_ReleaseByAddr_release: m_fixedbuf_release +NET_Buffer_ReleaseByAddr_done: + out SREG, r15 + pop r15 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine NET_Buffer_IncRef @global +; +; @param X pointer to start of buffer +; @clobbers R16 + +NET_Buffer_IncRef: + push r15 + in r15, SREG + cli + ld r16, X + swap r16 ; ref counter now in lower nibble + andi r16, 0x0f + breq NET_Buffer_IncRef_done ; refcounter 0? -> not in use + inc r16 + breq NET_Buffer_IncRef_done ; don't increment if refcounter at max!!! + swap r16 ; ref counter now in high nibble again + push r17 + ld r17, X + andi r17, 0x0f ; clear ref counter in r17 + or r16, r17 ; or new ref counter into r17 + st X, r16 ; store new header byte + pop r17 +NET_Buffer_IncRef_done: out SREG, r15 pop r15 ret diff --git a/avr/modules/network/defs.asm b/avr/modules/network/defs.asm index ac409a7..b670706 100644 --- a/avr/modules/network/defs.asm +++ b/avr/modules/network/defs.asm @@ -12,12 +12,16 @@ .equ NET_BUFFERS_SIZE = 28 ; CAVE: need to adapt routine NET_Buffer_Locate when changing this value!! -.equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming) - -.equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound) +;.equ NET_MSGNUMINBUF_SIZE = 8 ; max buffer nums in ringbuffer (global incoming) +;.equ NET_IFACE_OUTMSGBUF_SIZE = 8 ; max buffer nums in ringbuffer (per interface outbound) -.equ NET_IFACE_BUFFER_INUSE_BIT = 7 +.equ NET_IFACE_BUFFER_INUSE_BIT3 = 7 +.equ NET_IFACE_BUFFER_INUSE_BIT2 = 6 +.equ NET_IFACE_BUFFER_INUSE_BIT1 = 5 +.equ NET_IFACE_BUFFER_INUSE_BIT0 = 4 +.equ NET_IFACE_BUFFER_IFACENUM3_BIT = 3 +.equ NET_IFACE_BUFFER_IFACENUM2_BIT = 2 .equ NET_IFACE_BUFFER_IFACENUM1_BIT = 1 .equ NET_IFACE_BUFFER_IFACENUM0_BIT = 0