W801 蓝牙发送超过 12*244 个字节的数据后发送失败, 排除问题为内存池申请失败, 该如何释放?

发布于 2022-06-10 21: 25: 03

[问题]
使用的官方 SDK 的 tls_ble_server_demo_api_send_msg 函数, 去掉了限制只能发一次的部分. MTU 提升到 244 后, 本来打算发送 8192 字节数据, 分成了 34 个包, 发现始终只能发送 12 个包, 排查发现, 如下图所示, 在这个位置发送 12*244 字节数据后会出现内存池申请失败的问题. 原函数申请完后没有释放, 使用 os_memblock_put 将其释放后会出现发送一次之后整个系统死机. 请问该如何解决
q1. png

查看更多

关注者
0
被浏览
1. 5k
1 个回答
136****7598
136****7598 2022-06-12
这家伙很懒, 什么也没写!

方法 ble_gattc_indicate_custom 尾部 ble_gattc_process_status 释放了, 或者说是修改了状态
image. png

我曾经碰到过的是 wm_ble_uart_if. c 中 RING_BUFFER_SIZE 太小, 导致不能全部发送
image. png
wm_bt_util. c
image. png
你可以在wm_ble_server_api_demo. c中 ble_server_indication_sent_cb, 加上几句代码, 验证是否存在环形 buff 缓冲区小了的问题.
image. png

个人认为能解决办法有几个:
1, 适当增加环形 buffer 的长度 (最简单, 前提 ram 足够, 数据包长度足够单一, 固定)
2, 自己分包发送, 收到返回, 再发送下一包. (一问一答, 稳健, 但速度慢)
3, 实现 demo 的 event 并注册, 发送成功后, 写入下一包. (未验证)

看没人回复, 我提供下自己的思路, 希望对你有帮助

撰写答案

请登录后再发布答案, 点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览