simplified message handling, switch from XOR checksum to CRC8 with polynomial 0x97.
0x97 allows for detection of all 1-3 bit errors in a message of up to 119 bytes (see https://www.faa.gov/aircraft/air_cert/design_approvals/air_software/media/TC-14-49.pdf)
This commit is contained in:
@@ -198,6 +198,7 @@ Offset Length Meaning
|
||||
8 2 packets out
|
||||
10 2 collisions
|
||||
12 2 aborted
|
||||
14 2 no buffer errors
|
||||
|
||||
|
||||
|
||||
@@ -215,5 +216,9 @@ Offset Length Meaning
|
||||
8 2 packets in
|
||||
10 2 crc errors
|
||||
12 2 io errors
|
||||
14 2 no buffer errors
|
||||
16 2 handled packets
|
||||
18 2 missed
|
||||
|
||||
|
||||
|
||||
|
||||
10
avr/com.asm
10
avr/com.asm
@@ -63,13 +63,15 @@ comDataBegin:
|
||||
|
||||
comStatsRecvErrs: .byte 2
|
||||
comStatsRecvCrcErrs: .byte 2
|
||||
comStatsCollisions: .byte 2
|
||||
comStatsMissed: .byte 2
|
||||
comStatsAborted: .byte 2
|
||||
comStatsIgnored: .byte 2
|
||||
comStatsHandled: .byte 2
|
||||
|
||||
comStatsCollisions: .byte 2
|
||||
comStatsAborted: .byte 2
|
||||
|
||||
comStatsNoBuffer: .byte 2
|
||||
comStatsSendNoBuffer: .byte 2
|
||||
comStatsRecvNoBuffer: .byte 2
|
||||
|
||||
comRecvBuffersReadPos: .byte 1
|
||||
comRecvBuffersWritePos: .byte 1
|
||||
@@ -223,6 +225,8 @@ COM_AllocBufferAndGetXY:
|
||||
sec
|
||||
ret
|
||||
COM_AllocBufferAndGetXY_error:
|
||||
ldi xl, LOW(comStatsSendNoBuffer)
|
||||
ldi xh, HIGH(comStatsSendNoBuffer)
|
||||
clc
|
||||
ret
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
|
||||
|
||||
#define COM_USE_CRC8 1
|
||||
#define COM_CRC_POLYNOMIAL 0x97
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
|
||||
@@ -14,15 +20,20 @@
|
||||
; - X : pointer to packet buffer
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear otherwise
|
||||
; MODIFIED REGS: R16, R17, R18, X
|
||||
; MODIFIED REGS: R16, R17, R18, R19, X
|
||||
|
||||
comCalcAndAddChecksumByte:
|
||||
adiw xh:xl, COM_MSG_OFFS_MSGLEN
|
||||
ld r18, X ; read msg len
|
||||
inc r18 ; account for dest address
|
||||
inc r18 ; account for msg len bytes
|
||||
inc r18 ; account for msg len byte
|
||||
sbiw xh:xl, COM_MSG_OFFS_MSGLEN
|
||||
#ifdef COM_USE_CRC8
|
||||
ldi r19, COM_CRC_POLYNOMIAL
|
||||
rcall cproCalcCrc8 ; (R16, R17, R18, R20, X)
|
||||
#else
|
||||
rcall cproCalcXor ; (R16, R17, R18, X)
|
||||
#endif
|
||||
st X, r16 ; add checksum byte
|
||||
sec
|
||||
ret
|
||||
@@ -36,15 +47,20 @@ comCalcAndAddChecksumByte:
|
||||
; - X : pointer to packet buffer
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear otherwise
|
||||
; MODIFIED REGS: R16, R17, R18, X
|
||||
; MODIFIED REGS: R16, R17, R18, R19, R20, X
|
||||
|
||||
cproCheckMessageInBuffer:
|
||||
adiw xh:xl, COM_MSG_OFFS_MSGLEN
|
||||
ld r18, X ; read msg len
|
||||
inc r18 ; account for dest address
|
||||
inc r18 ; account for msg len bytes
|
||||
inc r18 ; account for msg len byte
|
||||
sbiw xh:xl, COM_MSG_OFFS_MSGLEN
|
||||
#ifdef COM_USE_CRC8
|
||||
ldi r19, COM_CRC_POLYNOMIAL
|
||||
rcall cproCalcCrc8 ; (R16, R17, R18, R20, X)
|
||||
#else
|
||||
rcall cproCalcXor ; (R16, R17, R18, X)
|
||||
#endif
|
||||
ld r17, X
|
||||
cp r16,r17 ; should be equal
|
||||
brne cproCheckMessageInBuffer_error
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
comReceivePacketHandleBuffer:
|
||||
rcall COM_BufferAlloc
|
||||
brcs comReceivePacketHandleBuffer_haveBuffer
|
||||
ldi xl, LOW(comStatsNoBuffer)
|
||||
ldi xh, HIGH(comStatsNoBuffer)
|
||||
ldi xl, LOW(comStatsRecvNoBuffer)
|
||||
ldi xh, HIGH(comStatsRecvNoBuffer)
|
||||
rjmp comReceivePacketHandleBuffer_errorWithCounter
|
||||
|
||||
comReceivePacketHandleBuffer_haveBuffer:
|
||||
@@ -72,7 +72,7 @@ comReceivePacketHandleBuffer_notforme:
|
||||
; OUT:
|
||||
; - CFLAG: set if okay, clear otherwise
|
||||
; - R16: error code if CFLAG cleared
|
||||
; MODIFIED REGISTERS: r16, r17, r18, X (r20, r21, r22)
|
||||
; MODIFIED REGISTERS: r16, r17, r18, X (r19, r20, r21, r22)
|
||||
|
||||
comReceivePacketToXandCheck:
|
||||
push xh
|
||||
@@ -81,7 +81,7 @@ comReceivePacketToXandCheck:
|
||||
pop xl
|
||||
pop xh
|
||||
brcc comReceivePacketToXandCheck_error
|
||||
rcall cproCheckMessageInBuffer ; (R16, R17, R18, X)
|
||||
rcall cproCheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||
ldi r16, COM_ERR_CHECKSUM
|
||||
brcc comReceivePacketToXandCheck_error
|
||||
sec
|
||||
|
||||
@@ -31,12 +31,12 @@
|
||||
.equ CPRO_PAYLOAD_FLAGS_SECONDS = 0x01
|
||||
.equ CPRO_PAYLOAD_FLAGS_UID = 0x02
|
||||
.equ CPRO_PAYLOAD_FLAGS_RESERVED1 = 0x04
|
||||
.equ CPRO_PAYLOAD_FLAGS_RESERVED2 = 0x08
|
||||
.equ CPRO_PAYLOAD_FLAGS_RESERVED3 = 0x10
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM0 = 0x20
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM1 = 0x40
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM3 = 0x80
|
||||
.equ CPRO_PAYLOAD_FLAGS_SHIFT_NUM = 5
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM0 = 0x08
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM1 = 0x10
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM2 = 0x20
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM3 = 0x40
|
||||
.equ CPRO_PAYLOAD_FLAGS_NUM4 = 0x80
|
||||
.equ CPRO_PAYLOAD_FLAGS_SHIFT_NUM = 3
|
||||
|
||||
|
||||
.equ CPRO_PACKET_HAVEADDR_OFFS_ADDRESS = COM_MSG_OFFS_PAYLOAD+4
|
||||
@@ -244,7 +244,7 @@ cproEnqueueMsgWithCmdAndSrcAddr:
|
||||
pop r20
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO given in R20
|
||||
rcall COM_EnqueuePacket ; (R15, R16)
|
||||
@@ -331,9 +331,7 @@ cproCalcPayloadSize_l1:
|
||||
brcc cproCalcPayloadSize_l2
|
||||
add r4, r17 ; add 4 bytes
|
||||
cproCalcPayloadSize_l2:
|
||||
lsr r16
|
||||
lsr r16
|
||||
lsr r16 ; after this R16 contains CPRO_PAYLOAD_FLAGS_NUM0-3
|
||||
lsr r16 ; shift out reserved1, after this R16 contains CPRO_PAYLOAD_FLAGS_NUM0-4
|
||||
add r16, r4 ; add previous bytes to R16
|
||||
ret
|
||||
|
||||
|
||||
@@ -514,7 +514,7 @@ cproEnqueueAddressPacket:
|
||||
st X+, r6 ; 5: value id
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "important" (higher retry count)
|
||||
ldi r20, COM_BUFFER_PRIO_IMPORTANT
|
||||
|
||||
@@ -40,7 +40,7 @@ CPRO_EnqueueDevice:
|
||||
st X+, r17 ; 11: modules mask low
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "normal" (slightly limited number of retries)
|
||||
ldi r20, COM_BUFFER_PRIO_NORMAL
|
||||
|
||||
@@ -23,26 +23,30 @@ CPRO_EnqueueComSendStats:
|
||||
pop r16
|
||||
brcc CPRO_EnqueueComSendStats_error
|
||||
|
||||
ldi r17, CPRO_PAYLOAD_FLAGS_UID | (6<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM) ; seconds + 6 bytes payload
|
||||
ldi r17, CPRO_PAYLOAD_FLAGS_UID | (8<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM) ; seconds + 8 bytes payload
|
||||
ldi r18, CPRO_CMD_COMSENDSTATS
|
||||
push xh
|
||||
push xl
|
||||
rcall cproBeginMsgWithVariablePayload ; (R3, R4, R16, R17, R18, R19, R20, R21, X)
|
||||
lds r16, comStatsPacketsOut ; 6: packets out
|
||||
lds r16, comStatsPacketsOut ; packets out
|
||||
st X+, r16
|
||||
lds r16, comStatsPacketsOut+1
|
||||
st X+, r16
|
||||
lds r16, comStatsCollisions ; 8: collisions
|
||||
lds r16, comStatsCollisions ; collisions
|
||||
st X+, r16
|
||||
lds r16, comStatsCollisions+1
|
||||
st X+, r16
|
||||
lds r16, comStatsAborted ; 10: aborted
|
||||
lds r16, comStatsAborted ; aborted
|
||||
st X+, r16
|
||||
lds r16, comStatsAborted+1
|
||||
st X+, r16
|
||||
lds r16, comStatsSendNoBuffer ; sendNoBuffer
|
||||
st X+, r16
|
||||
lds r16, comStatsSendNoBuffer+1
|
||||
st X+, r16
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "important" (higher retry count)
|
||||
ldi r20, COM_BUFFER_PRIO_IMPORTANT
|
||||
@@ -78,26 +82,38 @@ CPRO_EnqueueComRecvStats:
|
||||
pop r16
|
||||
brcc CPRO_EnqueueComRecvStats_error
|
||||
|
||||
ldi r17, CPRO_PAYLOAD_FLAGS_UID | (6<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM) ; seconds + 6 bytes payload
|
||||
ldi r17, CPRO_PAYLOAD_FLAGS_UID | (12<<CPRO_PAYLOAD_FLAGS_SHIFT_NUM) ; seconds + 6 bytes payload
|
||||
ldi r18, CPRO_CMD_COMRECVSTATS
|
||||
push xh
|
||||
push xl
|
||||
rcall cproBeginMsgWithVariablePayload ; (R3, R4, R16, R17, R18, R19, R20, R21, X)
|
||||
lds r16, comStatsPacketsIn ; 6: packets in
|
||||
lds r16, comStatsPacketsIn ; packets in
|
||||
st X+, r16
|
||||
lds r16, comStatsPacketsIn+1
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvCrcErrs ; 8: CRC errors
|
||||
lds r16, comStatsRecvCrcErrs ; CRC errors
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvCrcErrs+1
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvErrs ; 10: IO errors
|
||||
lds r16, comStatsRecvErrs ; IO errors
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvErrs+1
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvNoBuffer ; no buffer
|
||||
st X+, r16
|
||||
lds r16, comStatsRecvNoBuffer+1
|
||||
st X+, r16
|
||||
lds r16, comStatsHandled ; handled
|
||||
st X+, r16
|
||||
lds r16, comStatsHandled+1
|
||||
st X+, r16
|
||||
lds r16, comStatsMissed ; missed
|
||||
st X+, r16
|
||||
lds r16, comStatsMissed+1
|
||||
st X+, r16
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "important" (higher retry count)
|
||||
ldi r20, COM_BUFFER_PRIO_IMPORTANT
|
||||
|
||||
@@ -44,7 +44,7 @@ CPRO_EnqueueValue:
|
||||
st X+, r11 ; 11: high denom
|
||||
pop xl
|
||||
pop xh
|
||||
rcall comCalcAndAddChecksumByte
|
||||
rcall comCalcAndAddChecksumByte ; (R16, R17, R18, R19, X)
|
||||
|
||||
; mark buffer as enqueued with PRIO "normal" (slightly limited number of retries)
|
||||
ldi r20, COM_BUFFER_PRIO_NORMAL
|
||||
|
||||
Reference in New Issue
Block a user