OAI 5G-NR源码架构

OAI 5G-NR源码架构

1 特性范围

目前gNB5G-NRUE支持如下的配置:

  • 工作模式:TDD
  • CP长度:Normal CP
  • 子载波间隔: 30kHz
  • 信道带宽:40MHz(106PRB)、80MHz(217PRB)、100MHz(237PRB)
  • 天线端口:单波束
  • 时隙格式:14 OFDM符号
  • 编码方式:LDPC、polar

2 gNB源码解析

2.1 代码框架时序图

gNB源码主框架图如下图所示:

在这里插入图片描述

**Main:**主进程,主要功能包括:

1) 命令行参数解析

2) 系统配置文件解析

3) 各子层初始化工作,包括重要数据结构、接口初始化工作

4) 线程初始化,gNB管理线程、包括RRC层处理线程、rx/tx处理线程、传输网接口线程、x2口交互线程

5) 射频phy层及RU单元初始化及配置工作

6) 物理层算法模块数据初始化

7) 用户面数据业务缓存开辟

gNB_app_task:gNB管理线程,主要功能包括:

1) gNB主要数据结构初始化 RCconfig

2) MAC层与PHY层的P5&P7接口初始化,回调函数注册

3) 调用P5接口向RRC发送承载配置命令

4) 处理核心网下发的一些消息

5) 处理各种超时处理消息等

rrc_gnb_taskRRC处理线程,主要功能包括:

1) RRC配置消息处理,如果支持NSA方式,还需要处理MN设备发送的RRC重配置消息。

2) 双连接副站添加相关处理

3) 随机接入消息处理(Msg3,Msg4)

4) 测量相关处理

5) 系统消息处理

sctp_eNB_task:传输网接口线程,主要功能包括:

1) NG口连接建立相关的消息处理

2) 与F1AP 控制面的消息处理(包括CU和DU两部分)

ru_threadrx/tx处理线程,主要功能包括:

1) RU设备库加载

2) 上行流程处理,包括PHY、MAC、RLC、PDCP

3) 下行流程处理, 包括PHY、MAC、RLC、PDCP

2.2 重要函数及过程

2.2.1 主进程

Main() [nr-softmodem.c]

  1. get_options()

通过解析命令行参数来对系统做配置。

重要的数据结构:RAN_CONTEXT_t, 存储gNb实例、macrlc实例、L1实例,RU实例信息。

  1. netlink_init()

  2. init_pdcp()

  3. create_gNB_tasks(1)

起来几个主要线程

a. itti_create_task(TASK_GNB_APP, gNB_app_task,NULL):

1) L1配置信息初始化

2) 完成对phy层、rlc子层、PDCP子层的初始配置工作,若支持noS1模式,还要读取rrc子层的配置信息。

3) 初始化MAC与PHY之间的接口,回调函数注册:

Nr_ul_indication:层2上行接收接口函数,当物理层从空口接收到上行数据,经过物理层过程后将会触发该函数将解码后的数据pdu上送至MAC层

**nr_phy_config_request:**系统参数配置入口处理函数。在SA模式下,系统读取初始化配置文件,然后将其传送给RRC层,RRC层根据配置文件信息形成RRC message(如:SI系统消息),在5G NR NSA模式下,其接收的配置消息基本上就是MIB以及服务小区从X2接口传来的重配置消息。

nr_schedul_response:MAC与PHY的下行接口处理函数。该函数可对MAC层下行pdu进行调度,包括MIB、PRACH消息、rrc消息业务数据pdu以及一些半动态配置消息,并根据调度结果生成DCI。

4) configure_nr_rrc:初始化RRC实体,生成rrc配置消息,包括物理层及射频单元配置。通知RRC处理线程。

b. itti_create_task(TASK_SCTP, sctp_eNB_task,NULL):

​ gNB NG-C的接口线程,也可作为F1-C的接口。

c. itti_create_task(TASK_X2AP, x2ap_task,NULL):

X2接口线程

d. itti_create_task(TASK_RRC_GNB, rrc_gnb_task,NULL)

​ RRC子层的处理线程,主要应包括系统消息、随机接入的Msg3、Msg4相关处理、一些测量相关消息处理

  1. init_gNB()

注册MAC层与PHY层接口回调函数:Nr_ul_indication、nr_phy_config_request、nr_schedul_response(详细描述见4)。

  1. wait_gNBs()

此处采用了停等的模式。至此,系统参数配置以及生效,phy及mac层以上子层均完成初始配置工作。

  1. init_NR_RU()

1) 射频单元参数初始化。主要参数包括:uhd driver地址、类型、同步时钟源,接收增益,参考信号能量等。

2) 回调函数注册,主要回调有:

