《表3 DMA接收缓存处理实例 (UART_SIZE=8)》
图2为循环接收缓存示意,表3列举了UART_SIZE=8时DMA接收缓存处理实例。ReadFromDMA函数首先判断总长度total和已读长度read的大小,如read大于等于total,说明本次DMA接收数据长度还没到UART_SIZE,可读数据缓存区从read Mod UART_SIZE开始,长度为len-(read Mod UART_SIZE),如表3中第1和第2数据行。如果read小于total,要判断接收数据总的长度(total+len)-read与缓存长度的大小,如果前者大,说明上次读后发生循环覆盖,说明有数据没有及时读取,已经覆盖了部分数据,可读数据缓存区从len后面开始,可能的数据长度就是UART_SIZE,如表3中第4和第5数据行;如前者小于等于后者,可读数据缓存区从read Mod UART_SIZE开始,长度为UART_SIZE–(read Mod UART_SIZE)+len,如表3中第3数据行。实际UART_SIZE可取128、256等,这样上述的Mod在C语言中的操作read%UART_SIZE可替换为read&(UART_SIZE-1)。
图表编号 | XD0036335200 严禁用于非法目的 |
---|---|
绘制时间 | 2019.01.25 |
作者 | 陈旭辉、杨红云 |
绘制单位 | 武汉纺织大学数学与计算机学院、湖北大学教育学院 |
更多格式 | 高清、无水印(增值服务) |