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.

[参考译文] CC2650EM-7ID-RD:NPI中的内存泄漏

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/614590/cc2650em-7id-rd-memory-leak-in-npi

部件号:CC2650EM-7ID-RD
在“线程:CC2650”中讨论的其它部件

我已将CC2650设置为ZNP,但从主机收到大约~200个异步请求后,它在 iCall_primAllocMsg()处失败,并返回 ICALL_errno_resource

我已将来自主机的传入Rx事件应用程序回叫功能注册为Intercept   

NPITASK_registerIncomingRXEventAppCB (SensorTagApp_NPITASK_RxCB,intercept); 	

在 SensorTagApp_NPITASK_RxCB(uint8_t *pMsg)内,释放NPI消息框。

内部  

void SensorTagApp_NPITASK_RxCB(uint8_t *pMsg)
{
	uint8_t *pStartRxMsg;
	pStartRxMsg = pMsg;
	
	uint8_t datalen =*pMsg++;	//LEN
	uint8_t cmd0 =*pMsg++;	///
		
	
	
		正在处理中的逻辑mes1+
			
			......
			......
	*/
	
	//结尾处释放npI_frame msg
	iCall_freeMsg(pStartRxMsg);
} 

现在,在  Components/NPI/NPI_TASK_c中的NPITASK_processRXQ()中 ,它提到不释放NPI Msg容器,因为它将在堆栈中完成,但由于我正在截取RX事件到应用程序而不是重定向到堆栈,因此不应该  释放recPtr->npiMsg。  这是否导致内存泄漏?

//------------------
//! \brief 在RX队列中显示下一条消息并进行处理。
//!
//! 返回 void //--------------------------------------------

静态void NPITASK_processRXQ (void)
{
NPI_QueueRec *recPtr = NULL;

recPtr = Queue_dequeue (npiRxQueue);

IF (recPtr !=空)
{
IF (incomingRXEventAppCBFunc !=空)
{
交换机(incomingRXRtraceroute)
{
案例回显:
{
//发送到堆栈,并将副本发送到应用程序
NPITASK_sendBufToStack(npiAppEntityID, recPtr->npiMsg);
incomingRXEventAppCBFunc(recPtr->npiMsg->pBuf);
中断;
}

案例截取:
{
//仅向应用程序发送副本
incomingRXEventAppCBFunc(recPtr->npiMsg->pBuf);
中断;
}

无案例:
{
NPITASK_sendBufToStack(npiAppEntityID, recPtr->npiMsg);
中断;
}
}
}
否则
{
//发送到堆栈,并将副本发送到应用程序
NPITASK_sendBufToStack(npiAppEntityID, recPtr->npiMsg);
}

//释放队列记录
iCall_Free (recPtr);

//不要释放引用的npiMsg容器。 这将在堆栈任务中释放。
}
} 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此处有 一个示例dev.ti.com/.../index.html ,它确实建议释放两个缓冲区。


    void SBP_HandleNPIRxInterceptEvent(uint8_t *pMsg)

    //通过HCI TL发送命令
    HCI_TL_SendToStack((NPIMSG_msg_t *)pMsg)->pBuf);

    //数据存储为消息,首先释放该消息。
    iCall_freeMsg((NPIMSG_msg_t *)pMsg)->pBuf);

    //自由容器。
    iCall_Free (pMsg);
    }