avr: introduce reference counter for network buffers.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user