CUSTS1_VAL_NTF_REQ上的内存溢出

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
18个职位/ 0个新职位
最后发表
Roie DAHAN
离线
最后看到:11个月40分钟前
加入: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);

申请- > conidx = app_env - > conidx;
申请- >通知= true;
申请- >处理= SVC1_IDX_BUTTON_STATE_VAL;
申请- >长度= DEF_SVC1_BUTTON_STATE_CHAR_LEN;
申请- >价值[0]=数+ +;

ke_msg_send(要求的);

/ / Android代码
gatt, gatt, gatt feature, gatt feature

超级。onCharacteristicChanged(关贸总协定、特点);

byte[] messageBytes = characteristic.getValue();

日志。w(TAG,“oncharacterchanged:”+ messageBytes.length);//显示当前MTU(测试到240字节)

问候,

Roie

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

嗨Roie DAHAN,

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

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

是的,用RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)弹出的platform_reset_func是典型的内存溢出

谢谢,

Roie

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

嗨Roie DAHAN,

Τhe platform_reset_func()由platform_reset()调用,这是在ROM代码中实现的。获得此断言的最可能原因是内存不足,因为您正在分配从未使用过的消息。例如,如果您正在分配通知消息,并且连接间隔较小,则消息会在连接事件到达之前堆积起来,但是如果连接间隔较大,则会在连接事件到达之前耗尽内存。您可以增加连接间隔。在您的应用程序中,可能在每次连接之后都会出现某种内存泄漏,因为错误代码是RESET_MEM_ALLOC_FAIL。为此,请检查是否有任何挂起的消息,并确保您正在使用消息处理时获得的消息,或者如果您正在分配数据,则应该释放这些消息。例如,如果你对ADC进行采样,并且你正在分配消息以便在有连接时通过通知发送数据,那么设备最终将耗尽内存,如果设备耗尽内存,这将导致设备重置。此外,尝试通过在da1458x_config_advanced.h头文件中定义DB_HEAP_SZ来增加堆大小。

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
你好,

你好,

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

我的问题是:如何每20ms发送240byte通知?

谢谢,

Roie

Roie DAHAN
离线
最后看到:11个月40分钟前
加入: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到:#define DEF_SVC1_ADC_VAL_1_CHAR_LEN 120

3)编辑/更新user_app_adcval1_timer_cb_handler的时间间隔为20ms

4).编译和运行

预期结果:

  • 通知事件应该到达Android每20ms 120Byte的数据

实际结果:

  • 通知事件每20ms到达Android, 120Byte的数据约20-30秒,然后是platform_reset_func(即内存溢出)

请告知每20ms传输120字节的数据到Android的首选方式是什么(最好是一个示例代码)

*请注意: 120byte每20ms = 48Kbps远低于1M的限制

问候,

Roie

示例代码:

//update define in user_custs1_def.h to: #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_1_CHAR_LEN);//采样ADC值的静态uint16_t采样__attribute__((section("retention_mem_area0"), zero_init));Sample = (Sample <= 0xffff) ?(sample + 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周前1天前
工作人员
加入: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

Roie DAHAN
离线
最后看到:11个月40分钟前
加入: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周前1天前
工作人员
加入:2018-02-08 11:03
嗨Roie,

嗨Roie,

刚刚测试了240字节大小,但我仍然无法复制它。您正在使用的堆大小是多少?默认大小为2048字节。你能增加一点吗?

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

当使用#define DB_HEAP_SZ 2048时,在3000 - 3200个数据包后发生溢出
当使用#define DB_HEAP_SZ 2048*4时,溢出发生在大约6800 - 7200个数据包之后

请注意Android Phone MTU为默认状态(即20)DB_HEAP_SZ 2048*4稳定没有溢出occered在~ 300000包之后(我手动停止了它)

DA14585 code: user_config.h .max_mtu = 247, Android code set mtu: mBluetoothGatt.requestMtu(247);//设置Android App Mtu为247onCharacteristicChanged(关贸总协定、特点);byte[] messageBytes = characteristic.getValue();日志。w(TAG, " oncharacterchanged: " + messageBytes。length + " " + messageBytes[0]);}

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

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

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

问候,
Roie

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

嗨Roie,

我想再问你一件事。你在使用自定义的移动应用程序吗?

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

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

也验证了从Play Store的少数应用程序(如,LightBlue等)。

任何推荐的测试应用程序,你可以分享的例子?

问候,

Roie

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

任何更新吗?

问候,

Roie

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

嗨Roie,

但我还是无法复制它。我正在努力,我会让你知道如果有任何更新。我会试着复制它。

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

请告知我是否有什么可以发给你以找出根本原因(例如:注册转储,启用一些调试printf标志,等等)。

Regartds,

Roie

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

嗨Roie,

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

谢谢,PM_Dialog

Roie DAHAN
离线
最后看到:11个月40分钟前
加入:2018-11-19 16:32
嗨PM_Dialog,

嗨PM_Dialog,

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

问候,

Roie

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

嗨Roie,

很抱歉耽搁了。我可能错过了你最后的评论。你解决这个问题了吗?如果你的问题与DA14585有关,如前所述,这是由于低效的堆大小,所以你应该增加它。

谢谢,PM_Dialog