在CUSTS1_VAL_NTF_REQ上内存溢出

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
18个员额/ 0个新员额
最后发表
罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
在CUSTS1_VAL_NTF_REQ上内存溢出

嗨,对话框的团队,

如果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);

req-> conidx = app_env-> conidx;
req-> notification = true;
req-> handle = svc1_idx_button_state_val;
req-> length = def_svc1_button_state_char_len;
req->值[0] = count ++;

KE_MSG_SEND(REQ);

// Android Code.
public void oncharacterchanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)

Super.OnonCrondChanged(GATT,特征);

byte[] messageBytes = characteristic.getValue();

log.w(标记,“on特征突出:”+ messagebytes.length);//软件包显示Curent MTU(最多可测试240bytes)

问候,

Roie

设备:
PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

我假设内存溢出在DA14585侧。如果是,请指出代码在哪里卡住了?在platform_reset_func () ?

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

是的,platform_reset_func与RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)一个经典的内存溢出

谢谢,

Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

perform_reset()调用τheplatform_reset_func(),该平台()在ROM代码中实现。为什么您获得此断言的最可能原因是由于内存不足,因为您正在分配从未消耗的消息。例如,如果要分配通知消息,并且您有一个小的连接间隔,则邮件堆叠堆积,直到连接事件到达,但在连接事件到达之前,使用大的连接间隔耗尽内存。您可以增加连接间隔。可能,在您的应用程序中,每次连接后可能会有某种内存泄漏,因为错误代码是reset_mem_alloc_fail。为此,请检查是否有任何挂起的消息,并确保在处理消息时会消耗您获得的消息,或者如果您正在分配它们应该释放的数据。例如,如果您正在分配消息,则在分配消息,以便在有一个连接的情况下将数据发送到通知后,设备最终会用完内存,并且如果设备运行内存,则会导致设备重置。此外,尝试通过在DA1458x_config_Advanced.h标题文件中定义DB_HEAP_SZ来提高堆大小。

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
你好,

你好,

谢谢你的解释,内存溢出显然是副作用的根本原因。

我的问题是:如何每20毫秒发送240字节的通知?

谢谢,

Roie

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨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和120Byte的数据

实际结果:

  • 通知事件每20ms到达Android,120毫秒〜20-30秒后跟Platform_reset_func(即,内存超过流量)

请建议每20毫秒向Android传输120字节数据的首选方式(最好是示例代码)

*请注意:120byte每20ms = 48kbps远低于1米极限

问候,

Roie

示例代码:

//将user_custs1_def.h中的定义更新为:#define DEF_SVC1_ADC_VAL_1_CHAR_LEN 120 void user_app_adcval1_timer_cb_handler() {static int Count = 0;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_adc_val_char_len);//要采样的ADC值static uint16_t采样__attribute__((section("retention_mem_area0"), zero_init));Sample = (Sample <= 0xffff) ?(样本+ 1):0;申请- > conidx = app_env - > conidx;申请- >通知= true;申请- >处理= SVC1_IDX_ADC_VAL_1_VAL;申请- >长度= DEF_SVC1_ADC_VAL_1_CHAR_LEN;// memcpy(req->value, &sample, DEF_SVC1_ADC_VAL_1_CHAR_LEN); req->value[0] = Count++; ke_msg_send(req); if (ke_state_get(TASK_APP) == APP_CONNECTED) { // Set it once again until Stop command is received in Control Characteristic timer_used = app_easy_timer(2, user_app_adcval1_timer_cb_handler); } }

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

我在SDK6.0.10的一个清晰的ble_app_all_in_one项目上工作,我使用了您所附的代码片段。然而,我无法复制你的问题。变量“count”每20毫秒发送一次思想通知。你能在一个干净的ble_app_all_in_one项目中进行测试吗?你还做了其他修改吗?
谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

要重现该问题,只需更改数据大小

来自:

#定义DEF_SVC1_ADC_VAL_1_CHAR_LEN 120

:

#定义DEF_SVC1_ADC_VAL_1_CHAR_LEN 240

问候,

Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie,

嗨Roie,

刚刚用240字节的大小测试,但我仍然无法复制它。您使用的堆大小?默认大小为2048字节。你能提升吗?

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

当使用#define DB_HEAP_SZ 2048时,溢出发生在~3,000 - 3,200个包之后
当使用#define DB_HEAP_SZ 2048*4时,溢出发生在~6,800 - 7,200个包之后

请注意,何时Android手机MTU处于默认状态(即20)DB_HEAP_SZ 2048*4是稳定的没有溢出occered〜300,000包(我手动停止它)

da14585代码:user_config.h .max_mtu = 247,Android代码集mtu:mbluetoothgatt.requestmtu(247);//将Android应用程序MTU设置为247 @Override公共空白on CharacterisigChanged(Bluetoothgatt Gatt,BluetoothGatt Characteristic特性){Super.onCrontIsticChanged(GATT,特征);byte[] messageBytes = characteristic.getValue();log.w(标记,“on特征频播:”+ memageBytes.Length +“”+ MemagyBytes [0]);}

请问您是否在测试台上使用Android手机?

如果是,请共享Android版本和使用示例测试代码。

*请注意:这里使用的设置是:三星A5,S9 Android版本8,两部手机都显示出同样的eApvior

问候,
Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie,

嗨Roie,

让我问你一些额外的澄清。您使用的是自定义移动应用程序吗?

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

是的,我正在使用一个自定义的android应用程序。

同时也验证了一些来自Play Store的应用(如LightBlue等)。

有没有推荐的测试应用,可以分享的例子?

问候,

Roie

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

任何更新?

问候,

Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03

嗨Roie,

我仍然无法复制它。正在努力,如果有任何更新,我会通知您。我会尝试复制它。

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

请告诉我,如果有什么我可以发送给你,以确定根本原因(例如:注册转储,启用一些调试printf标志,等)。

regartds,

Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie,

嗨Roie,

您可以使用BLE嗅探工具来检查通过空气传输的数据包。

谢谢,PM_Dialog

罗伊哈
离线
最后看到:1年3天前
加入:2018-11-19 16:32
嗨pm_dialog,

嗨pm_dialog,

我没有BLE嗅探器,请建议购买/安装什么工具

问候,

Roie

PM_Dialog
离线
最后看到:1天8分钟前
工作人员
加入:2018-02-08 11:03
嗨Roie,

嗨Roie,

为延迟道歉。我可以错过你的最后一次评论。你有没有解决这个问题?如果您的问题与DA14585相关,如上所述,这是由于效率低下尺寸,所以您应该增加它。

谢谢,PM_Dialog