首页
开源
资讯
活动
开源许可证
软件工程云服务
软件代码质量检测云服务
持续集成与部署云服务
社区个性化内容推荐服务
贡献审阅人推荐服务
群体化学习服务
重睛鸟代码扫描工具
登录
注册
代码拉取完成,页面将自动刷新
Watch
5
Star
7
Fork
2
珠海杰理科技
/
AW30N
Fork 仓库
加载中
取消
确认
代码
Issues
41
Pull Requests
0
Wiki
0
统计
更新失败,请稍后重试!
Issues
/
详情
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
FAQ:广播对讲机信号不佳时复位&死机的修复办法?unpacket问题修复 & 状态机回滚。
待办的
#IATGU1
jl-wancheng
创建于
2024-09-25 10:31
### 适用范围 广播式传输,主要应用为广播式对讲机。 aw30n-release_V1.3.0 aw30n-release_V1.3.1 ### 一、简介 解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。 - **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态; - **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。 以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。 ### 二、异常一的解决方法: 状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。 解决方法: 在又收到了0x55的数据时,如下图,将stream_index累加上去就可以了。 ![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图") ### 三、异常二的解决方法 如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为 if(ops->length > DATA_CACHE_BUF_SIZE) 如图: ![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图") ### 四、上一步异常二的解决方法的不足 在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。 为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** ! ### 五、回滚机制的实现 1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节 此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出: need_offset = ops->got_length + (ops->status - 2); new_offset = strm_offset > need_offset ? need_offset : strm_offset; strm_offset -= new_offset; 2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。 如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始: u32 stream_index = 0; -> u32 stream_index = *pcnt; 如下图,测试错误数据时回滚机制的运行情况 ![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图") ### 六、回滚机制的代码添加修改说明 因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。 (1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机: ![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图") (2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。 ![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图") ### 七、补丁链接 [AW30N广播式对讲机信号不佳时死机修复补丁20240925](http://gitee.com/Jieli-Tech/AW30N/tree/main/%E8%A1%A5%E4%B8%81%E5%8C%85/AW30N%E5%B9%BF%E6%92%AD%E5%BC%8F%E5%AF%B9%E8%AE%B2%E6%9C%BA%E4%BF%A1%E5%8F%B7%E4%B8%8D%E4%BD%B3%E6%97%B6%E6%AD%BB%E6%9C%BA%E4%BF%AE%E5%A4%8D%E8%A1%A5%E4%B8%8120240925)
### 适用范围 广播式传输,主要应用为广播式对讲机。 aw30n-release_V1.3.0 aw30n-release_V1.3.1 ### 一、简介 解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。 - **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态; - **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。 以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。 ### 二、异常一的解决方法: 状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。 解决方法: 在又收到了0x55的数据时,如下图,将stream_index累加上去就可以了。 ![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图") ### 三、异常二的解决方法 如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为 if(ops->length > DATA_CACHE_BUF_SIZE) 如图: ![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图") ### 四、上一步异常二的解决方法的不足 在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。 为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** ! ### 五、回滚机制的实现 1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节 此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出: need_offset = ops->got_length + (ops->status - 2); new_offset = strm_offset > need_offset ? need_offset : strm_offset; strm_offset -= new_offset; 2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。 如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始: u32 stream_index = 0; -> u32 stream_index = *pcnt; 如下图,测试错误数据时回滚机制的运行情况 ![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图") ### 六、回滚机制的代码添加修改说明 因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。 (1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机: ![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图") (2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。 ![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图") ### 七、补丁链接 [AW30N广播式对讲机信号不佳时死机修复补丁20240925](http://gitee.com/Jieli-Tech/AW30N/tree/main/%E8%A1%A5%E4%B8%81%E5%8C%85/AW30N%E5%B9%BF%E6%92%AD%E5%BC%8F%E5%AF%B9%E8%AE%B2%E6%9C%BA%E4%BF%A1%E5%8F%B7%E4%B8%8D%E4%BD%B3%E6%97%B6%E6%AD%BB%E6%9C%BA%E4%BF%AE%E5%A4%8D%E8%A1%A5%E4%B8%8120240925)
评论 (
0
)
jl-wancheng
创建了
任务
jl-wancheng
修改了
描述
原值
### 一、简介
最近收到反馈unpacket出现看门狗异常和写内存异常问题。本文给出死机问题的修复方法和相关说明,并且提供新的回滚校验机制添加说明。本文在最后会添加相关的补丁链接。
### 二、问题出现原因以及修复方法说明
**问题出现原因:**
发送端发送碎帧时,如果蓝牙信号不佳可能会导致接收端收到的数据不完整,因而导致接收端unpacket状态机与当前正在校验的字节不对应,这种情况下如果对数据处理流程不够严谨,可能会出现异常问题。
**修复方法说明**
(1)看门狗死机问题修复
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
(2)写内存异常问题修复
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 三、回滚机制添加
**机制添加原因**
上述的写内存异常问题修复方式在接收的状态长度值比较大时,会抛弃较多的数据,对音频传输效果不好。因此需要**在上述修复基础上添加回滚校验机制** 。
**机制说明**
1、以往的unpackt流程,ar_trans_unpack函数的strm_offset默认从0开始,即每次拆包都从0偏移开始。
2、添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节,此时strm_offset就需要记录上一次的偏移位置,用来给计算回滚偏移。
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
**机制代码添加修改说明**
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改
(1)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727227415980958378/2b651993_11366138.png "屏幕截图")
(2)添加ops->length大于缓存时,处理回滚偏移的流程
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
### 一、简介
最近收到反馈unpacket出现看门狗异常和写内存异常问题。本文给出死机问题的修复方法和相关说明,并且提供新的回滚校验机制添加说明。本文在最后会添加相关的补丁链接。
### 二、问题出现原因以及修复方法说明
**问题出现原因:**
发送端发送碎帧时,如果蓝牙信号不佳可能会导致接收端收到的数据不完整,因而导致接收端unpacket状态机与当前正在校验的字节不对应,这种情况下如果对数据处理流程不够严谨,可能会出现异常问题。
**修复方法说明**
(1)看门狗死机问题修复
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
(2)写内存异常问题修复
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 三、回滚机制添加
**机制添加原因**
上述的写内存异常问题修复方式在接收的状态长度值比较大时,会抛弃较多的数据,对音频传输效果不好。因此需要**在上述修复基础上添加回滚校验机制** 。
**机制说明**
1、以往的unpackt流程,ar_trans_unpack函数的strm_offset默认从0开始,即每次拆包都从0偏移开始。
2、添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节,此时strm_offset就需要记录上一次的偏移位置,用来给计算回滚偏移。
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
**机制代码添加修改说明**
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改
(1)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727227415980958378/2b651993_11366138.png "屏幕截图")
(2)添加ops->length大于缓存时,处理回滚偏移的流程
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
Lj-job
修改了
标题
原值
FAQ:
unpacket问题修复以及回滚机制添加说明
新值
FAQ:
广播对讲机信号不佳时复位&死机的修复办法?unpacket问题修复 & 状态机回滚。
Lj-job
修改了
描述
原值
###
一、简介
最近收到反馈unpacket出现看门狗异常和写内存异常问题。本文给出死机问题的修复方法和相关说明,并且提供新的回滚校验机制添加说明。本文在最后会添加相关的补丁链接。
### 二、问题出现原因以及修复方法说明
**问题出现原因:**
发送端发送碎帧时,如果蓝牙信号不佳可能会导致接收端收到的数据不完整,因而导致接收端unpacket状态机与当前正在校验的字节不对应,这种情况下如果对数据处理流程不够严谨,可能会出现异常问题。
**修复方法说明**
(1)看门狗死机问题修复
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
(2)写内存异常问题修复
![输入图片说明](https://fo
r
uda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 三、回滚机制添加
**机制添加原因
*
*
上述的写内存异常问题修复方式在接收的状态长度值比较大时,会抛弃较多的数据,对音频传输效果不好。因此需要**在上述修复基础上添加回滚校验机制** 。
**机制说明**
1、以往的unpackt流程,ar_trans_unpack函数的strm_offset默认从0开始,即每次拆包都从0偏移开始。
2、添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节,此时strm_offset就需要记录上一次的偏移位置,用来给计算回滚偏移。
![输入图片说明](ht
t
ps:/
/
foruda.gite
e
.com/images/1727231384017939645/be6833d1_1
1
36
6
138.png "屏幕截图")
**机制代码添加修改说明**
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改
(1)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727227415980958378/2b651993_11366138.png "屏幕截图")
(2)添加ops->length大于缓存时,处理回滚偏移的流程
![输入图片说明](https://foruda.gitee.com/images/172722
6908836819909
/
140c4857
_11366138.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
###
适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
-
**异常二** 、收到的数据头长度过长,a
r
_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 *
*
在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](h
t
tps:
/
/foruda.git
e
e.com/images/1727225388793459396/1e706a69_
1
13
6
6138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/172722
5720478720531
/
dca80771
_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
Lj-job
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二** 、收到的数据头
长度过长,ar_trans_u
n
pack中的缓存cache分多次取数时,cache访问溢出的
问
题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二** 、收到的数据头
中的长度信息过大,ar_tra
n
s_unpack中的缓存cache分多次取数时,cache访
问
溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
Lj-job
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一
** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一
致
卡在REV_HEADER_0xaa状态;
- **异常二
** 、收到的数据头中的长度信息过大,ar_trans_unp
a
ck中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一
看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导
致
状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二
内存方位溢出** 、收到的数据头中的长度信息过大,ar_tr
a
ns_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
jl-wancheng
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存
方位
溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存
访问
溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
jl-wancheng
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 四、补丁链接
链接: https://pan.baidu.com/s/1H3KHhM1YIiUyujfkCCeBcw?pwd=e2ek
提取码: e2ek
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
jl-wancheng
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一
致
卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一
直
卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下如,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
jl-wancheng
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下
如
,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下
图
,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
jl-wancheng
修改了
描述
原值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下图,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
新值
### 适用范围
广播式传输,主要应用为广播式对讲机。
aw30n-release_V1.3.0
aw30n-release_V1.3.1
### 一、简介
解决状态机ar_trans_unpack_fsm收到部分非法数据导致的两种运行异常情况。
- **异常一 看门狗复位** 、收到数据头0x55后,又收到了0x55的数据,导致状态机会一致卡在REV_HEADER_0xaa状态;
- **异常二 内存访问溢出** 、收到的数据头中的长度信息过大,ar_trans_unpack中的缓存cache分多次取数时,cache访问溢出的问题。
以上问题主要 **在蓝牙信号不佳导致的传输数据出错的情况** 下发生,也就是状态机对不可靠传输支持不足。
### 二、异常一的解决方法:
状态机ar_trans_unpack_fsm收到首数据头0x55后,又收到了0x55的数据,导致状态机会一直卡在REV_HEADER_0xaa状态,会导致看门狗复位。
解决方法:
在又收到了0x55的数据时,如下图,将stream_index累加上去就可以了。
![输入图片说明](https://foruda.gitee.com/images/1727225388793459396/1e706a69_11366138.png "屏幕截图")
### 三、异常二的解决方法
如下图所示解决方法,在函数ar_trans_unpack中将数据长度的判断修改为
if(ops->length > DATA_CACHE_BUF_SIZE)
如图:
![输入图片说明](https://foruda.gitee.com/images/1727225720478720531/dca80771_11366138.png "屏幕截图")
### 四、上一步异常二的解决方法的不足
在上一步的解决方法中虽然解决了cache内存溢出的问题,但是也会在length出错过大时,导致抛弃过多的的数据,这对音频传输效果非常不友好。
为了减少抛弃过多的数据,进一步的优化,状态机添加了数据的 **回滚机制** !
### 五、回滚机制的实现
1、在unpackt流程中,添加回滚机制后,发现长度大于缓存时,回滚到上次校验的0x55AA的下一个字节
此时ar_trans_unpack中的偏移量strm_offset可以根据包格式头和got_length综合算出:
need_offset = ops->got_length + (ops->status - 2);
new_offset = strm_offset > need_offset ? need_offset : strm_offset;
strm_offset -= new_offset;
2、ar_trans_unpack_fsm函数的stream_index不能再是默认从0开始,需要使用上一步运算出的strm_offset。
如果需要回滚,需要算出stream_index在回滚时的偏移量,的stream_index将不在是0开始:
u32 stream_index = 0; -> u32 stream_index = *pcnt;
如下图,测试错误数据时回滚机制的运行情况
![输入图片说明](https://foruda.gitee.com/images/1727231384017939645/be6833d1_11366138.png "屏幕截图")
### 六、回滚机制的代码添加修改说明
因为上述strm_offset需要回滚到上次校验的0x55AA的下一个字节重新校验所以需要有下面两处修改。
(1)修改ops->length判断,在ops->length大于缓存时,运算出回滚偏移量,并再次运行状态机:
![输入图片说明](https://foruda.gitee.com/images/1727226908836819909/140c4857_11366138.png "屏幕截图")
(2)ar_trans_unpack_fsm函数的pcnt需要传参使用,并且状态机在0x55状态初始化相关变量。
![输入图片说明](https://foruda.gitee.com/images/1727234770269835925/11d7b761_9185836.png "屏幕截图")
### 七、补丁链接
[AW30N广播式对讲机信号不佳时死机修复补丁20240925](http://gitee.com/Jieli-Tech/AW30N/tree/main/%E8%A1%A5%E4%B8%81%E5%8C%85/AW30N%E5%B9%BF%E6%92%AD%E5%BC%8F%E5%AF%B9%E8%AE%B2%E6%9C%BA%E4%BF%A1%E5%8F%B7%E4%B8%8D%E4%BD%B3%E6%97%B6%E6%AD%BB%E6%9C%BA%E4%BF%AE%E5%A4%8D%E8%A1%A5%E4%B8%8120240925)
展开全部操作日志
折叠全部操作日志
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (1)
标签 (8)
main
aw30n-release_V1.3.3
aw30n-release_V1.3.2
aw30n-release_V1.3.1
aw30n-release_V1.3.0
aw30n-release_V1.2.0
aw30n-release_V1.1.1
aw30n-release_V1.1.0
aw30n-release_V1.0.0
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)