微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 退网时堆栈溢出

退网时堆栈溢出

时间:10-02 整理:3721RD 点击:

 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 )中我使用了这个函数,也没有堆栈溢出。

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

try

leave_req.extAddr = NULL;

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

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

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

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

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

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

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

这个根本就退不了网

求解答,

求解答

求解答

你是设备请求退网还是协调器让设备离网啊,这俩不一样啊,如果是第一种情况你把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 );
}
}

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

另外我在SampleLight中也没有找到退网的例子

文件路径入下图

你用的旧协议栈啊,那我就不清楚了

哦,你用的什么版本的呢?

1.2.2a

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top