srsLTE 源码学习之 PLMN 搜索、小区搜索流程
Celluar SDR:srsLTE
SDR 平台:USRP B210
看源码软件:Source Insight 4.0
由于应用方向和时间关系,暂不对物理层的源码展开过多研究。
1、rrc::plmn_search()
从 srsLTE 的源码来看,PLMN( Public Land Mobile Network )搜索过程包含了小区搜索的过程。
2、rrc::cell_search()
下图中的 phy->cell_search(&new_cell) 调用了物理层与RRC层的接口函数 cell_search,其所在文件的目录为:srsLTE\srsue\src\phy\phch_recv.cc。该函数的主要功能是获取小区物理 ID、完成下行同步、接收并解码 MIB,同步系统帧号( SFN )、完成小区驻留以及 获取SIB1 等;如果在任何的频段内都没有找到小区,则返回 CELL_NOT_FOUND;如果在搜索的过程中出现错误,则返回 ERROR。
如果小区搜索结果为 CELL_FOUND,则开始设置 serving cell,不过在设置 serving cell 之前,要先添加邻区。
3、rrc::add_neighbour_cell() & rrc::find_neighbour_cell()
初始状态不存在 neighbour cell, 所以 neighbour_cells.size() = 0, 即 cell_idx = -1。
注意两次的 rrc::add_neighbour_cell() 并不是同一个函数。
函数 rrc::add_neighbour_cell(phy_interface_rrc::phy_cell_t phy_cell, float rsrp) 的运行结果为 return add_neighbour_cell(new_cell); 如下图所示。
4、rrc::add_neighbour_cell() → rrc::cell_search() → rrc::set_serving_cell()
函数 rrc::set_serving_cell() 中程序的流程比较简单,这里不做过多叙述。
5、rrc::set_serving_cell() → rrc::cell_search()
6、rrc::cell_search() → rrc::si_acquire() → rrc::sib_start_tti() → rrc::si_acquire()
这里关于 TTI 有一个疑问目前还没有解决,就是 mac->get_current_tti() 函数获取的 TTI 应该怎么理解?在网上看到两种说法:一种是 LTE 中 TTI 是 MAC 层传输 TBS 的间隔,固定为 1ms,另一种是 TTI 可灵活变动。这里应该不是固定为 1ms,因为根据程序中提供的信息来看,TTI 的确是不断变化的,且其取值为 0 ~ 10239。使用 USRP B210 搭建 LTE 平台,将 log 信息打印到终端(见下图),也可以根据 si_win_start 反推出 TTI 的值。但是如果说 TTI 是灵活变动的,又怎理解呢?这个问题待以后再解答,也欢迎各位发表自己的见解,谢谢~
7、rrc::si_acquire() → rrc::cell_search()
8、rrc::cell_search() → rrc::plmn_search() → rrc::process_phy_meas() → rrc::plmn_search()
小区搜索结果为 CELL_FOUND,SIB1 已接收。
总结
由于程序在运行的过程中,涉及到了多线程的问题,所以为了更好地了解程序的运行过程,最好参照程序运行的 log 进行分析。
由于本人能力有限,可能会出现错误,如有错误或者疑问,欢迎大家指出。 谢谢!
参考文献: