CUSTS1\u VAL\u NTF\u REQ上的内存溢出

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
18个职位/0个新职位
最后一篇文章
罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
CUSTS1\u VAL\u NTF\u REQ上的内存溢出

嗨,对话小组,

如果DEF_SVC1_BUTTON_STATE_CHAR LEN大于24(字节),而发送间隔为每20ms(或更短),则DA14585芯片会导致内存溢出,

请告知如何正确发送240字节每20毫秒。

请参见示例代码:

//更新按钮特性
结构custs1\u val\u ntf\u ind\u req*req=KE\u MSG\u ALLOC\u DYN(custs1\u val\u ntf\u req,
prf\u get\u task\u from\u id(task\u id\u CUSTS1),
任务应用程序,
客户需求,
定义\u SVC1 \u按钮\u状态\u字符\u长度);

需求->conidx=应用环境->conidx;
请求->通知=真;
req->handle=SVC1\u IDX\u BUTTON\u STATE\u VAL;
请求->长度=DEF\u SVC1\u BUTTON\u STATE\u CHAR LEN;
请求->值[0]=count++;

发送消息(请求);

//Android代码
公共void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGatt特征)
{
超级特性改变(关贸总协定,特性);

byte[]messageBytes=characteristic.getValue();

Log.w(TAG,“onCharacteristicChanged:”+messageBytes.length)//packget显示当前MTU(测试高达240字节)
}

当做,

Roie公司

设备:
PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

我假设内存溢出在DA14585端。如果是的话,你能指出代码卡在哪里吗?在平台_reset _func()中?

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

是的,带有reset MEM ALLOC FAIL(0xf2f2f2)的platform\u reset func弹出一个基本内存溢出

谢谢,

Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

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

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
你好,

你好,

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

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

谢谢,

Roie公司

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

只是为了更多清楚的关于测试代码/设置:

1). 使用ble\u应用程序\u all\u in \u one在SDK 6.0.10.511中找到

2). 编辑/更新user_custs1_def.h中的define to:#define def_SVC1_ADC_VAL_1_CHAR LEN 120

3). 编辑/更新用户应用程序adcval1计时器cb处理器间隔为20ms

4). 编译和运行

预期结果:

  • 通知事件应该以120字节的数据每20毫秒到达Android

实际结果:

  • 通知事件每20毫秒到达一次Android,120字节的数据持续20-30秒,然后是平台重置功能(即内存溢出)

请告知每20毫秒向Android传输120字节数据的首选方式(首选示例代码)

*注意:每20ms 120字节=48Kbps远低于1M限制

当做,

Roie公司

示例代码:

//将user_custs1_def.h中的define更新为:#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_ind_req,DEF_SVC1_ADC_val_1_CHAR LEN);//要采样的ADC值静态uint16\u t sample\uuu attribute\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;样本=(样本<=0xffff)(样本+1):0;需求->conidx=应用环境->conidx;请求->通知=真;请求->句柄=SVC1\u IDX\u ADC\u VAL\u 1\u VAL;请求->长度=DEF_SVC1_ADC_VAL_1_CHAR_LEN;//memcpy(请求->值,&样本,定义\u SVC1 \u ADC \u VAL \u CHAR \u LEN);请求->值[0]=Count++;发送消息(请求);如果(ke_state_get(TASK_APP)==APP_CONNECTED){//再次设置它,直到在控制特性计时器中接收到停止命令_used=APP_easy_timer(2,user_APP_adcval1_timer_cb_handler);}}

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨Roie DAHAN,

嗨Roie DAHAN,

我在SDK6.0.10的一个项目中开发了一个清晰的ble应用程序all,并使用了您附带的代码片段。但是,我无法复制您的问题。变量“count”每20毫秒发送一次通知。你能在一个干净的ble应用程序中测试一个项目吗?你做过其他的修改吗?
谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

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

发件人:

#定义定义\u SVC1 \u ADC \u VAL \u CHAR \u LEN 120

收件人:

#定义定义\u SVC1 \u ADC \u VAL \u CHAR \u LEN 240

当做,

Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨,罗伊,

嗨,罗伊,

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

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

当使用#define DB#u HEAP_SZ 2048时,在~3000-3200个数据包之后溢出occer
使用#define DB_HEAP_SZ 2048*4时,在~6800-7200个数据包之后溢出occer

请注意,当Android手机MTU处于默认状态(即20)DB_HEAP_SZ 2048*4稳定没有溢出大约30万包后(我手动停止)

DA14585代码:user\u config.h.max\u mtu=247,Android代码集mtu:mbluetootgatt.requestMtu(247)//将Android App Mtu设置为247@Override public void onCharacteristicChanged(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic){super.onCharacteristicChanged(gatt,characteristic);byte[]messageBytes=characteristic.getValue();Log.w(标记“onCharacteristicChanged:”+messageBytes.length+“”+messageBytes[0]);}

请告知您是否在测试台上使用安卓手机?

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

*注意:此处使用的设置是:三星A5、S9 Android版本8,两款手机都显示相同的behivior

当做,
Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨,罗伊,

嗨,罗伊,

我想问你一个额外的问题。您正在使用自定义移动应用程序吗?

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

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

还通过Play Store的一些应用程序进行了验证(例如,LightBlue等)

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

当做,

Roie公司

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

有更新吗?

当做,

Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03

嗨,罗伊,

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

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

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

皇室,

Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨,罗伊,

嗨,罗伊,

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

谢谢,下午好

罗伊达汉
离线
最后一次见到:11个月2周前
已加入:2018-11-19 16:32
嗨,PM\U对话,

嗨,PM\U对话,

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

当做,

Roie公司

PM\U对话框
离线
最后一次见到:1周2天前
工作人员
已加入:2018-02-08 11:03
嗨,罗伊,

嗨,罗伊,

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

谢谢,下午好