你好
我正在玩示例应用程序“da14531 ble notify button wakeup”,我对其进行了一些修改。
我到达一个参数更改的位置,我可以使用reset_mem_alloc_fail错误进行应用程序重置,而不是,我想了解如何防止这种情况。
我的申请代码如下:
- 设置Timer0以触发每10ms / 15ms的中断
- 在计时器回调中,如果用户已连接,则强制BLE唤醒,并使用app_easy_唤醒功能安排我的发送功能
- 在我的发送函数中,使用一些数据填充JSON字符串,使用KE_MSG_ALLOC_DYN分配内存,填写结构并将其发送
现在情况是这样的:
- 如果timer0回调设置为10ms(如上例所示),则在连接约10s后,会进行重置
- 如果timer0回调设置为15ms,则一切正常(无重置)
经过一些挖掘之后,看起来导致重置的唯一函数是attm_svc_create_db(),因为它无法分配内存。
它在分配失败时崩溃的事实是有道理的(并且甚至在doxygen中记录),但是,我希望我的程序能够检查是否可以分配足够的内存。我希望在失败时返回nullptr,但从我的实验中返回nullptr,看起来像ke_msg_alloc_dyn可以成功并且重置在ke_msg_send()之后触发触发。
我似乎无法检查是否会在调用堆栈中分配服务缓冲区。
当做
关键词:
设备:
嗨Stawiski,
您是否可以确认您希望通过KE_MSG_ALLOC_DYN分配消息缓冲区在任务之间发送消息,并且在重置发生时KE_MSG_ALLOC_DYN的返回不是nullptr?您是否检查过如果减少或扩大分配规模会发生什么情况?也许你也可以检查一下KE_MSG_ALLOC。它从KE_MEM_KE_MSG堆内存进行分配。
BTW,如果消息尚未以任何原因发送,应使用KE_MSG_FREE()释放空间。
布罗尔,
pw_dialog.
嗨,嗯,
我将对此进行进一步调查,并让您知道。
当做
我在调查,不知怎么的,它与中断和睡眠模式有关。我在为UART设置DMA时遇到了非常类似的问题,然后进入睡眠状态,并在外围设备初始化中重新初始化DMA。在一些DMA回调被触发后,我实际上一直在收到回调,就像DMA坏了一样。
现在我在我的应用程序中禁用了睡眠,这完全照顾这个问题,并取消阻止我进一步发展我的申请。
我以后可能会回到这一点。
嗨Stawiski,
谢谢你的提示。如果您对此有任何额外反馈,请与我们联系。欢迎您的反馈。
如果你有任何其他问题,请提出一个新的论坛线程。
谢谢,下午好
你好,
不幸的是,这个问题仍然存在,即使在睡眠模式完全禁用。
这个问题现在是开发我的应用程序的主要障碍。
我注意到这仍然会发生随机发生如果我让我的应用程序运行足够长,则在从“通知”特征中流传输数据时。有时崩溃在几分钟后发生,有时它将需要15-20分钟。
我能够追查我认为是这个问题的起源,我需要对话的确认以及关于如何防止这种情况的建议。这是我的调查结果:
以下是我的问题:
总的来说,由于跳转到“platform_reset_func()`”跳转后,由于呼叫堆栈被损坏,很难找到此失败的痕迹,我相信它是由于跳跃表。
当做
嗨Stawiski,
t platform_reset_func()由在ROM代码中实现的platform_reset()调用。获得此断言的最可能原因是内存不足,因为您正在分配从未使用过的消息。例如,如果您正在分配通知消息,并且您的连接间隔很小,则消息会堆积起来,直到连接事件到达,但是如果连接间隔很大,则在连接事件到达之前内存就会耗尽。您可以增加连接间隔。可能,在应用程序中,每次连接后都会出现某种内存泄漏,因为错误代码是RESET\u MEM\u ALLOC\u FAIL。为此,请检查是否存在任何挂起的消息,并确保您正在使用处理消息时收到的消息,或者如果您正在分配数据,则应释放这些消息。
您可以尝试增加连接间隔和堆大小吗?
谢谢,下午好
谢谢你的解释。根据堆大小的建议,我实现了一些在程序崩溃时调用的助手函数,实际上,程序运行时的KE MSG内存不足。我没有弄清楚的是,这是真的吗
先打电话再打
没有帮助,好像在传递消息后尝试在内部分配更多内存。
最终有帮助的是在中为我的通知实现一个自定义处理程序
如果未收到确认,则丢弃要排队的数据包。我已经实现了一个简单的计数器,该计数器递增在“ke_msg_send()`上递增,并在我的处理程序中递减在`user_catch_rest_hndl()`中。
这个解决方案的问题是我开始看到大量丢弃的数据包。什么是非常有趣的是,在Windows上,我会看到一个高达10%的丢弃数据包的速率,而在Mac上我只会看到没有丢弃的数据包。
在任何情况下,内存崩溃都消失了。我的程序没有内存泄漏,我只使用
在单数位置-与示例代码中相同。
此外,增加KE MSG的堆大小确实有助于减少Windows客户端丢弃的数据包,但它并没有完全消除丢弃的数据包。