阻止reset_mem_alloc_fail。

⚠️
你好。。谢谢你来到论坛。令人兴奋的消息!我们现在正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有员额和帐户都已迁移。我们现在只接受新论坛的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
8个帖子/ 0新
最后一篇文章
斯塔维斯基
离线
最后一次见到:3个月4天前
加入:2019-10-25 12:00
阻止reset_mem_alloc_fail。

你好

我正在玩示例应用程序“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()之后触发触发。

我似乎无法检查是否会在调用堆栈中分配服务缓冲区。

当做

设备:
pw_dialog.
离线
最后一次见到:5个月4天前
工作人员
加入:2019-04-03 02:54
嗨Stawiski,

嗨Stawiski,

您是否可以确认您希望通过KE_MSG_ALLOC_DYN分配消息缓冲区在任务之间发送消息,并且在重置发生时KE_MSG_ALLOC_DYN的返回不是nullptr?您是否检查过如果减少或扩大分配规模会发生什么情况?也许你也可以检查一下KE_MSG_ALLOC。它从KE_MEM_KE_MSG堆内存进行分配。

BTW,如果消息尚未以任何原因发送,应使用KE_MSG_FREE()释放空间。

布罗尔,

pw_dialog.

斯塔维斯基
离线
最后一次见到:3个月4天前
加入:2019-10-25 12:00
嗨,嗯,

嗨,嗯,

我将对此进行进一步调查,并让您知道。

当做

斯塔维斯基
离线
最后一次见到:3个月4天前
加入:2019-10-25 12:00
我在调查,现在

我在调查,不知怎么的,它与中断和睡眠模式有关。我在为UART设置DMA时遇到了非常类似的问题,然后进入睡眠状态,并在外围设备初始化中重新初始化DMA。在一些DMA回调被触发后,我实际上一直在收到回调,就像DMA坏了一样。

现在我在我的应用程序中禁用了睡眠,这完全照顾这个问题,并取消阻止我进一步发展我的申请。

我以后可能会回到这一点。

PM_对话框
离线
最后一次见到:1天21小时前
工作人员
加入:2018-02-08 11:03
嗨Stawiski,

嗨Stawiski,

谢谢你的提示。如果您对此有任何额外反馈,请与我们联系。欢迎您的反馈。

如果你有任何其他问题,请提出一个新的论坛线程。

谢谢,下午好

斯塔维斯基
离线
最后一次见到:3个月4天前
加入:2019-10-25 12:00
你好,

你好,

不幸的是,这个问题仍然存在,即使在睡眠模式完全禁用。

这个问题现在是开发我的应用程序的主要障碍。

我注意到这仍然会发生随机发生如果我让我的应用程序运行足够长,则在从“通知”特征中流传输数据时。有时崩溃在几分钟后发生,有时它将需要15-20分钟。

我能够追查我认为是这个问题的起源,我需要对话的确认以及关于如何防止这种情况的建议。这是我的调查结果:

  • 堆栈跟踪显示在使用0xF2F2参数调用“platform_reset_func()”之前对“ke_msg_alloc()”的调用
  • `ke_msg_alloc()`使用我的应用程序中的`ke_msg_alloc_dyn()`宏

以下是我的问题:

  • 在扫描SDK时,只有一个地方提到了“attm_svc_create_db()”中的RESET_MEM_ALLOC_FAIL,但似乎还有其他地方生成了此重置,这些地方是什么?
  • 您提到'ke_msg_alloc()'使用ke_MEM_ke_msg,我可以只将该内存配置为更大吗?
  • by`ke_msg_alloc()`签名,我期望在内存分配失败时返回null指针的函数,为什么会产生重置?

总的来说,由于跳转到“platform_reset_func()`”跳转后,由于呼叫堆栈被损坏,很难找到此失败的痕迹,我相信它是由于跳跃表。

当做

PM_对话框
离线
最后一次见到:1天21小时前
工作人员
加入:2018-02-08 11:03
嗨Stawiski,

嗨Stawiski,

t platform_reset_func()由在ROM代码中实现的platform_reset()调用。获得此断言的最可能原因是内存不足,因为您正在分配从未使用过的消息。例如,如果您正在分配通知消息,并且您的连接间隔很小,则消息会堆积起来,直到连接事件到达,但是如果连接间隔很大,则在连接事件到达之前内存就会耗尽。您可以增加连接间隔。可能,在应用程序中,每次连接后都会出现某种内存泄漏,因为错误代码是RESET\u MEM\u ALLOC\u FAIL。为此,请检查是否存在任何挂起的消息,并确保您正在使用处理消息时收到的消息,或者如果您正在分配数据,则应释放这些消息。

您可以尝试增加连接间隔和堆大小吗?

谢谢,下午好

斯塔维斯基
离线
最后一次见到:3个月4天前
加入:2019-10-25 12:00
谢谢你的解释。

谢谢你的解释。根据堆大小的建议,我实现了一些在程序崩溃时调用的助手函数,实际上,程序运行时的KE MSG内存不足。我没有弄清楚的是,这是真的吗

ke_check_malloc()

先打电话再打

KE_MSG_ALLOC_DYN()

没有帮助,好像在传递消息后尝试在内部分配更多内存。

最终有帮助的是在中为我的通知实现一个自定义处理程序

user_catch_rest_hndl()

如果未收到确认,则丢弃要排队的数据包。我已经实现了一个简单的计数器,该计数器递增在“ke_msg_send()`上递增,并在我的处理程序中递减在`user_catch_rest_hndl()`中。

这个解决方案的问题是我开始看到大量丢弃的数据包。什么是非常有趣的是,在Windows上,我会看到一个高达10%的丢弃数据包的速率,而在Mac上我只会看到没有丢弃的数据包。

在任何情况下,内存崩溃都消失了。我的程序没有内存泄漏,我只使用

KE_MSG_ALLOC_DYN()

在单数位置-与示例代码中相同。

此外,增加KE MSG的堆大小确实有助于减少Windows客户端丢弃的数据包,但它并没有完全消除丢弃的数据包。