嗨,对话框的团队,
如果DEF_SVC1_BUTTON_STATE_CHAR_LEN大于24(字节),而发送间隔是每20ms(或更短),DA14585芯片就会内存溢出,
请建议如何正确发送240字节每20ms。
请看示例代码:
//更新按钮特性
struct custs1_val_ntf_ind_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_NTF_REQ,
prf_get_task_from_id (TASK_ID_CUSTS1),
TASK_APP,
custs1_val_ntf_ind_req,
DEF_SVC1_BUTTON_STATE_CHAR_LEN);
申请- > conidx = app_env - > conidx;
申请- >通知= true;
申请- >处理= SVC1_IDX_BUTTON_STATE_VAL;
申请- >长度= DEF_SVC1_BUTTON_STATE_CHAR_LEN;
申请- >价值[0]=数+ +;
ke_msg_send(要求的);
/ / Android代码
public void oncharacterchanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)
{
超级。onCharacteristicChanged(关贸总协定、特点);
byte[] messageBytes = characteristic.getValue();
日志。w(TAG, " oncharacterchanged: " + messageBytes.length);//显示当前的MTU(测试到240bytes)
}
问候,
Roie
设备:
嗨Roie DAHAN,
我假设内存溢出在DA14585侧。如果是,请指出代码在哪里卡住了?在platform_reset_func () ?
谢谢,PM_Dialog
嗨PM_Dialog,
是的,platform_reset_func与RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)一个经典的内存溢出
谢谢,
Roie
嗨Roie DAHAN,
Τhe platform_reset_func()由platform_reset()调用,它在ROM代码中实现。产生此断言的最可能的原因是内存不足,因为您分配的消息永远不会被使用。例如,如果您正在分配通知消息,并且您有一个小的连接间隔,那么消息将被堆起来直到连接事件到达,但是如果连接间隔较大,则在连接事件到达之前就会耗尽内存。您可以增加连接间隔。在您的应用程序中,在每个连接之后可能会出现某种内存泄漏堆积,因为错误代码是RESET_MEM_ALLOC_FAIL。为此,请检查是否有任何挂起消息,并确保您正在使用在处理消息时获得的消息,或者您正在分配应该释放它们的数据。例如,如果你取样ADC,你分配消息,以便在有一个连接时通过通知发送数据,设备最终将耗尽内存,如果设备耗尽内存,这将导致设备重置。此外,尝试通过在da1458x_config_advanced.h头文件中定义DB_HEAP_SZ来增加堆大小。
谢谢,PM_Dialog
你好,
谢谢你的解释,内存溢出显然是副作用的根本原因。
我的问题是:如何每20毫秒发送240字节的通知?
谢谢,
Roie
嗨PM_Dialog,
只是为了更多清晰的关于测试代码/设置:
1)。使用ble_app_all_in_one发现在SDK 6.0.10.511
2).编辑/更新user_custs1_def.h中的定义:#define DEF_SVC1_ADC_VAL_1_CHAR_LEN 120
3).编辑/更新user_app_adcval1_timer_cb_handler间隔为20ms
4).编译并运行
预期结果:
实际结果:
请建议每20毫秒向Android传输120字节数据的首选方式(最好是示例代码)
*请注意: 120byte每20ms = 48Kbps远低于1M限制
问候,
Roie
示例代码:
嗨Roie DAHAN,
我在SDK6.0.10的一个清晰的ble_app_all_in_one项目上工作,我使用了您所附的代码片段。然而,我无法复制你的问题。变量“count”每20毫秒发送一次思想通知。你能在一个干净的ble_app_all_in_one项目中进行测试吗?你还做了其他修改吗?
谢谢,PM_Dialog
嗨PM_Dialog,
要重现该问题,只需更改数据大小
来自:
:
#定义DEF_SVC1_ADC_VAL_1_CHAR_LEN 240
问候,
Roie
嗨Roie,
刚刚测试了240字节大小,但我仍然无法复制它。您使用的堆大小是多少?默认大小是2048字节。你能不能加一点?
谢谢,PM_Dialog
嗨PM_Dialog,
当使用#define DB_HEAP_SZ 2048时,溢出发生在~3,000 - 3,200个包之后
当使用#define DB_HEAP_SZ 2048*4时,溢出发生在~6,800 - 7,200个包之后
请注意Android Phone MTU为默认状态(即20)DB_HEAP_SZ 2048*4是稳定的没有溢出occered在~ 300000个数据包之后(我手动停止了它)
请问您是否在测试台上使用Android手机?
如果是,请分享使用的Android版本和示例测试代码。
*请注意:这里使用的设置是:三星A5, S9 Android版本8,两款手机都显示相同的行为
问候,
Roie
嗨Roie,
我想再问你一件事。您使用的是自定义移动应用程序吗?
谢谢,PM_Dialog
嗨PM_Dialog,
是的,我正在使用一个自定义的android应用程序。
同时也验证了一些来自Play Store的应用(如LightBlue等)。
有没有推荐的测试应用,可以分享的例子?
问候,
Roie
嗨PM_Dialog,
任何更新吗?
问候,
Roie
嗨Roie,
但我还是无法复制它。我正在努力,如果有任何更新,我会让你知道。我会试着复制它。
谢谢,PM_Dialog
嗨PM_Dialog,
请告诉我,如果有什么我可以发送给你,以确定根本原因(例如:注册转储,启用一些调试printf标志,等)。
Regartds,
Roie
嗨Roie,
您可以使用BLE嗅探工具来检查通过空气传输的数据包。
谢谢,PM_Dialog
嗨PM_Dialog,
我没有BLE嗅探器,请建议购买/安装什么工具
问候,
Roie
嗨Roie,
很抱歉耽搁了。我可能错过了你最后的评论。你解决这个问题了吗?如果您的问题与DA14585有关,如前所述,这是由于低效的堆大小造成的,那么您应该增加它。
谢谢,PM_Dialog