协议栈版本:ZHA1.2.2a
设备类型:路由
问题:
1、本设备需要在运行过程中手动进行端点的注册和删除,设置了一个最大端点注册数量是20;
2、只单纯地进行端点注册,没问题,而且20个端点也都能正常使用;
3、将端点通过afDelete()进行删除后,再重新添加端点,也能添注册成功,但是协议栈系统就出问题了,表现是:
不能往其他设备发送数据,自身的link stauts广播包也不发送,但是别的设备路由请求(不是请求本设备,是请求另外的设备)还能转发。
4、出问题后,重新上电就正常了。
分析:
看了端点的注册和删除的代码,看到以下关于内存的获取释放的部分,有疑惑:
1、端点注册时,先申请了一块这个端点描述符结构体类型的内存,epDesc = (endPointDesc_t *)osal_mem_alloc(sizeof(endPointDesc_t));
typedef struct
{
uint8 endPoint;
uint8 *task_id; // Pointer to location of the Application task ID.
SimpleDescriptionFormat_t *simpleDesc;
afNetworkLatencyReq_t latencyReq;
} endPointDesc_t;
然后又申请了一块下边这个端点列表的结构体类型的内存,epList_t *ep = osal_mem_alloc(sizeof(epList_t));
typedef struct _epList_t {
struct _epList_t *nextDesc;
endPointDesc_t *epDesc;
pDescCB pfnDescCB; // Don't use if this function pointer is NULL.
afAPSF_Config_t apsfCfg;
eEP_Flags flags;
pApplCB pfnApplCB; // Don't use it if it has not been set to a valid function pointer by the application
} epList_t;
epList_t 结构体中包含了一个端点描述符的结构体的指针endPointDesc_t *epDesc,指向的是第一次申请的那块内存(epDesc = (endPointDesc_t *)osal_mem_alloc(sizeof(endPointDesc_t)))。
2、端点注册成功后,所有申请的内存就应该是都占用的,然乎在端点的删除函数afDelete()中,只看到了对对应epList_t的指针的内存释放,而epList_t这个结构体内部,指向端点描述符结构体endPointDesc_t的指针对应的内存,并没有被释放,这样是不是有问题?
3、实际设备在对端点的反复注册、删除,是不是会由于上述的问题,导致内存被占满,协议栈系统出问题?