Preventing RESET_MEM_ALLOC_FAIL.

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

你好,

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

I got to the point where with one parameter change I can make the application reset with RESET_MEM_ALLOC_FAIL error, or not, and I'd like to understand how to prevent this.

我的应用程序代码如下:

  • Set up timer0 to trigger an interrupt every 10ms/15ms
  • 在计时器回调中,如果已连接用户,请使用app_easy_wakeup函数强制BLE唤醒并计划发送功能
  • In my sending function, fill JSON string with some data, allocate memory using KE_MSG_ALLOC_DYN, fill out the structure and send it away

现在这是会发生什么:

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

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

The fact it crashes upon allocation failue makes sense (and is even documented in doxygen), however, I'd like my program to be able to check if enough memory can be allocated. I was hoping for KE_MSG_ALLOC_DYN to return nullptr when it fails, but from my experimentation, it looks like KE_MSG_ALLOC_DYN can succeed and reset is triggered somewhere after ke_msg_send().

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

问候

Device:
PW_Dialog
离线
最后一次露面:2 weeks 3 days ago
职员
加入:2019-04-03 02:54
Hi Stawiski,

Hi Stawiski,

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

BTW, if the message has not been sent in any reason, should use ke_msg_free() to free the space.

Br,

PW_Dialog

Stawiski.
离线
最后一次露面:3 months 2 weeks ago
加入:2019-10-25 12:00
嗨pw,

嗨pw,

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

问候

Stawiski.
离线
最后一次露面:3 months 2 weeks ago
加入:2019-10-25 12:00
我正在调查它

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

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

I might get back to this later on.

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

Hi stawiski,

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

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

谢谢,PM_DIALOG.

Stawiski.
离线
最后一次露面:3 months 2 weeks ago
加入:2019-10-25 12:00
你好,我们又见面了,

你好,我们又见面了,

不幸的是,这个问题仍然存在sleep mode disabled completely.

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

我注意到这仍然会随机发生if I let my application run long enough, while streaming data from "notify" characteristics. Sometimes the crash happens after few minutes, sometimes it will take 15-20min.

I was able to trace what I believe is the origin of this issue and I need confirmation from Dialog as well as suggestions on how to prevent this. Here are my findings:

  • 堆栈跟踪显示在使用0xF2F2F2F2参数中调用`platform_reset_func()`之前调用`ke_msg_alloc()`的调用
  • “ke_msg_alloc()”使用“KE_MSG_ALLOC_DYN()的macro in my application

Here are my questions:

  • 扫描SDK,只有一个在`attm_svc_create_db()`中提到的reset_mem_alloc_fail,但似乎还有其他地方生成这个重置,这是那些?
  • 你提到'ke_msg_alloc()`使用ke_mem_ke_msg,我只能配置那个内存更大吗?
  • By `ke_msg_alloc()` signature, I'd expect the function to return NULL pointer when memory allocation fails,为什么它会生成重置?

Overall it's been hard to find the trace on this failure due to call stack being corrupted after the jump to `platform_reset_func()` is made, I believe it's due to jump table.

问候

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

Hi stawiski,

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

Could you please try to increase the connection interval and the heap size?

谢谢,PM_DIALOG.

Stawiski.
离线
最后一次露面:3 months 2 weeks ago
加入:2019-10-25 12:00
谢谢你的解释。

谢谢你的解释。在堆大小建议之后,我已经实现了一些呼叫程序崩溃的帮助函数,实际上该程序在Ke Msg的内存上运行低。我没有到底的东西,是实现的

ke_check_malloc()

在呼叫前打电话

ke_msg_alloc_dyn()

did not help, as if there was more memory trying to be allocated internally after passing the message.

有什么帮助到底,正在为我的通知实施定制处理程序

user_catch_rest_hndl()

and dropping the packets to be queued if the confirmation was not received. I have implemented a simple counter which is incremented upon `ke_msg_send()` and decremented in my handler in `user_catch_rest_hndl()`.

The problem with this solution is that I started seeing lots of dropped packets. What's very interesting is that on Windows I would see a rate as high as 10% of dropped packets, while on Mac I would see no dropped packets at all.

In any case, the memory crash is gone. I did not have a memory leak in my program, I only use

ke_msg_alloc_dyn()

在奇异的地方 - 与你的示例代码相同。

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