实验环境
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()
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 进行分析。
由于本人能力有限,可能会出现错误,如有错误或者疑问,欢迎大家指出。 谢谢!
参考文献: