请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TM4C1294KCPDT 工具/软件:TI-RTOS
您好!
我要将 TFTP 功能添加到我的上一个项目中。 初始调试后、整个过程开始顺利工作、但是、我遇到了一个很难找到的问题。 我有一个处理 TCP 套接字传输的任务和一个由 DemonNew 创建的任务(处理 UDP/tftp 上的文件传输)。 dtask_tftp()是一个回调函数,用于处理 TFTP,但是,总是在第4个文件传输时尝试中止它。 代码不会崩溃、TCP 相关任务和其他功能仍然正常工作。 在调试之后,我发现这是动态内存分配 mmAlloc(),它返回 NULL 指针并使回调函数终止。 我正在阅读与 NDK 相关 的 SPRU524K pdf、试图了解可能的原因。 每次传输后、我都会监控 HeapMem 和 ROV 中的任务峰值堆栈需求、直到发生所描述的行为。 我没有发现堆栈溢出或内存泄漏。
我无法通过 NDK mmAlloc()实现它,我使用了标准 stdlib.h malloc()和 free()(也可以在下面的代码中看到)。 在本例中、我逐个下载了8个以上的文件、没有问题。
有经验的用户有什么想法? 那么、我错过了什么呢? 使用 NDK 的应用程序使用 malloc()和 free()是否正确?
int dtask_tftp (未使用 socket s、uint32){ TFTP *pTftp; int rc;//返回代码*/ struct timeval 超时; //如果回调函数为空,则中止*/ if (g_pfnRequest == NULL) goto abort; // mftparameter structure *// if (!(ptalloc)=null) of tftp (alalloc) 如果 (!(pTftp = malloc (sizeof (TFTP)))))最终转至; //将参数初始化为"NULL"*/ bzero (pTftp、sizeof (TFTP)); // Malloc 数据包缓冲区*// if (!(pTftp->PacketBuffer = mmAlloc (data_size))) 如果(!(pTftp->PacketBuffer = malloc (data_size)))){ 转至离开; } //初始化地址和本地端口*/ bzero (&pTftp->localaddr、sizeof (struct localaddr_in); pTftp->localaddr.net_family = af_iftp->localadtsin ;tunt = pnatnk_port.cn_port<tunt = tps.cn_port=tps.tunt;tunt = pnatnk_port_port.adtunt /*保存套接字的副本*/ pTftp->sock = s; //设置套接字 IO 超时*/ timeout.tt_sec = tftf_sock_timeout; timeout.tv_usec = 0; if (setsockopt (pftp->sock、SOL_socket、SO_SNDTIMEO、 timeout、 sizeof (timeout)<0) 转到 abort; if (setsockopt (pTftp->sock、SOL_Socket、SO_RCVTIMEO、&timeout、 sizeof (timeout)<0) 转到 abort; //针对 (;){ //尝试获取回复数据包*/ rc = tftpReadPacket (pTftp); if (RC < 0) 转到 abort; //处理回复数据包*/ rc = tftpProcessPacket (pTftp); if (tftRC < 0 )转到 abort;// tftgoabort /*如果完成、则中断循环*/ 如果(RC =1) 中断; } RC = tftpSocketRestart (pTftp); 如果(RC < 0){ 转至中止; } //由于套接字仍处于打开状态,返回"1"*/ *(我们需要保持 UDP 套接字打开)*/ RC = 1; 转至离开 ;中止: RC = 0; if (pTftp->Sock!= invalue_socket) fdClose (pTftp->Sock); leave: if (pTftp->PacketBuffer) free(pTftp->PacketBuffer); //mmFree (pTftp->PacketBuffer); fin: if (pTftp) FREE (pTftp); //mmFree (pTftp); return (RC); }
提前感谢。
