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)

  1. arsdk/middlewares/ - 中间件层

负责提供系统级服务和通用功能模块:

  • common/ - 通用组件库

    • cjson/ - JSON 解析库
    • crc/ - CRC 校验算法
    • libc/ - C 标准库实现
    • mm/ - 内存管理模块
    • ringbuffer/ - 环形缓冲区
    • syslog/ - 系统日志
  • hal/ - 硬件抽象层

    • inc/ - HAL 头文件(包含所有外设的抽象接口)
    • module/ - HAL 模块实现
  1. 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 固件

核心特性分析:

  1. 处理器架构 基于 RISC-V 32位架构(smartl_rv32) 支持 Xuantie-900 工具链 使用 FreeRTOS 实时操作系统

  2. 基带通信系统

  • 专门的基带处理模块(bb_core)
  • 支持多种通信协议和数据传输
  • RPC(远程过程调用)机制用于设备间通信
  • 支持 USB、SDIO、UART 等多种连接方式
  1. 外设支持 丰富的外设驱动支持:
  • 网络:以太网(GMAC)、USB、SDIO
  • 通信:UART、I2C、SPI、I2S
  • 存储:Flash、PSRAM、QSPI
  • 安全:PKA(公钥加密)、SPACC、TRNG(真随机数生成器)
  • 其他:GPIO、Timer、WDT、ADC、DMA 等
  1. 构建系统
  • 基于 Makefile 的构建系统
  • 模块化编译,每个组件独立构建为静态库
  • 支持多种配置和产品变体
  1. 内存管理
  • 自定义内存管理器(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 - 核心功能模块

主要功能:

  • 基带处理核心逻辑
  • 硬件驱动抽象
  • 通信协议实现

子模块结构:

  1. api子目录 - 应用程序接口层

    • bb_api.h/bb_api.c: 主要API接口
    • bb_api_internal.h: 内部API定义
    • bb_api_6200.h: 6200芯片专用API
  2. 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
  • 采样频率: 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. 宽范围带宽支持: 从1.25MHz到40MHz,适应不同应用场景
  2. 灵活的时域交织: 支持多种交织长度,提高抗突发错误能力
  3. 自适应MCS: 25级精细调节,优化频谱效率
  4. 专用MIMO设计: STBC和空间复用并存,MIMO天线数较少
  5. 子载波间隔: 不如5G NR灵活
  6. 最高调制阶数: 不支持的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间隔下,数据速率翻倍,传输时延减半。

  1. 数据速率与子载波带宽

    • 数据速率与子载波数(总带宽)正相关,更多子载波增加每符号字节数。
    • 数据速率与**子载波间隔(Δf)**正相关,更大间隔缩短符号时长,提高符号频率。
    • 例:20MHz带宽,30kHz间隔比15kHz间隔数据速率高一倍(5.25 MB/s vs. 2.625 MB/s)。
  2. 数据速率与时延

    • 高数据速率(更多子载波或更大间隔)减少传输时延。
    • 例: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测量通常比单向延迟测量更准确,因为它不依赖于两端时钟的严格同步,仅依赖于单台设备时钟的稳定性。

主要代码

image image image

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()

功能:建立与基带设备的连接 流程

  1. 连接到本地基带主机(127.0.0.1:50000)
  2. 获取可用设备列表
  3. 打开第一个设备
  4. 设置MCS变化事件回调
  5. 返回设备句柄
3.2 数据读取函数 datagram_read()

功能:从socket读取指定大小的数据 特点

  • 循环读取直到获得完整数据包
  • 支持程序中断退出
  • 错误处理机制
3.3 时间戳获取函数 time_ms()

功能:获取当前时间戳(毫秒精度) 实现:使用gettimeofday()系统调用

4. 测试模式详解

4.1 NTP模式(单向延迟测试)
AP端(接收端)- run_ap_ntp()

工作流程

  1. 循环接收数据包
  2. 获取接收时间戳
  3. 从数据包中提取发送时间戳(偏移8字节)
  4. 计算延迟:接收时间 - 发送时间
  5. 按延迟区间统计
  6. 输出统计结果
DEV端(发送端)- run_dev_ntp()

工作流程

  1. 计算发送参数(包数量、发送间隔)
  2. 循环发送数据包:
    • 前8字节:包序号
    • 8-16字节:发送时间戳
  3. 精确控制发送间隔
  4. 监控发送阻塞情况
4.2 RTT模式(往返延迟测试)
AP端(中继端)- run_ap_rtt()

工作流程

  1. 接收数据包
  2. 解析包序号和发送时间戳
  3. 在16字节偏移处添加接收时间戳
  4. 返回数据包
  5. 统计单向延迟并记录日志
DEV端(发送/接收端)- run_dev_rtt()

工作流程

  1. 创建接收线程
  2. 发送线程执行NTP发送逻辑
  3. 接收线程接收返回的数据包:
    • 解析发送时间戳、远端接收时间戳
    • 计算往返延迟
    • 统计延迟分布
  4. 等待线程结束

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处理精度
  • 晶振稳定性
  • 天线特性和校准精度
  1. 调整滤波参数 - 减小 BB_DISTC_FILTER_DIFF
  2. 优化时间同步算法 - 提高同步精度
  3. 增加校准机制 - 动态补偿环境因素
  4. 改进信号处理 - 采用更先进的多径抑制算法

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的新固件支持,受限片上资源,目前不稳定,还在给客户优化。 目前扫频的性能,片上资源,帧结构等芯片性能也决定了组网性能的上限。