ru->fh_south_in:RU与phy的上行接口处理函数

ru->fh_south_out:RU与phy的下行接口处理函数

ru->feptx_ofdm:射频前端处理函数

ru->feprx :射频前端处理函数

3) init_RU_proc():空口线程管理,此处起了gNB上下行处理的主线程ru_thread

  1. wait_RUs()

此处采用线程同步方式(pthread_cond_signal(&RC.ru_cond),RC.ru_mask)。至此,包括射频单元在内的所有模块初始配置工作完成。

  1. init_eNB_afterRU()

1) 初始化物理层算法模块使用的数据表格、配置物理层处理过程的一些关键参数

2) 回调函数注册:gNB_top, gNB上/下行数据处理入口函数。

3) 为ULSCH/DLSCH开辟存储buffer

  1. 至此,所有RU单元及gNB实体ok,发送同步信号(pthread_cond_broadcast(&sync_cond))通知所有处理线程可以开始上/下行数据处理。

2.2.2 ru_thread线程

  1. nr_init_frame_parms()

这里计算了空口帧的许多重要参数信息,包括每帧的时隙数、每子帧的时隙数、每个时隙的符号数、每帧的采样点数、每个时隙的点数、接收/发送天线数、频率范围、帧类型、子载波间隔等信息。

  1. fill_rf_config()

根据numerology及PRB配置信息得到系统的信道带宽及采用率等信息上下行频点,天线tx_gain,rx_gain等信息

  1. nr_phy_init_RU()

初始化与phy层的接口buffer

  1. openair0_device_load()

加载RF设备库

  1. 线程同步,启动RF设备,开始正常的接收发送

  2. 上行处理流程

  3. 下行处理流程

2.2.3 rrc_gnb_task线程

RRC子层处理线程

  1. RRC配置/重配置

接收gNB管理线程的rrc配置消息NRRRC_CONFIGURATION_REQ,调用init_NR_SI,该函数最终会调用P5接口对底层设备进行配置。如下图所示:
在这里插入图片描述

  1. 副站添加

接收X2接口发送的副站添加消息X2AP_ENDC_SGNB_ADDITION_REQ

2.2.4 随机接入过程

  1. preamble接收

调用函数L1_nr_prach_procedures()在上行PRACH信道上接收preamble,最多能检测到64个preamble。获取preamble序列,找到当前root序列下的preamble循环偏移位置,计算输出检测到的pramble的TA(时间调整值)和能量。

选取能量最大的preamble

gNB->UL_INFO.rach_ind.number_of_pdus = 1, 发起随机接入流程

  1. 初始化发起随机接入

handle_nr_rach()

调用nr_initiate_ra_proc()

将状态改为 ra->state = Msg2

初始化随机接入过程

  1. 发送RAR

nr_schedule_RA()

nr_generate_Msg2()生成Msg2,分别处理DCI,PDCCH,PDSCH设置,

赋值tx_req

在发送时隙,调用phy_procedures_gNB_TX()

生成DCI

执行PDCCH、PDSCH过程

将状态改为 ra->state = WAIT_Msg3

  1. Msg3接收

调用nr_schedule_reception_msg3()存储msg3主要信息(ul_req):包大小,包地址,当前帧号和时隙。

ifi->NR_Schedule_response[回调函数:nr_schedule_response]

调用函数handle_nfapi_nr_ul_dci_pdu 解出ul dci

调用函数nr_fill_ulsch()根据dci找到ulsch位置

在物理层接收主函数phy_procedures_gNB_uespec_RX 中调用函数nr_ulsch_procedures()

调用函数nr_ulsch_decoding()得到解码后的mac_pdu

rx_ind.number_of_pdus++ , crc_ind.number_crcs++

mac上行接收主函数中调用nr_rx_sdu()

3 接口

3.1 nFAPI(P5 &P7)

3.1.1 架构

FAPI提供了MAC层与PHY层之间的接口,实现了phy层与mac层的分离,其接口架构如下图所示,其中P5口主要用于传送静态配置信息,P7口主要用来传送数据和半动态配置信息。

在这里插入图片描述

3.1.2 过程

如上图所示,MAC层从命令行或配置文件获取系统配置参数,然后将其传送至RRC层,RRC层会通过P5接口触发nr_phy_config_req()对PHY及RU进行配置。在5G NR NSA方式下,RRC子层接收从X2接口来的主校区rrc重配置消息。

对于半动态配置消息以及用户面数据信息的传送,MAC层与PHY层之间使用P7接口,对于上行数据,触发nr_ul_indication();对于下行数据,触发nr_schedule_response()

NR_UL_INDICATION

NR_SCHEDULE_RESPONNSE

TX_REQ

携带从MAC层到 PHY 层的 PDU.

