TI中文支持网
TI专业的中文技术问题搜集分享网站

退网时堆栈溢出

 osal_memset((uint8 *)&leaveReq,0,sizeof(NLME_LeaveReq_t));

      osal_memcpy(leaveReq.extAddr,NLME_GetExtAddr(),Z_EXTADDR_LEN);

        leaveReq.removeChildren =0;
        
        leaveReq.rejoin =1;
      
        leaveReq.silent = 0;
        
        NLME_LeaveReq( &leaveReq );

加上红色部分就会堆栈溢出,不加就不会。不过在函数SampleApp_Init( uint8 task_id )中我使用了这个函数,也没有堆栈溢出。

而现在的表现情况就是使用这个函数后有时不能入网有时可以入网。该函数在终端中使用。我怀疑是不是在退网程序中我没有加该函数的原因。不过如果加了由于发生了堆栈溢出就会出现很多奇怪的问题。

James Chu:

try

leave_req.extAddr = NULL;

Tianhao Wang:

回复 James Chu:

leave_req.extAddr = NULL;后确实不会溢出,不过终端退网以后就不能加入网络了。硬件复位一下就可以了加入了。是怎么回事

Tianhao Wang:

回复 Tianhao Wang:

并不是leave_req.extAddr = NULL加不进网,我回到原来的程序也会出现这种情况

不过好像是随机的。我还没有找到规律

Aries Lord:

typedef struct{  uint8* extAddr;  uint8  removeChildren;  uint8  rejoin;  uint8  silent;} NLME_LeaveReq_t;

很明显这个是个指针,不支持memcpy,你要赋值一个数组,然后指针指向数组。

Tianhao Wang:

回复 Aries Lord:

嗯,溢出确实是这个原因不过我定义了个数组DEV_ID,加入如下程序

osal_memcpy(DEV_ID,NLME_GetExtAddr(),Z_EXTADDR_LEN);//读取IEEEleaveReq.extAddr=DEV_ID;

这个根本就退不了网

Tianhao Wang:

回复 Tianhao Wang:

求解答,

Tianhao Wang:

回复 Tianhao Wang:

求解答

Tianhao Wang:

回复 Tianhao Wang:

求解答

wei shi5:

回复 Tianhao Wang:

你是设备请求退网还是协调器让设备离网啊,这俩不一样啊,如果是第一种情况你把rejion设false,还有exAddr=NULL,

其实官方例程SampleLight有,你没细看,

static void zclSampleLight_BasicResetCB( void ){ NLME_LeaveReq_t leaveReq; // Set every field to 0 osal_memset( &leaveReq, 0, sizeof( NLME_LeaveReq_t ) );

// This will enable the device to rejoin the network after reset. //leaveReq.rejoin = TRUE; leaveReq.rejoin = FALSE;

// Set the NV startup option to force a "new" join. zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );

// Leave the network, and reset afterwards if ( NLME_LeaveReq( &leaveReq ) != ZSuccess ) { // Couldn't send out leave; prepare to reset anyway ZDApp_LeaveReset( FALSE ); }}

Tianhao Wang:

回复 wei shi5:

设备请求退网和协调器让设备离网是不一样,我的设备请求退网加密之前基本没有问题,加密过后才有问题,主要就是协调器让设备退网一直没有做好。

赞(0)
未经允许不得转载:TI中文支持网 » 退网时堆栈溢出
分享到: 更多 (0)