zll灯端问题求解,关于zllSampleLight_OnOffCB函数
我的片子是cc2530f256,现在遇到一个问题,请ti的工程师帮帮忙
我在桥端发了一个开灯的命令,也就是COMMAND_ON,灯端收到命令后,会调用zllSampleLight_OnOffCB这个函数
我的问题是,为什么在这边函数中,条件满足后却不执行,我在线debug,这个地方也不能打断点,而是直接跑到下面的taggle的部分去了
后来我又试了下关灯的命令,结果是一样的,也是直接跑到下面的taggle部分去了,我不能理解,为什么条件满足却不能执行
static void zllSampleLight_OnOffCB( uint8 cmd )
{
// Turn on the light
if ( cmd == COMMAND_ON ) //当收到COMMAND_ON时为什么条件满足却不执行
{
zllSampleLight_OnOff = LIGHT_ON; //此处为什么不能打断点
zllSampleLight_GlobalSceneCtrl = TRUE;
if ( zllSampleLight_OnTime == 0 )
{
zllSampleLight_OffWaitTime = 0;
}
}
// Turn off the light
else if ( cmd == COMMAND_OFF )//当收到COMMAND_OFF命令时,这边满足条件却不执行
{
zllSampleLight_OnOff = LIGHT_OFF;//此处为什么不能打断点
//zllSampleLight_GlobalSceneCtrl = FALSE; //see ZLL spec 11-0037-03 6.6.1.2.1
zllSampleLight_OnTime = 0;
}
// Toggle the light
else
{
if ( zllSampleLight_OnOff == LIGHT_OFF ) //当收到COMMAND_ON时,跑到这里,
{
zllSampleLight_OnOff = LIGHT_ON; //这边都可以打断点
zllSampleLight_GlobalSceneCtrl = TRUE;
if ( zllSampleLight_OnTime == 0 )
{
zllSampleLight_OffWaitTime = 0;
}
}
else
{
zllSampleLight_OnOff = LIGHT_OFF;//当收到COMMAND_OFF命令时,执行这里
zllSampleLight_OnTime = 0;
}
}
hwLight_UpdateOnOff( zllSampleLight_OnOff );
zllSampleLight_SceneValid = 0;
}
不知道我的意思描述的清楚不?希望能看懂,并且尽快给我答复,谢谢了!
有没有人来帮我解答一下啊?
首先你发送的on/off命令,灯有没有正常的相应。
没办法断点,可能是IAR优化代码的缘故。
你也可以通过空中抓包把这个过程看下。
首先很感谢vv帮我解答问题,我发送的on/off命令,灯是可以正常的响应的 其次,我不知道为什么这边会被优化,这边应该是很正常的条件语句啊 我是在读灯的开关属性的时候,发现这边的问题的
首先很感谢vv帮我解答问题,我发送的on/off命令,灯是可以正常的响应的 其次,我不知道为什么这边会被优化,这边应该是很正常的条件语句啊 我是在读灯的开关属性的时候,发现这边的问题的,灯的属性读出来总是0 ,不知道zll官方协议对这边有没有做VV
首先你发送的on/off命令,灯有没有正常的相应。
没办法断点,可能是IAR优化代码的缘故。
你也可以通过空中抓包把这个过程看下。
Ann:
前面@VV 说得对,这是IAR优化代码的缘故。
分析一下汇编代码,先看我用红色框起来的部分:
执行到 else if ( cmd == COMMAND_OFF ) 这句,如果为真,跳转的位置是直接到下面的0x68FE0,从C代码来看,就是跑到toggle里面去了,执行的语句是一样的,都是:
zllSampleLight_OnOff = LIGHT_OFF; zllSampleLight_OnTime = 0;
这个原因是编译器发现两种条件都会调用同样的代码块,就不再把同样的代码块复制一份了,而是直接合成一个,两种条件都会跳转到那同一个代码块里面,以优化生成文件的体积。
我试了把IAR的优化关掉,然而那样生成的代码CC2530F256就放不下了,直接报错,所以,只能这样了……