RX_IND

携带从PHY层到MAC层的 PDU

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3247126.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Redis-应用

目录 应用 缓存雪崩、击穿、穿透和解决办法? 布隆过滤器是怎么工作的? 缓存的数据一致性怎么保证 Redis和Mysql消息一致性 业务一致性要求高怎么办? 数据库与缓存的一致性问题 数据库和缓存的一致性如何保证 如何保证本地缓存和分布式缓存的一致? 如果在…

solidity基础语法(以太坊solidity合约)

solidity基础语法(以太坊solidity合约) 1-值类型和取值范围2-引用类型3-引用类型高阶4-固定数组和动态数组 1-值类型和取值范围 https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#subcurrency https://learnblockchain…

WEB前端06-DOM对象

BOM浏览器对象模型 浏览器对象模型:将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型,提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window:浏览器窗口对象 Navigator&…

Hadoop3:HDFS存储优化之小文件归档

一、情景说明 我们知道,NameNode存储一个文件元数据,默认是150byte大小的内存空间。 那么,如果出现很多的小文件,就会导致NameNode的内存占用。 但注意,存储小文件所需要的磁盘容量和数据块的大小无关。 例如&#x…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代,视频已成为我们记录生活、分享快乐的重要工具。然而,大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下,轻松减小视频文件大小?今天,就让我们一起探索苹果电脑上的几种高效视频压缩…

iPhone手机怎么识别藏文?藏语翻译通App功能介绍:藏文OCR识别提取文字

在工作学习的过程中,遇到不会的藏文,也不知道怎么把文字打出来,这个时候可以试试《藏语翻译通》App的图片识别功能,支持拍照识别和图片识别,拍一拍就能提取藏文文字,并支持一键翻译和复制分享。 跟着小编的…

数据结构之双向链表(赋源码)

数据结构之双向链表(源码) 线性表 双向链表是线性表链式存储结构的一种,若对链式存储结构进行分类可以分为八种。 带头、不带头:指的是该连链表有无头节点,头节点不存放任何内容,它不一定是链表必备的元素,而一个链…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

RPA鼠标按键使用技巧

RPA鼠标按键使用技巧 Mouse.MouseAuto.Action命令出错,调用的目标发生了异常,Exception in Mouse.Action元素不可用怎么解决 出现问题 1.想要实现的效果鼠标移动到录屏工具的小球上2.点击开始按钮开始录屏现象,鼠标没有移动痕迹&#xff0c…

C1W4.Assignment.Naive Machine Translation and LSH

理论课:C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…

华为的热机备份和流量限制

要求: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW4,生产区和办公区的流量走FW5 13,办公区上网用户限制流量不超过100M,…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日,位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道,三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来,博物馆作为重要的文化场所,也迎来了大量游客。博物馆作为文化和历史的重要载体,其安全保…

QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件

文章目录 main.cpp代码捕获异常 生成dmp文件和pdb文件DebugTest生成错误代码注意 分析软件崩溃,除了需要dmp,还需要这个pdb文件 dmp,文件记录了崩溃的信息,而pdb(代码工程数据库),则包含了你写的…

全局 loading

好久不见! 做项目中一直想用一个统一的 loading 状态控制全部的接口加载,但是一直不知道怎么处理,最近脑子突然灵光了一下想到了一个办法。 首先设置一个全局的 loading 状态,优先想到的就是 Pinia 然后因为页面会有很多接口会…

AI软件小说推文直接生成漫画短视频,小说推广项目的辅助工具,前端uniapp。

有哪些AI的软件是比较热门的? 以下是一些常用的网页AI软件,可以用于绘图: Canva:Canva是一个非常受欢迎的网页平台,提供各种图形设计和绘图工具。它具有易于使用的界面和大量的模板和元素,可以帮助你创建出…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集,用于创建自定义的在线和离线安装…

【网络安全】PostMessage:分析JS实现XSS

未经许可,不得转载。 文章目录 前言示例正文 前言 PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口(例如,来自同一域名下的不同页面或者不同域名下的跨域页面)进行通信,而无需通过服务器…

【线程系列之五】线程池介绍C语言

一、基本概念 1.1 概念 线程池(Thread Pool)是一种基于池化技术管理线程的机制,旨在减少线程创建和销毁的开销,提高系统资源的利用率,以及更好地控制系统中同时运行的线程数量。线程池通过预先创建一定数量的线程&am…

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…

Python | Leetcode Python题解之第238题除自身以外数组的乘积

题目: 题解: class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:length len(nums)# L 和 R 分别表示左右两侧的乘积列表L, R, answer [0]*length, [0]*length, [0]*length# L[i] 为索引 i 左侧所有元素的乘积# 对于索引为…