嗨,对话小组,
这是我最近发现的一个非常棘手的问题。当我尝试连接时,我的设备自动复位了。
我的应用程序是基于DA14580\ U BEACON\ U 3.40.6的。请告知我还应该为这个问题做些什么。
以下是一些调查结果供您参考:
1) 当我让我的设备运行而不创建额外的应用程序计时器时,它工作得很好(连接成功而不需要自己重置)。
2) 如果在以下任一时间之后创建此附加计时器,则会发生此问题:
a) 断开连接[我使用GATT命令触发它]或
b) 电源循环[将配置保存在非易失性存储器中,以便下次启动时触发它]
3) 我试着用我自己的包装器“wrap\u platform\u reset”替换platform\u func来检查调试跟踪,结果发现
a) 应用程序函数“app\u connection\u func(struct gapc\u connection\u req\u ind const*param)”在其自身重置之前甚至没有被调用(我在这里也设置了断点,但没有停止)
b) 在函数“wrap\u platform\u reset”处设置的断点被停止,调用堆栈如下所示:
-换行\u平台\u重置0x20000CEE void f(unsigned int)
|-错误0xf2param-无符号int
-重置\u处理程序0x00000000 void f()
无效包装平台重置(uint32错误)
{
#ifdef CFG\u FORCE WDRST命令
//启动外围设备的电源域
SetBits16(PMU\u CTRL\u REG,PERIPH\u SLEEP,0);
而((GetWord16(SYS\u STAT\u REG)&PER\u IS\u UP);
spi_flash_enable(spi_GPIO_端口,spi_CS_引脚);//使spi闪存退出掉电模式,以便下次启动
spi_flash_wait_until_ready();
#其他
断言警告(1);
#结束
平台复位功能(错误);
}
嗨,陈先生,
我在app\u disconnect\u func中的断开连接事件后放置了一个额外的计时器,以便触发广告过程,设备正常地保持广告。0xf2f2意味着在某个时刻,应用程序被要求分配内存,但由于资源有限,分配失败。检查是否有内存泄漏的任何地方,你发送任何通知,你没有释放的消息。您是否在计时器处理程序执行后返回(keu MSG\u CONSUME)以及通常在所有处理函数中返回(keu MSG\u CONSUME)?
谢谢你的对话
嗨,MT\u dialog,
我已经检查了所有在执行后返回KE\u MSG\u CONSUME的处理程序。
我们是否有其他方法在运行时检查剩余的内存空间?
嗨,陈先生,
目前无法在运行时检查内存空间。您是否在程序中使用arch\u printf()函数来打印项目中的数据?使用arch\u printf()打印太多数据是获取此类错误的常见原因。
谢谢你的对话
嗨,MT\u Dialog,
我的应用程序中不使用任何调试打印。
现在,我只是有一个变通办法,利用另一个现有的计时器为我的案件。而且不用额外的定时器,现在就可以正常工作了。
但是,很明显,我建议使用调试工具来分析崩溃问题。
到目前为止,我发现了两个奇怪的崩溃/重置问题:
1) 在我的应用程序中添加新计时器
2) 快速发送OTA数据包(无响应写入)
对于案例1),利用现有计时器的解决方法
案例2)。使用write-with-response的变通方法,将显著降低升级性能
我们可以结束这个话题。