diff --git a/bspMCU/bsp_uart.c b/bspMCU/bsp_uart.c index eb4fc76..f155d7f 100644 --- a/bspMCU/bsp_uart.c +++ b/bspMCU/bsp_uart.c @@ -121,6 +121,7 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl) data_len = current_pos - ptUartUserData->m_last_dma_pos; if (data_len > 0) { + SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], data_len); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], data_len); } } @@ -133,10 +134,12 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl) if (part1 > 0) { + SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], part1); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], part1); } if (part2 > 0) { + SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[0], part2); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[0], part2); } } diff --git a/library/ringbuffer/include/ringbuffer.h b/library/ringbuffer/include/ringbuffer.h index d07a246..813bdba 100644 --- a/library/ringbuffer/include/ringbuffer.h +++ b/library/ringbuffer/include/ringbuffer.h @@ -118,6 +118,7 @@ extern int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length); extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch); extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size); extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr); +extern int rd_RingbufferPeekLinear(rd_ringbuf_t *rb, char *out, int length); extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length); extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch); extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch); diff --git a/library/ringbuffer/ringbuffer.c b/library/ringbuffer/ringbuffer.c index 8628457..f8ac6fb 100644 --- a/library/ringbuffer/ringbuffer.c +++ b/library/ringbuffer/ringbuffer.c @@ -249,6 +249,34 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr) return avail; } +/** + * @brief Peek data from the ring buffer into a linear buffer without consuming. + * + * @param rb A pointer to the ring buffer object. + * @param out A pointer to the output buffer to fill. + * @param length Maximum number of bytes to peek. + * + * @return Return the number of bytes actually copied. + */ +int rd_RingbufferPeekLinear(rd_ringbuf_t *rb, char *out, int length) +{ + if (!rb || !out || length <= 0) return RD_INVALUE; + + int avail = rd_RingbufferDataLen(rb); + if (avail == 0) return 0; + if (length > avail) length = avail; + + unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED); + if (rb->m_iBufsize - ri >= length) { + RD_MEMCPY(out, &rb->m_pcBufPtr[ri], length); + } else { + int first = rb->m_iBufsize - ri; + RD_MEMCPY(out, &rb->m_pcBufPtr[ri], first); + RD_MEMCPY(out + first, &rb->m_pcBufPtr[0], length - first); + } + return length; +} + /** * @brief Put a byte into the ring buffer. If ring buffer is full, this operation will fail. * diff --git a/peripheral/com.c b/peripheral/com.c index 911299b..fc6ee26 100644 --- a/peripheral/com.c +++ b/peripheral/com.c @@ -229,6 +229,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) char *pPeakData = NULL; int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); + char cPeekBuf[512]; + int iPeekLenLinear = rd_RingbufferPeekLinear(_ptComCtrl->m_stComBuf.m_ptRecv, cPeekBuf, sizeof(cPeekBuf)); if (iPeakLen < 0) { @@ -238,6 +240,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) { Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); + iPeekLenLinear = rd_RingbufferPeekLinear(_ptComCtrl->m_stComBuf.m_ptRecv, cPeekBuf, sizeof(cPeekBuf)); if (iPeakLen < 0) { @@ -269,7 +272,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) iPackLen = 1; if (NULL != ptMutiDev->m_pfCheck) { - iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); + iPackLen = ptMutiDev->m_pfCheck(cPeekBuf, iPeekLenLinear); } if (iPackLen > 0) @@ -341,7 +344,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize) iPackLen = 1; if (NULL != ptMutiDev->m_pfCheck) { - iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); + iPackLen = ptMutiDev->m_pfCheck(cPeekBuf, iPeekLenLinear); } }