OAI NR nr-softmodem初步解析
编译和仿真命令
基于版本:OAI_develop_210827。对nr-softmodem,也就是 gnb进行解析。
下载后编译 先用git init命令,然后chmod 777 -R把文件夹内权限设置一下。
develop的编译:
sudo ./build_oai -w USRP --eNB --nrUE --gNB -g -G -V -x -P --ue-trace --ue-timing --build-lib telnetsrv --build-lib all
NR_UE_SA的编译:
sudo ./build_oai -w USRP --eNB --nrUE --gNB -g -G -P --build-lib all
分别用-P和取消-P分别编译一次。
gdb 调试和仿真:
ue端:
sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path ./ -d
server端: (在ubuntu终端中输入export RFSIMULATOR=server,并用env命令查看)
sudo cgdb --args ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf --rfsim --phy-test -d --command set enviroment RFSIMULATOR=server --rfsimulator.options saviq
读取配置
调试命令:
对NR_SSB的一些配置(读取nr_init_frame_parms()运行后的fp结构体):
{freq_range = nr_FR1, N_RB_DL = 106, N_RB_UL = 106, N_RBG = 0 '\000', N_RBGS = 0 '\000',
nr_band = 78, dl_CarrierFreq = 3619080000, ul_CarrierFreq = 3619080000, att_tx = 0, att_rx
= 0, frame_type = TDD, tdd_config = 0 '\000', Nid_cell = 0, subcarrier_spacing = 30000,
threequarter_fs = 0 '\000', ofdm_symbol_size= 2048, nb_prefix_samples = 144,
nb_prefix_samples0 = 176, first_carrier_offset = 1412, symbols_per_slot = 14,
slots_per_subframe = 2, slots_per_frame = 20, samples_per_subframe = 61440,
samples_per_slot0 = 30720, samples_per_slotN0 = 30688, samples_per_frame = 614400,
samples_per_subframe_wCP = 57344, samples_per_slot_wCP = 28672, samples_per_frame_wCP =
573440, numerology_index = 1 '\001', nb_antennas_tx = 1 '\001', nb_antennas_rx = 1 '\001',
nb_antenna_ports_gNB = 0 '\000', Ncp = NORMAL, symbol_rotation = {{0 <repeats 448 times>},
{0 <repeats 448 times>}}, nushift = 0 '\000', srs_nr = {active_srs_Resource_Set = 0 '\000',
number_srs_Resource_Set = 0 '\000', p_SRS_ResourceSetList = {0x0}}, ss_PBCH_BlockPower = 0,
p_tdd_UL_DL_Configuration = 0x0, p_tdd_UL_DL_ConfigurationCommon2 = 0x0,
p_TDD_UL_DL_ConfigDedicated = 0x0, tdd_uplink_nr = {0 <repeats 320 times>}, half_frame_bit
= 0 '\000', ssb_start_subcarrier = 0, ssb_type = nr_ssb_type_C, Lmax = 8 '\b', L_ssb =
9223372036854775808, N_ssb = 1 '\001', ssb_index = 0 '\000', pbch_polar_params = {idx = 0,
nextPtr = 0x0, n_max = 0 '\000', i_il = 0 '\000', i_seg = 0 '\000', n_pc = 0 '\000',
n_pc_wm = 0 '\000', i_bil = 0 '\000', payloadBits = 0, encoderLength = 0, crcParityBits = 0
'\000', crcCorrectionBits = 0 '\000', K = 0, N = 0, n = 0 '\000', crcBit = 0,
interleaving_pattern = 0x0, deinterleaving_pattern = 0x0, rate_matching_pattern = 0x0,
Q_0_Nminus1 = 0x0, Q_I_N = 0x0, Q_F_N = 0x0, Q_PC_N = 0x0, information_bit_pattern = 0x0,
channel_interleaver_pattern = 0x0, crc_generator_matrix = 0x0, G_N = 0x0, G_N_tab = 0x0,
groupsize = 0, rm_tab = 0x0, cprime_tab0 = {{0 <repeats 256 times>} <repeats 32 times>},
cprime_tab1 = {{0 <repeats 256 times>} <repeats 32 times>}, B_tab0 = {{0 <repeats 256
times>} <repeats 32 times>}, B_tab1 = {{0 <repeats 256 times>} <repeats 32 times>},
extended_crc_generator_matrix = 0x0, nr_polar_crc = 0x0, nr_polar_aPrime = 0x0,
nr_polar_APrime = 0x0, nr_polar_D = 0x0, nr_polar_E = 0x0, nr_polar_A = 0x0, nr_polar_CPrime = 0x0, nr_polar_B = 0x0, nr_polar_U = 0x0, tree = {root = 0x0, num_nodes =
0}}}
数据发送:
按slot来发送。一个子帧是2个,所以大多数情况是0.5ms发送一次。
tx_rf()中ru->rfdevice.trx_write_func()进行发送。这个函数指针在usrp发送指向trx_usrp_write()。在RFSIMULATOR=server仿真下,指向 rfsimulator_write_internal()进行的数据发送。
发送的数据长度为nsamps,地址为txp, 如下进行赋值:
txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension];
在rx_func()末尾,如果满足下面的条件,则启动tx_func()。
tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT
发送函数作用解释:
- tx_func(): 生成bit帧(dci、csi,旋转等),主要调用phy_procedures_gNB_TX()。在rx_func()末尾可以启动。 在Tpool0_1 ~ Tpool7_-1共8个线程中来承载运行;
- ru_tx_func() : 射频前端、OFDM调制,调用ru->fh_south_out()函数指针,指向tx_rf(),以通过射频usrp或者仿真网口发出去。ru_tx_func()在tx_func()末尾启动。 ofdm调制调用Tpoll线程的nr_feptx_prec来实现。 在Tpool0_1 ~ Tpool7_-1共8个线程中承载运行;
- nr_feptx_prec() :OFDM调试、波束预编码。由线程"feptx"承载运行。 由线程Tpool0_1 ~ Tpool7_-1里面的tx_func(),通过nr_feptx_ofdm_2thread()调用。
读取发送保存的文件
运行时添加参数 --rfsimulator.options saviq。默认保存位置为tmp/rfsimulator.iqs
matlab读取的对应代码为:
clear;clc;close all;
format LONGG;fid = fopen('Z:\work\data\rfsimulator.iqs','r');
skip = 0; % by bytes
Nframe = 100;for i = 1:Nframeheader = fread(fid,8,'uint32');frame.header.magic = header(1) * 2^32 + header(2);frame.header.size = header(3);frame.header.nbAnt = header(4);frame.header.timestamp = header(5) * 2^32 + header(6);frame.header.option_value = header(7);frame.header.option_flag = header(8); skip = skip + 32;fseek(fid,skip,1); % by bytessize = frame.header.size;data = fread(fid,size*2,'int16');frame.real=data(1:2:end-1);frame.img =data(2:2:end);frame.cmx = frame.real + 1j * frame.img; skip = skip + size * 4; fseek(fid,skip,1); % by bytesFrameS(i) = frame;
end
fclose(fid);
# 线程池及调用
发送和接收的主要函数是ru_thread(),通过thread_FH线程承载。这个线程又调用函数tx_func()和ru_tx_func()。这两个函数都是通过Tpool0_1 ~ Tpool7_-1线程池承载。tx_func里面的OFDM调制又通过调用nr_feptx_prec()里面的nr_feptx_ofdm_2thread()来实现。而nr_feptx_prec是通过线程feptx来承载。
ru_thread()里面也把接收的数据发给scope,用于显示;
函数通过 pushTpool()如 pushTpool (gNB->threadPool, res)调用函数。如读取 res内容可以看到线程运行的函数 ru_tx_func():
(gdb) p *res
$39 = {next = 0x0, key = 3, reponseFifo = 0x39c2c40, processingFunc = 0x6b0633 <ru_tx_func>, malloced = true, creationTime = 0, startProcessingTime = 0, endProcessingTime = 0, returnTime = 0, msgData = 0x7fffe001e6c0}
该线程池的详解见:“线程池Code详解" 作者 从善若水。
pullTpool() : 返回可用的线程;pushTpool()运行线程。里面有线程上一个处理函数和下一个处理函数
如tx_func()里面语句:
res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
在此处断点,打印
p *gNB->resp_RU_tx->outF
p *gNB->resp_RU_tx->inF
OAI NR nr-softmodem初步解析相关推荐
- OAI 5G NR搭建gNB和UE(更新中)
OAI 5G NR搭建gNB和nrUE 有做这个的可以加QQ群:1097302005一起交流学习 ubuntu 18.04 USRP N310 安装UHD驱动[1] 我们将在GitHub上git cl ...
- URP渲染管线初步解析
URP渲染管线初步解析 LWRP现在在unity2019已经成为默认的管线了,并更名为URP(通用渲染管线),替代了原来的builtin管线,以下是应用阶段的渲染流程顺序. 步骤分析 URP整个渲染的 ...
- OAI 5G NR+USRP B210安装搭建
目录 前言 1. 设备环境 1.1 硬件环境 1.2 USRP 1.3 系统安装 2. 编译运行 2.1 OAI编译 2.2 OAI运行 2.3 接入测试 2.4 注意事项 3. 拓展 前言 OAI是 ...
- NR TM测试模式解析
(a)公共基础参数 (b)TDD 专用时隙配比 例如 30K 时候,一个子帧(1ms)包含2个slot,每个solt 是0.5ms, 每个solt 包含 14 个OFDM 符号 根据参数 下行slot ...
- 编译器工具链初步解析
GNU 一般编译器分为三个stage: cc1,as,ld. 预处理器:cc1 编译器:cc1 →输出汇编代码 (* .s) 汇编程序:as → 输出目标文件 (* .o) 链接器:ld (colle ...
- SQL注入原理初步解析
1.初步理解产生sql注入漏洞的原因,(个人浅薄理解) 在web前端或者所示在网站的登录或者查询页面当输入用户和密码登录时或者是查询界面进行查询时那么前端则会从数据库中查询数据那么此时如果过滤不严谨, ...
- 北斗系统学习:JTT808协议初步解析
本文学习部标(交通运输部)JT/T 808,并使用 Golang 语言解析.当然,仅使用位置数据进行演示,所以只是一个开端(是否有后续,暂未知).本文不是科普,因此不会详细列出协议字段说明,可参考文后 ...
- 文件上传漏洞初步解析(个人浅薄理解)
1.文件上传漏洞原理. 在web网站中会有一些需要用户上传图片或者是压缩包或者是文件之类的功能,在这些功能下用户可以上传文件到网站的后台,但是在有些过滤的文件类型没有做好会导致黑客可以上传木马文件或者 ...
- HSRP的初步解析及典型应用2
总的来说就是,由两台以上的路由器组成一个HSRP组,在该组之中选举一台路由器作为Active路由器,一台路由器作为Standby路由器,其它路由器则进入Listen状态.实际工作时,是由Active路 ...
最新文章
- android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画...
- SSM+BJUI实现CRUD的报表功能
- F1.4大光圈专业相机-海鸥CF100
- springboot整合spring @Cache和Redis
- 7-11 找最长的字符串 (15 分)
- tensorflow中如何进行可视化和减轻过拟合(转)
- 揭秘井井有条的流水线(ZooKeeper 原理篇)
- RF接口测试设计时需要考虑的事(robotframework框架)
- 浙江大学概率论与数理统计第四版考研真题和课后答案
- 关于数据结构(c语言)中结构体声明的LNode, *LinkList
- win10 计算机网络密码,详细教你Win10怎么查看无线网络密码
- 如何快速拷贝整个网站所有网页
- Processing 案例 | 扑面而来的满天繁星
- 假如你有超能力,会复活哪部经典美剧?
- 摩斯密码(Morse)——python解密
- 王烁-《30天投资训练营.2020》01.投资六忌:读后感
- 一个向上帝买了挂的男人!
- 水果店线下营销活动案例,水果店营销活动促销方案怎么做
- 东南大学考研计算机基础大纲,2018东南大学计算机科学与工程学院专业基础课程考试大纲及题型分布...
- sw2020sw无法获得下列许可,使用许可文件不支持此版本 解决方案
热门文章
- 【报告分享】2021年暑期旅游数据报告-马蜂窝(附下载)
- STL容器之<vector>
- matlab 判断是否是nan,关于Python中Inf与Nan的判断问题详解
- CountDownLath 倒计时器
- c语言的右箭头的作用,C语言中点操作符(.)和箭头操作符(-)的不同之处
- Ubuntu下Deluge无法连接主机的解决
- 如何批量提取 PDF 文档内容,将 PDF 格式文档转为 Txt 文本格式
- [计算机视觉]-从ShuffleNet V2来看,为什么有些FLOPs小的模型在实际推理过程中所花费的时间更长/速度更慢?
- Andrew Ng吴恩达深度学习Course_2笔记
- PHP可道云开源,Kodexplorer可道云 php版 v4.40