avr: introduce reference counter for network buffers.

This commit is contained in:
Martin Preuss
2025-08-18 18:03:24 +02:00
parent 0dc4a3a952
commit 9b1badb310
3 changed files with 57 additions and 6 deletions

View File

@@ -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

View File

@@ -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<<NET_IFACE_BUFFER_INUSE_BIT)
ldi r17, (1<<NET_IFACE_BUFFER_INUSE_BIT0) ; set refcounter to 1
st X, r17
NET_Buffer_Alloc_end:
ret
@@ -80,7 +80,54 @@ NET_Buffer_ReleaseByAddr:
push r15
in r15, SREG
cli
ld r16, X
swap r16
andi r16, 0x0f ; ref counter now in lower nibble
breq NET_Buffer_ReleaseByAddr_done ; refcounter 0? -> 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

View File

@@ -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