防止RESET_MEM_ALLOC_FAIL。

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
8个职位/ 0个新职位
最后一篇
Stawiski.
离线
最后一次露面:3个月5天前
加入:2019-10-25 12:00
防止RESET_MEM_ALLOC_FAIL。

你好,

我正在使用示例应用程序“da14531-ble-notify-button-sword”,我修改了一点。

现在,只需更改一个参数,就可以使用RESET_MEM_ALLOC_FAIL错误或不使用RESET_MEM_ALLOC_FAIL错误重置应用程序,我想了解如何防止这种情况发生。

我的应用程序代码如下:

  • 设置timer0每10ms/15ms触发一次中断
  • 在计时器回调中,如果已连接用户,请使用app_easy_wakeup函数强制BLE唤醒并计划发送功能
  • 在我的发送函数中,用一些数据填充JSON字符串,使用KE_MSG_ALLOC_DYN分配内存,填充结构并发送它

现在这是会发生什么:

  • 如果Timer0回调设置为上面的示例中的10ms,则在大约之后。连接10S,发生重置
  • 如果Timer0回调设置为15ms,一切正常(无重置)

在一些挖掘后,它看起来像导致重置的唯一函数是ATTM_SVC_CREATE_DB()失败时会分配内存。

它在分配失败时崩溃的事实是有意义的(甚至在doxygen中有记录),但是,我希望我的程序能够检查是否可以分配足够的内存。我希望KE_MSG_ALLOC_DYN在失败时返回nullptr,但从我的实验来看,KE_MSG_ALLOC_DYN似乎可以成功,并且在ke_msg_send()之后触发重置。

我似乎没有能够检查呼叫堆栈是否会检查服务缓冲区。

问候

设备:
PW_Dialog
离线
最后一次露面:5个月5天前
职员
加入:2019-04-03 02:54
嗨Stawiski,

嗨Stawiski,

您是否可以确认您要在通过KE_MSG_ALLOC_DYN分配消息缓冲区的任务之间发送消息,并且当重置发生重置时,ke_msg_alloc_dyn的返回不是nullptr?如果减少或扩大分配大小,您是否检查会发生什么?可能也可以检查ke_msg_alloc。它从ke_mem_ke_msg堆内存分配。

顺便说一下,如果消息没有被发送,应该使用ke_msg_free()来释放空间。

Br,

PW_Dialog

Stawiski.
离线
最后一次露面:3个月5天前
加入:2019-10-25 12:00
嗨pw,

嗨pw,

我会在这个问题上进一步调查,让您知道。

问候

Stawiski.
离线
最后一次露面:3个月5天前
加入:2019-10-25 12:00
我正在调查它

我正在调查,它与中断和睡眠模式有关。当我为UART设置DMA时,我有非常相似的问题,然后在外围init中重新初始化DMA。经过一些DMA回调被解雇后,我实际上一直在收到回调,就像DMA打破一样。

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

我可能过会儿会再讲这个。

PM_DIALOG.
离线
最后一次露面:2天5小时前
职员
加入:2018-02-08 11:03
嗨stawiski,

嗨stawiski,

谢谢你的迹象。如果您对此有任何额外反馈,请回复我们。您的反馈将非常欢迎。

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

谢谢,PM_DIALOG.

Stawiski.
离线
最后一次露面:3个月5天前
加入:2019-10-25 12:00
你好,我们又见面了,

你好,我们又见面了,

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

这是一个问题,现在是开发我的申请的主要障碍。

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

我能够追踪到我认为是这个问题的根源,我需要Dialog的确认以及如何防止这一问题的建议。以下是我的发现:

  • 堆栈跟踪显示在使用0xF2F2F2F2参数中调用`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,我只能配置那个内存更大吗?
  • 通过' ke_msg_alloc() '签名,我希望函数在内存分配失败时返回NULL指针,为什么它会生成重置?

总的来说,由于跳转到' platform_reset_func() '后调用堆栈被损坏,很难找到这个失败的跟踪,我认为这是由于跳转表。

问候

PM_DIALOG.
离线
最后一次露面:2天5小时前
职员
加入:2018-02-08 11:03
嗨stawiski,

嗨stawiski,

perform_reset()调用τheplatform_reset_func(),该平台()在ROM代码中实现。最合适的原因是您获得此断言的原因是由于内存不足,因为您正在分配永不消耗的消息。例如,如果要分配通知消息,并且您有一个小的连接间隔,则邮件堆叠堆积,直到连接事件到达,但在连接事件到达之前,使用大的连接间隔耗尽内存。您可以增加连接间隔。可能,在您的应用程序中,每次连接后可能会有某种内存泄漏,因为错误代码是reset_mem_alloc_fail。为此,请检查是否有任何挂起的消息,并确保在处理消息时会消耗您获得的消息,或者如果您正在分配它们应该释放的数据。

你能试着增加连接间隔和堆大小吗?

谢谢,PM_DIALOG.

Stawiski.
离线
最后一次露面:3个月5天前
加入: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客户端的丢弃数据包,但它没有完全消除掉落。