code - darkking1112/styleguide GitHub Wiki
在github中CICD
name: Build fenti
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: # 手动触发
jobs:
build:
runs-on: ubuntu-20.04 # 最新的ubuntu不支持python2,所以使用20.04
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up environment
run: sudo apt-get update && sudo apt-get install -y build-essential python2
- name: Cache toolchain
uses: actions/cache@v3
with:
path: /opt/toolchain
key: ${{ runner.os }}-toolchain-${{ hashFiles('**/toolchain_version.txt') }}
restore-keys: |
${{ runner.os }}-toolchain-
- name: Download and extract toolchain V2.2.5
if: steps.cache.outputs.cache-hit != 'true'
run: |
wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1695022610810/Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5-20220323.tar.gz -O /tmp/toolchain2.2.5.tar.gz
sudo mkdir -p /opt/toolchain
sudo tar -xzf /tmp/toolchain2.2.5.tar.gz -C /opt/toolchain
- name: Download and extract toolchain V2.6.1
if: steps.cache.outputs.cache-hit != 'true'
run: |
wget https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1695015854856/Xuantie-900-gcc-elf-newlib-x86_64-V2.6.1-20220906.tar.gz -O /tmp/toolchain2.6.1.tar.gz
sudo mkdir -p /opt/toolchain
sudo tar -xzf /tmp/toolchain2.6.1.tar.gz -C /opt/toolchain
- name: Run make_fenti.sh
run: |
chmod +x ./arprj/make_fenti.sh
cd arprj
./make_fenti.sh
- name: Upload build results
uses: actions/upload-artifact@v4
with:
name: build-fenti-results
path: |
${{github.workspace}}/arprj/artosyn-upgrade-ar8030.img
目录结构分析 (arsdk)
- arsdk/middlewares/ - 中间件层
负责提供系统级服务和通用功能模块:
-
common/ - 通用组件库
- cjson/ - JSON 解析库
- crc/ - CRC 校验算法
- libc/ - C 标准库实现
- mm/ - 内存管理模块
- ringbuffer/ - 环形缓冲区
- syslog/ - 系统日志
-
hal/ - 硬件抽象层
- inc/ - HAL 头文件(包含所有外设的抽象接口)
- module/ - HAL 模块实现
- arsdk/platforms/ - 平台层
核心的硬件平台相关代码:
-
driver/ - 硬件驱动层
- 包含所有外设驱动:gpio/, i2c/, spi/, uart/, eth/, usb/, sdio/, dma/ 等
- smartl_rv32/ - RISC-V 32位核心系统代码
- include/ - 驱动头文件和 SoC 定义
-
kernel/ - 操作系统内核
- freertosv10.3.1/ - FreeRTOS 实时操作系统
-
baseband/ - 基带处理模块
- bb_core/ - 基带核心功能
- bb_cfg/ - 基带配置
- bb_rpc/ - 基带 RPC 通信
-
lib/ - 第三方库
-
rom_code_8030/ - ROM 引导代码
-
rtc_firmware/ - RTC 固件
核心特性分析:
-
处理器架构 基于 RISC-V 32位架构(smartl_rv32) 支持 Xuantie-900 工具链 使用 FreeRTOS 实时操作系统
-
基带通信系统
- 专门的基带处理模块(bb_core)
- 支持多种通信协议和数据传输
- RPC(远程过程调用)机制用于设备间通信
- 支持 USB、SDIO、UART 等多种连接方式
- 外设支持 丰富的外设驱动支持:
- 网络:以太网(GMAC)、USB、SDIO
- 通信:UART、I2C、SPI、I2S
- 存储:Flash、PSRAM、QSPI
- 安全:PKA(公钥加密)、SPACC、TRNG(真随机数生成器)
- 其他:GPIO、Timer、WDT、ADC、DMA 等
- 构建系统
- 基于 Makefile 的构建系统
- 模块化编译,每个组件独立构建为静态库
- 支持多种配置和产品变体
- 内存管理
- 自定义内存管理器(mm 模块)
- 支持 SRAM、PSRAM 等多种内存类型,针对嵌入式系统优化的内存分配策略。
基带目录结构分析 (arsdk/platforms/baseband)
baseband目录是AR8030芯片基带处理的核心模块,主要负责无线通信协议栈的实现和硬件抽象。
1. 整体架构概述
baseband目录采用分层模块化设计,包含三个主要子目录:
baseband/
├── bb_cfg/ # 配置管理模块
├── bb_core/ # 核心功能模块
└── bb_rpc/ # 远程过程调用模块
2. 各子目录详细功能分析
2.1 bb_cfg - 配置管理模块
主要功能:
- 系统配置参数管理
- 硬件配置初始化
- 运行时配置更新
关键文件作用:
- bb_cfg.c: 核心配置管理API
bb_cfg_common.h: 通用配置定义bb_cfg_freqlist.h/bb_cfg_freqlist.c: 频率列表配置bb_cfg_internal.h: 内部配置接口- Makefile: 编译配置
2.2 bb_core - 核心功能模块
主要功能:
- 基带处理核心逻辑
- 硬件驱动抽象
- 通信协议实现
子模块结构:
-
api子目录 - 应用程序接口层
bb_api.h/bb_api.c: 主要API接口bb_api_internal.h: 内部API定义bb_api_6200.h: 6200芯片专用API
-
driver子目录 - 硬件驱动层
- bb_driver: 基带驱动核心
- bb_link: 链路层驱动
- bb_mac: MAC层驱动
- bb_phy: 物理层驱动
- bb_rf: 射频驱动
核心驱动模块详解:
-
bb_driver: 基带硬件抽象层
bb_gps.c: GPS功能支持bb_ctrl.c: 控制接口bb_sniffer.c: 数据包监听bb_tx_ctrl.c: 发送控制
-
bb_link: 数据链路层
bb_data_session.c: 数据会话管理bb_link_init.c: 链路初始化bb_link_misc.c: 链路杂项功能
-
bb_mac: 媒体访问控制层
bb_mac_common.c: MAC通用功能bb_mac_init.c: MAC初始化- 处理媒体访问控制逻辑
-
bb_phy: 物理层驱动
bb_phy_common.c: PHY通用功能bb_phy_init.c: PHY初始化- 处理物理层信号处理
-
bb_rf: 射频驱动
bb_rf_common.c: RF通用功能bb_rf_init.c: RF初始化- 控制射频前端
2.3 bb_rpc - 远程过程调用模块
主要功能:
- 进程间通信
- 远程函数调用
- 消息传递机制
关键文件:
bb_rpc_init.h/bb_rpc_init.c: RPC初始化- rpc.md: RPC模块说明文档
- Makefile: 编译配置
3. 模块间协作关系
应用层
↓
bb_api (API接口层)
↓
bb_cfg (配置管理) ←→ bb_core (核心处理) ←→ bb_rpc (进程通信)
↓
硬件驱动层 (driver子目录)
↓
硬件层 (PHY/RF/MAC)
4. 应用
该baseband模块主要应用于:
- 无线视频传输系统
- 数据链路通信
- 射频信号处理
- GPS定位功能
- 网络数据包处理
通过cfg文件分析
AR8030 OFDM配置参数与一些常见通信技术对比分析
1、AR8030 OFDM系统核心参数
1.1. FFT大小与子载波配置
- FFT大小: 2048点FFT
- 符号持续时间计算:
- 40MHz带宽:
frame_time = frame_ofdm_num * 2048 / 44.8 - 其他带宽:
frame_time = frame_ofdm_num * 2048 / 22.4
- 40MHz带宽:
- 采样频率: 44.8MHz (40MHz带宽) / 22.4MHz (其他带宽)
1.2. 带宽配置
支持6种带宽配置:
- 1.25MHz、2.5MHz、5MHz、10MHz、20MHz、40MHz
1.3. MCS (调制编码方案)
支持25种MCS等级 (-2 到 22):
- 调制方式: BPSK、QPSK、16QAM、64QAM、256QAM
- 编码率: 1/2、2/3、3/4
- 重复策略: 无重复、2倍重复、4倍重复
- MIMO支持: 单流和双流
1.4. 时域交织 (Time Interleaving)
- 交织长度: 3、6、12、24、48个OFDM符号
- 交织块数: 1或2块
- 编码长度: 576、1152、2304比特
1.5. 循环前缀 (CP)
- CP长度: 1/16、1/8、1/4
2、与4G 5G LTE技术对比
| 参数 | AR8030 | 4G LTE | 5G NR | WiFi 6 (802.11ax) |
|---|---|---|---|---|
| FFT大小 | 2048 | 128/256/512/1024/2048 | 128/256/512/1024/2048/4096 | 256/512/1024/2048 |
| 子载波间隔 | 1.25MHz | 15 kHz | 15/30/60/120/240 kHz | 312.5 kHz / 78.125 kHz |
| 带宽 | 1.25/2.5/5/10/20/40 MHz | 1.4/3/5/10/15/20 MHz | 5-400 MHz | 20/40/80/160 MHz |
| 调制方式 | BPSK/QPSK/16QAM/64QAM/256QAM | QPSK/16QAM/64QAM | QPSK/16QAM/64QAM/256QAM | BPSK-1024QAM |
| 编码率 | 1/2, 2/3, 3/4 | 1/3到5/6 (Turbo码) | ||
| 编码 | LDPC | LDPC + Polar | LDPC + Polar | LDPC |
| MIMO | 1x1, 2x2 | 最大8x8 | 最大32x32 | 最大8x8 |
| CP类型 | 固定比例 (1/16, 1/8, 1/4) | Normal CP (4.7μs), Extended CP (16.7μs) |
3、技术分析
针对特定的场景进行了优化
- 宽范围带宽支持: 从1.25MHz到40MHz,适应不同应用场景
- 灵活的时域交织: 支持多种交织长度,提高抗突发错误能力
- 自适应MCS: 25级精细调节,优化频谱效率
- 专用MIMO设计: STBC和空间复用并存,MIMO天线数较少
- 子载波间隔: 不如5G NR灵活
- 最高调制阶数: 不支持的1024QAM水平
时延分析
在正交频分复用(OFDM)系统中,字节数由子载波数、调制方式和编码率决定,公式为:
$$ \text{字节数} = \frac{\text{子载波数} \times \text{每子载波比特数} \times \text{编码率}}{8} $$
并且数据速率计算为:
$$ \text{数据速率} = \text{每符号字节数} \times \text{符号发送频率} $$
一、数据速率与子载波带宽的关系
1. 子载波带宽的定义
- 子载波带宽:在OFDM系统中,子载波带宽通常指子载波间隔(Δf),即相邻子载波的频率间隔(如5G NR中的15kHz、30kHz等)。然而,更广义的“子载波带宽”可能指系统分配给某个用户的总带宽(子载波数 × 子载波间隔)。
- 系统总带宽:
$$ \text{总带宽} \approx \text{子载波数} \times \Delta f $$
(实际带宽略小,因有保护带。)
2. 数据速率与子载波带宽的关系
数据速率与子载波带宽直接相关,主要体现在以下两个方面:
(1)子载波数量(影响总带宽)
- 数据速率公式:
$$ \text{数据速率 (字节/s)} = \left( \frac{\text{子载波数} \times \text{每子载波比特数} \times \text{编码率}}{8} \right) \times \text{符号发送频率} $$
-
子载波数:更多子载波意味着更大带宽(如20MHz带宽约1200个子载波,15kHz间隔),每个符号传输更多比特,从而提高数据速率。
-
例:假设QPSK(2比特/子载波),编码率1,符号发送频率为 $1/T_{\text{total}} )(总符号时长 ( T_{\text{total}} = 1/\Delta f + T_{CP}$ )。
- 100子载波:100 × 2 ÷ 8 = 25字节/符号。
- 1000子载波:1000 × 2 ÷ 8 = 250字节/符号。
- 若 $\Delta f = 15kHz ),( T_{\text{total}} \approx 71.37\mu s$,符号频率 ≈ 14000符号/s,则:
- 100子载波:25 × 14000 ≈ 0.35 MB/s。
- 1000子载波:250 × 14000 ≈ 3.5 MB/s。
-
结论:子载波数增加(即总带宽增加)直接提高数据速率。
(2)子载波间隔(Δf)
- 符号发送频率:
$$ \text{符号发送频率} = \frac{1}{T_s + T_{CP}} \approx \frac{1}{1/\Delta f + T_{CP}} $$
子载波间隔( $\Delta f$ )越大,符号时长( $T_s = 1/\Delta f$ )越短,符号发送频率越高,数据速率增加。
-
例:假设1000子载波,QPSK,编码率1,比较不同子载波间隔:
- $\Delta f = 15kHz$ , $T_s \approx 66.67\mu s $,CP ≈ 4.7μs,符号频率 ≈ 14000符号/s,数据速率 ≈ 3.5 MB/s。
- $\Delta f = 30kHz$, $T_s \approx 33.33\mu s $,CP ≈ 2.35μs,符号频率 ≈ 27778符号/s,数据速率 ≈ 6.94 MB/s。
-
结论:更大的子载波间隔(更高子载波带宽)缩短符号时长,提高符号发送频率,从而提升数据速率。
(3)多用户场景
- 在OFDMA中,用户分配部分子载波(资源块,RB)。每个用户的数据速率取决于分配的子载波数(带宽)和调制方式。
- 例:总带宽20MHz(1200子载波),用户A分配600子载波,用户B分配400子载波,数据速率按比例分配:
- 用户A:600 × 2 ÷ 8 × 14000 ≈ 1.75 MB/s(QPSK)。
- 用户B:400 × 2 ÷ 8 × 14000 ≈ 1.17 MB/s。
二、数据速率与时延的关系
1. 时延的定义
- 时延:指数据从发送到接收的延迟,包括传输时延、处理时延、排队时延等。在OFDM中,关键时延包括:
- 传输时延:数据通过物理信道传输所需时间,与符号时长和帧结构相关。
- 调度时延:多用户场景下,调度器分配资源可能引入额外等待时间。
- 处理时延:发送端和接收端的信号处理(如IFFT/FFT、编码/解码)时间。
2. 数据速率对时延的影响
-
高数据速率降低传输时延:
- 数据速率高意味着单位时间内传输更多字节,传输相同数据量所需时间(传输时延)更短。
- 例:传输1000字节数据:
- 数据速率3.5 MB/s(1000子载波,QPSK,15kHz):1000 ÷ 3.5 × 10^6 ≈ 286μs(约4个符号,71.37μs/符号)。
- 数据速率6.94 MB/s(1000子载波,QPSK,30kHz):1000 ÷ 6.94 × 10^6 ≈ 144μs(约4个符号,35.68μs)。
-
子载波间隔对时延的影响:
- 更大的子载波间隔(( \Delta f ))缩短符号时长(( T_s = 1/\Delta f )),从而减少每个符号的传输时延。
- 例:5G NR中,URLLC(超低时延高可靠通信)使用60kHz或120kHz间隔,符号时长分别为16.67μs或8.33μs,显著降低传输时延,适合低时延场景。
-
多用户场景:
- 用户分配的子载波数(带宽)影响其数据速率,进而影响传输时延。更多子载波(更高速率)缩短传输时延。
- 调度时延:OFDMA中,用户可能需等待分配的时隙,5G NR的短时隙(Mini-slot,2/4/7符号)可减少调度时延。
- 例:用户A(600子载波,3.5 MB/s)传输1000字节需286μs,用户B(200子载波,1.17 MB/s)需857μs。
3. 权衡
- 高数据速率 vs. 时延:
- 增加子载波数或使用高阶调制(如64QAM)提高数据速率,降低传输时延,但高阶调制对信道质量要求高,可能增加误码率和重传时延。
- 更大子载波间隔(如60kHz)缩短符号时长,降低传输时延,适合URLLC,但可能减少子载波数(固定带宽下),降低总数据速率。
- 多用户场景:
- 分配更多子载波给某用户可降低其传输时延,但可能减少其他用户可用资源,增加他们的调度时延。
三、示例计算
假设系统参数:20MHz带宽(1200子载波,1000个用于数据),QPSK(2比特/子载波),编码率3/4,比较子载波间隔15kHz和30kHz:
- 15kHz间隔:
- 符号时长:66.67μs + 4.7μs ≈ 71.37μs。
- 符号频率:1 ÷ 71.37μs ≈ 14000符号/s。
- 字节数/符号:1000 × 2 × 3/4 ÷ 8 = 187.5字节。
- 数据速率:187.5 × 14000 ≈ 2.625 MB/s。
- 传输1000字节时延:1000 ÷ 2.625 × 10^6 ≈ 381μs(约5.3符号)。
- 30kHz间隔:
- 符号时长:33.33μs + 2.35μs ≈ 35.68μs。
- 符号频率:1 ÷ 35.68μs ≈ 28000符号/s。
- 字节数/符号:1000 × 2 × 3/4 ÷ 8 = 187.5字节。
- 数据速率:187.5 × 28000 ≈ 5.25 MB/s。
- 传输1000字节时延:1000 ÷ 5.25 × 10^6 ≈ 190μs(约5.3符号)。
结论:30kHz间隔下,数据速率翻倍,传输时延减半。
-
数据速率与子载波带宽:
- 数据速率与子载波数(总带宽)正相关,更多子载波增加每符号字节数。
- 数据速率与**子载波间隔(Δf)**正相关,更大间隔缩短符号时长,提高符号频率。
- 例:20MHz带宽,30kHz间隔比15kHz间隔数据速率高一倍(5.25 MB/s vs. 2.625 MB/s)。
-
数据速率与时延:
- 高数据速率(更多子载波或更大间隔)减少传输时延。
- 例:1000字节传输,30kHz间隔(190μs)比15kHz间隔(381μs)时延减半。
- 多用户场景下,分配更多子载波或优先调度(如Mini-slot)进一步降低时延。
四、公司测试时延的方法
pages/viewpage.action?pageId=77409162
rtt.c
ntp 方法
主要用于基于NTP(网络时间协议)测量网络延迟的单向延迟和RTT(往返时间)。
-
NTP模式(单向延迟估算):
- Device端发送数据包,其中包含发送时的本地时间戳 (snd_ms)。
- AP端接收数据包,记录接收时的本地时间戳 (rcv_ms)。
- AP端计算单向延迟:delay = rcv_ms - snd_ms。
-
RTT模式(往返时间):
- Device端发送数据包,其中包含发送时的本地时间戳 (snd_ms_initial) 和一个序列号。
- AP端接收数据包,记录AP端的接收时间戳 (rcv_ms_ap),然后立即将包含原始序列号、Device发送时间戳和AP接收时间戳的数据包发回给Device。
- Device端接收到AP返回的数据包,记录Device端的最终接收时间戳 (rcv_ms_dev_final)。
- Device端计算RTT:RTT = rcv_ms_dev_final - snd_ms_initial。
- RTT测量通常比单向延迟测量更准确,因为它不依赖于两端时钟的严格同步,仅依赖于单台设备时钟的稳定性。
主要代码
1. 程序概述
这是一个用于测试基带设备之间网络延迟的RTT(Round Trip Time)工具。程序支持两种测试模式:
- NTP模式:单向延迟测试
- RTT模式:往返延迟测试
2. 核心数据结构
2.1 延迟统计结构
typedef struct {
uint64_t threshold; // 延迟阈值(毫秒)
uint64_t stat; // 统计计数
} stats_t;
用于统计不同延迟区间的数据包分布:5ms、10ms、20ms、50ms和其他。
2.2 线程参数结构
typedef struct {
int fd; // socket文件描述符
uint64_t recv_packet_size; // 接收包大小
} thread_args_t;
用于RTT模式下传递给接收线程的参数。
3. 关键函数分析
3.1 设备初始化函数 bb_open_ex()
功能:建立与基带设备的连接 流程:
- 连接到本地基带主机(127.0.0.1:50000)
- 获取可用设备列表
- 打开第一个设备
- 设置MCS变化事件回调
- 返回设备句柄
3.2 数据读取函数 datagram_read()
功能:从socket读取指定大小的数据 特点:
- 循环读取直到获得完整数据包
- 支持程序中断退出
- 错误处理机制
3.3 时间戳获取函数 time_ms()
功能:获取当前时间戳(毫秒精度)
实现:使用gettimeofday()系统调用
4. 测试模式详解
4.1 NTP模式(单向延迟测试)
AP端(接收端)- run_ap_ntp()
工作流程:
- 循环接收数据包
- 获取接收时间戳
- 从数据包中提取发送时间戳(偏移8字节)
- 计算延迟:接收时间 - 发送时间
- 按延迟区间统计
- 输出统计结果
DEV端(发送端)- run_dev_ntp()
工作流程:
- 计算发送参数(包数量、发送间隔)
- 循环发送数据包:
- 前8字节:包序号
- 8-16字节:发送时间戳
- 精确控制发送间隔
- 监控发送阻塞情况
4.2 RTT模式(往返延迟测试)
AP端(中继端)- run_ap_rtt()
工作流程:
- 接收数据包
- 解析包序号和发送时间戳
- 在16字节偏移处添加接收时间戳
- 返回数据包
- 统计单向延迟并记录日志
DEV端(发送/接收端)- run_dev_rtt()
工作流程:
- 创建接收线程
- 发送线程执行NTP发送逻辑
- 接收线程接收返回的数据包:
- 解析发送时间戳、远端接收时间戳
- 计算往返延迟
- 统计延迟分布
- 等待线程结束
5. 数据包格式
NTP模式数据包结构
+----------+----------+----------+
| 包序号 | 发送时间戳 | 数据... |
| (8字节) | (8字节) | |
+----------+----------+----------+
RTT模式数据包结构
+----------+----------+----------+----------+
| 包序号 | 发送时间戳 | 接收时间戳 | 数据... |
| (8字节) | (8字节) | (8字节) | |
+----------+----------+----------+----------+
6. 延迟统计机制
程序将延迟分为5个区间进行统计:
- ≤5ms:优秀延迟
- ≤10ms:良好延迟
- ≤20ms:可接受延迟
- ≤50ms:较高延迟
- >50ms:超高延迟
统计结果以百分比形式输出,便于分析网络性能。
7. 命令行参数
| 参数 | 说明 | 取值 |
|---|---|---|
| -r/--role | 设备角色 | 0=AP(接收), 1=DEV(发送) |
| -d/--duration | 测试持续时间 | 秒数 |
| -t/--throughput | 吞吐量 | KB/s |
| -e/--recvpacketsize | 接收包大小 | 字节数(16-8192) |
| -s/--sendpacketsize | 发送包大小 | 字节数(16-8192) |
| -m/--mode | 测试模式 | 0=NTP, 1=RTT |
六、可能的改进
1. 时间测量精度改进
- 微秒精度:使用
gettimeofday()的tv_usec字段 - 纳秒精度:使用
clock_gettime(CLOCK_MONOTONIC) - CPU周期精度:使用
rdtsc指令(x86平台)
// 时间精度选择器
typedef enum {
TIME_PRECISION_MS, // 毫秒
TIME_PRECISION_US, // 微秒
TIME_PRECISION_NS, // 纳秒
TIME_PRECISION_CPU // CPU周期
} time_precision_e;
static uint64_t get_timestamp(time_precision_e precision) {
switch (precision) {
case TIME_PRECISION_MS: return time_ms_original();
case TIME_PRECISION_US: return time_us();
case TIME_PRECISION_NS: return time_ns();
case TIME_PRECISION_CPU: return time_cpu_cycles();
default: return time_ms_original();
}
}
// 时间差计算(考虑时钟回绕)
static uint64_t time_diff(uint64_t start, uint64_t end, time_precision_e precision) {
if (end >= start) {
return end - start;
} else {
// 处理时钟回绕情况
switch (precision) {
case TIME_PRECISION_MS:
return (UINT64_MAX - start) + end + 1;
case TIME_PRECISION_US:
case TIME_PRECISION_NS:
case TIME_PRECISION_CPU:
return (UINT64_MAX - start) + end + 1;
default:
return 0;
}
}
}
2. 数据包结构改进
- 支持多重时间戳(发送、接收、硬件时间戳)
// 原始数据包头部(简单版本)
typedef struct {
uint64_t sequence; // 包序号
uint64_t send_time; // 发送时间戳
} packet_header_simple_t;
// 改进的数据包头部(增强版本)
typedef struct {
uint32_t magic; // 魔数,用于包验证 (0xDEADBEEF)
uint16_t version; // 协议版本
uint16_t flags; // 标志位
uint64_t sequence; // 包序号
uint64_t send_time_hw; // 硬件时间戳(发送)
uint64_t send_time_sw; // 软件时间戳(发送)
uint64_t recv_time_hw; // 硬件时间戳(接收)
uint64_t recv_time_sw; // 软件时间戳(接收)
uint32_t payload_size; // 有效载荷大小
uint32_t checksum; // 校验和
} packet_header_enhanced_t;
3. 统计分析改进
- 抖动计算:按RFC 3550标准计算网络抖动
- 滑动窗口统计:实时统计最近N个包的性能
5. 代码结构改进
// 时间测量模块
typedef struct {
time_precision_e precision;
uint64_t (*get_timestamp)(void);
} timing_module_t;
// 统计分析模块
typedef struct {
uint64_t samples[MAX_SAMPLES];
uint32_t count;
rtt_stats_t stats;
} statistics_module_t;
// 自适应控制模块
typedef struct {
network_quality_e quality;
uint32_t interval_us;
uint32_t packet_size;
} adaptive_module_t;
测距分析
AR8030采用的是基于精确时间同步的ToF(Time of Flight)距离测量技术,比RSSI更准确、更可靠的测距方案。通过测量信号往返时间并结合光速计算距离,能够提供高精度的距离测量结果,理论精度可达±1.5米,最大测量距离超过1500公里。
1. 基于同步的时间飞行(ToF)测量
AR8030采用基于同步的时间飞行(ToF)测量方式,而不是信号强度(RSSI)方式。
2. 核心技术参数
理论最大测量距离:
- 基于20位
td_out字段:2^20 = 1,048,576 - 考虑计算公式:最大距离约 1,573 km (这是收芯片设计制约,不是测距方法)
测量精度:
- 时间系统分辨率:10ns (
tsys) - 理论精度:±1.5米,根据公司文档和上海相关工程师回答,实际100m左右,这受限于硬件器件精度、滤波算法等因素,具体需要实测
距离计算公式:
distance = (td_out - offset) * 3 / 2 // 单位:米
在 bb_phy_distance.c 中的关键滤波常数:
#define BB_DISTC_FILTER_DIFF 500 // 关键限制
#define BB_DISTC_FILTER_THRED 10 // 连续阈值
#define BB_DISTC_AGED_TIME 1000 // 数据老化时间
滤波机制:
- 当测距差异 > 500个单位时,测量值会被过滤掉
- 只有当大差异连续出现10次以上时才会被接受
- 500个单位 × 3/2 = 750米的滤波阈值
这种方法比较激进,具体可能需要考虑之前的实测情况,上海为什么这么设计?
时间同步精度限制
- 系统时间分辨率:10ns (
tsys) - 理论精度:±1.5米(基于光速和时间分辨率)
- 但同步误差会累积影响最终精度
多径干扰
- 无线信号的多径传播会造成时间测量误差
- 反射、折射等现象导致信号到达时间不准确
硬件限制
- soc处理精度
- 晶振稳定性
- 天线特性和校准精度
- 调整滤波参数 - 减小
BB_DISTC_FILTER_DIFF值 - 优化时间同步算法 - 提高同步精度
- 增加校准机制 - 动态补偿环境因素
- 改进信号处理 - 采用更先进的多径抑制算法
4. 系统配置
距离测量功能可通过配置文件进行调节:(根据cfg的配置文档)
enable: 测距功能开关window: 平滑窗口大小(0-3,对应1-8个测量值)timeout: 超时阈值设置offset: 距离计算偏移量
现代OFDM/A相关算法
-
多径抑制算法,无资料
-
天线波束聚集,无资料
-
自适应滤波算法,无资料
-
信道均衡处理,无资料
-
同步算法,无资料
-
子载波分配管理,当前芯片ofdm资源分配是按照时隙分配,对比wifi 4 / 4G早期的方法,很难支持多用户情况下对的应用
-
在信道、导频设置选择上,有相关处理,但只是参数调整
上述算法,一般会固化到fpga中,根据相关论文如果定制开发可以使用通用射频芯片+FPGA实现,源码和当前的资料无相关的介绍,从芯片的性能参数分析,在OFDM的信号设计上,大概也就wifi 4 / 4G的水平,弱于同类产品,针对远距离的传输有一定优化,受限于算法、硬件资源,想实现多用户、高并发、高速传输基本很难实现。
组网和接力传输
核心在于:
- 网络拓扑的动态调整
- 功率自适应
- 配置参数
在当前版本的2024代码中没有体现,较好的支持是1V1和导演模式(广播),组网可参考wifi的开源Easy Mesh相关原理进行简化处理。
接力传输
以支持,通过配置实现,合肥开发板较少未测
组网
上海已实现,2025的新固件支持,受限片上资源,目前不稳定,还在给客户优化。 目前扫频的性能,片上资源,帧结构等芯片性能也决定了组网性能的上限。