我使用PSoC的Launcher模式,发现在Launcher切换到App后,在App中使用CySysGetResetReason获取WatchDog Reset原因不正确,没有发生WatchDog Reset,也依然判断发生过,判断条件是if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT)),去掉Launcher后就正常了,这是为什么?
已解决! 转到解答。
- 标签:
-
PSoC 4 MCU
这个跟工程没有关系,就是code语法的分析。
你这句话就相当于写了一个if(1&&1==1&&1),这个肯定是成立的。
因为从函数的角度出发,CySysGetResetReason(CY_SYS_RESET_WDT)和CySysGetResetReason(CY_SYS_RESET_SW))返回值是相同的为CY_SYS_RESET_SW,这两个值相与为1。 CY_SYS_RESET_WDT&&CY_SYS_RESET_SW这部分两个非0的值相与为1,所以代码每次都能执行这个条件成立的部分。
我建了一个launcher的工程,在APP中我调用下面的逻辑,
if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT))
{
PWM_1_Start();
}
代码没有跳进去执行"PWM_1_Start();" ;不知道你是通过什么样的测试发现这个地方有问题的?
sorry是我描述有问题,你能否再试一下这个if (CY_SYS_RESET_WDT&&CY_SYS_RESET_SW == CySysGetResetReason(CY_SYS_RESET_WDT)&&CySysGetResetReason(CY_SYS_RESET_SW))条件,这个在Launcher切换到App后会一直判断有,if (CY_SYS_RESET_WDT == CySysGetResetReason(CY_SYS_RESET_WDT))这个条件虽然没有判断有,但即使发生过WatchDog Reset也判断不出来。
Launcher 跳到APP的时候会调用API: CySoftwareReset();
这个你可以在static void Launcher_LaunchApplication(void)这个函数里面找到。
这样你在上面提到的if条件就成立了,理论和实验现象都是合理的。
如果像验证WDT reset的话,你可以在Laucher的code中判断。
我明白Launcher会有CySoftwareReset();所以我加上了CY_SYS_RESET_SW判断,但是并没有发生过WatchDog Reset,if (CY_SYS_RESET_WDT&&CY_SYS_RESET_SW == CySysGetResetReason(CY_SYS_RESET_WDT)&&CySysGetResetReason(CY_SYS_RESET_SW))这个条件依然会进入,我很困扰,你能提供一个有Launcher的例程吗?以上述的条件做判断。
这个跟工程没有关系,就是code语法的分析。
你这句话就相当于写了一个if(1&&1==1&&1),这个肯定是成立的。
因为从函数的角度出发,CySysGetResetReason(CY_SYS_RESET_WDT)和CySysGetResetReason(CY_SYS_RESET_SW))返回值是相同的为CY_SYS_RESET_SW,这两个值相与为1。 CY_SYS_RESET_WDT&&CY_SYS_RESET_SW这部分两个非0的值相与为1,所以代码每次都能执行这个条件成立的部分。