This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1294KCPDT:NDK mmAlloc()返回 NULL

Guru**** 2563960 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/751112/rtos-tm4c1294kcpdt-ndk-mmalloc-returns-null

器件型号: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);
} 


提前感谢。