内存不足 打开ftp文件 关于rtthread系统GD32F

下载大文件出错或来不及接收文件已经发完的问题。

系统使用建立ftp client进行远程文件下载,由于AT-socket基于串口通讯进行文件数据接收,文件下载使用标准的socket指令进行,无法分段下载,服务器会连续发送文件内容,每段按照最大包(大多按照1500字节)传输,若传输过程中出现,AT模块已经发送完毕,但是没来及取出数据(recv)的情况,造成文件下载失败的现象.这时,需要检查串口配置的,是否使用的DMA接收, DMA接收数据,会自动搬运数据,但是DMA的缓存有限,会导致数据被覆盖,无法成功接收。

TCP进行数据传输时,正常情况下,按照数据流传输,若使用DMA接收,则无法进行数据流控。可以把串口配置为中断接收,避免上述问题出现。

/**
  * @brief  uart init
  * @param  None
  * @retval None
  */

win7 直接打开ftp文件_ftp打开excel文件是空白的_内存不足 打开ftp文件

int rt_hw_usart_init(void) { struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; int i; int result; for (i = 0; i < sizeof(uart_obj) / sizeof(uart_obj[0]); i++) {

ftp打开excel文件是空白的_win7 直接打开ftp文件_内存不足 打开ftp文件

uart_obj[i].serial->ops = &gd32_uart_ops; uart_obj[i].serial->config = config; if(rt_strcmp(uart_obj[i].device_name, "uart1")==0 || rt_strcmp(uart_obj[i].device_name, "uart2")==0 || rt_strcmp(uart_obj[i].device_name, "uart4")==0 || rt_strcmp(uart_obj[i].device_name, "uart5")==0) { /* register UART1 device */ result = rt_hw_serial_register(uart_obj[i].serial, uart_obj[i].device_name,

ftp打开excel文件是空白的_内存不足 打开ftp文件_win7 直接打开ftp文件

RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, (void *)&uart_obj[i]); RT_ASSERT(result == RT_EOK); continue; } /* register UART1 device */ result = rt_hw_serial_register(uart_obj[i].serial, uart_obj[i].device_name,

win7 直接打开ftp文件_ftp打开excel文件是空白的_内存不足 打开ftp文件

#ifdef RT_SERIAL_USING_DMA RT_DEVICE_FLAG_RDWR | uart_obj[i].dma_flag, #else RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, #endif (void *)&uart_obj[i]); RT_ASSERT(result == RT_EOK);

ftp打开excel文件是空白的_内存不足 打开ftp文件_win7 直接打开ftp文件

} return result; }

AT socket出现内存不足的错误问题?no memory for URC receive buffer(1500)

此类错误是内存不足导致导致,但是如何造成的,就要从系统动态使用内存和释放的机理探究。

URC上报数据时,系统会动态开辟内存进行报文处理,内存开辟后,讲数据压入到队列或者环形缓存中,等待用户使用recv取出数据,这时才会释放内存。 在传输大文件时内存不足 打开ftp文件,URC上报的数据按照最大数据包1500字节进行分配内存,而且流速非常快。需要用户在线程中取出数据并释放内存,但是通常用户取出数据的速度赶不上URC上报的速度(文件传输时),此时回出现类似内存泄漏的现象(伪泄漏)。通常单片机的内存有限,经不起这样频繁开辟内存的消耗。故而,传输大文件时,传输过程中出现内存不足的错误。

解决方法:用户线程recv数据时,速度可以追不上urc,但是recv的数量可以2倍甚至3倍的最大数据包设置内存不足 打开ftp文件,这样可以将不断分配的内存,进行追赶式释放。避免内存伪泄露的现象。

在线咨询