From 6499fd159636fb2200b9fa24ffb76e5d5e011f35 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sun, 15 Jul 2018 20:51:42 -0400 Subject: [PATCH] Optimizing DMR RX buffer memory --- DMRDMORX.cpp | 33 +++++++++++++++++++++++---------- DMRDMORX.h | 2 +- DMRSlotRX.cpp | 33 +++++++++++++++++++++++---------- DMRSlotRX.h | 2 +- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/DMRDMORX.cpp b/DMRDMORX.cpp index c3b0813..f3f6bf0 100644 --- a/DMRDMORX.cpp +++ b/DMRDMORX.cpp @@ -33,6 +33,11 @@ const uint8_t CONTROL_NONE = 0x00U; const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_DATA = 0x40U; +const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; + +#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) +#define READ_BIT1(p,i) ((p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) >> (7 - ((i)&7))) + CDMRDMORX::CDMRDMORX() : m_patternBuffer(0x00U), m_dataPtr(0U), @@ -60,8 +65,8 @@ void CDMRDMORX::reset() void CDMRDMORX::databit(bool bit) { - m_buffer[m_dataPtr] = bit; - + WRITE_BIT1(m_buffer, m_dataPtr, bit); + m_patternBuffer <<= 1; if (bit) m_patternBuffer |= 0x01U; @@ -236,28 +241,36 @@ void CDMRDMORX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer) for (uint8_t i = 0U; i < count; i++) { buffer[i] = 0U; - buffer[i] |= ((m_buffer[start++] & 0x01) << 7); + buffer[i] |= READ_BIT1(m_buffer, start) << 7; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 6); + buffer[i] |= READ_BIT1(m_buffer, start) << 6; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 5); + buffer[i] |= READ_BIT1(m_buffer, start) << 5; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 4); + buffer[i] |= READ_BIT1(m_buffer, start) << 4; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 3); + buffer[i] |= READ_BIT1(m_buffer, start) << 3; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 2); + buffer[i] |= READ_BIT1(m_buffer, start) << 2; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 1); + buffer[i] |= READ_BIT1(m_buffer, start) << 1; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 0); + buffer[i] |= READ_BIT1(m_buffer, start) << 0; + start++; if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; } diff --git a/DMRDMORX.h b/DMRDMORX.h index 09a85d9..65123c1 100644 --- a/DMRDMORX.h +++ b/DMRDMORX.h @@ -41,7 +41,7 @@ public: private: uint64_t m_patternBuffer; - uint8_t m_buffer[DMO_BUFFER_LENGTH_BITS]; + uint8_t m_buffer[DMO_BUFFER_LENGTH_BITS / 8U]; // 72 bytes uint8_t frame[DMR_FRAME_LENGTH_BYTES + 3U]; uint16_t m_dataPtr; uint16_t m_syncPtr; diff --git a/DMRSlotRX.cpp b/DMRSlotRX.cpp index 3b32045..d08338e 100644 --- a/DMRSlotRX.cpp +++ b/DMRSlotRX.cpp @@ -36,6 +36,11 @@ const uint8_t CONTROL_NONE = 0x00U; const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_DATA = 0x40U; +const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; + +#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) +#define READ_BIT1(p,i) ((p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) >> (7 - ((i)&7))) + CDMRSlotRX::CDMRSlotRX() : m_slot(false), m_patternBuffer(0x00U), @@ -104,8 +109,8 @@ bool CDMRSlotRX::databit(bool bit) if (m_delayPtr < m_delay) return (m_state1 != DMRRXS_NONE) || (m_state2 != DMRRXS_NONE); - m_buffer[m_dataPtr] = bit; - + WRITE_BIT1(m_buffer, m_dataPtr, bit); + m_patternBuffer <<= 1; if (bit) m_patternBuffer |= 0x01U; @@ -421,28 +426,36 @@ void CDMRSlotRX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer) { for (uint8_t i = 0U; i < count; i++) { buffer[i] = 0U; - buffer[i] |= ((m_buffer[start++] & 0x01) << 7); + buffer[i] |= READ_BIT1(m_buffer, start) << 7; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 6); + buffer[i] |= READ_BIT1(m_buffer, start) << 6; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 5); + buffer[i] |= READ_BIT1(m_buffer, start) << 5; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 4); + buffer[i] |= READ_BIT1(m_buffer, start) << 4; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 3); + buffer[i] |= READ_BIT1(m_buffer, start) << 3; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 2); + buffer[i] |= READ_BIT1(m_buffer, start) << 2; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 1); + buffer[i] |= READ_BIT1(m_buffer, start) << 1; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; - buffer[i] |= ((m_buffer[start++] & 0x01) << 0); + buffer[i] |= READ_BIT1(m_buffer, start) << 0; + start++; if (start >= DMR_BUFFER_LENGTH_BITS) start -= DMR_BUFFER_LENGTH_BITS; } diff --git a/DMRSlotRX.h b/DMRSlotRX.h index f726ac8..26064f9 100644 --- a/DMRSlotRX.h +++ b/DMRSlotRX.h @@ -50,7 +50,7 @@ public: private: bool m_slot; uint64_t m_patternBuffer; - uint8_t m_buffer[DMR_BUFFER_LENGTH_BITS]; + uint8_t m_buffer[DMR_BUFFER_LENGTH_BITS / 8U]; // 72 bytes uint16_t m_dataPtr; uint8_t frame1[DMR_FRAME_LENGTH_BYTES + 3U];