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

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