OpenBTS 源码程序分解物理层transceiver

USRP客服 发布于 2011/10/12 14:08
阅读 1K+
收藏 1
对于OpenBTS功能强大,利用软件无线电的思想实现基站的功能很值得我们却借鉴学习。但是几万行代码看起来也是比较吃力的,我尝试将其慢慢分解,以便于大家学习交流。下面主要从物理层开始,这也是直接和usrp板通信的地方,也是软件无线电思想的核心部分。
第一部分 Transceiver 的分解
进到openbts/transceiver的文件夹,里面有一个readme 的文档,里面简单的介绍了三个模块的功能
1)USRP_Device 和USRP版通信的最前端模块,主要负责接收USRP板上的采样数据,同时将上层的数据交与USRP板用于发送
2)Radiointerface 这是一个中间处理模块,连接transceiver和usrp_device, 主要的功能是采样率的变换
3)Transceiver这个模块完成和GSM上层的通信,将上层交与的比特信息调制成基带信号发送,同时接收来自radiointerface的数据,判断数据的类型,交与上层处理
下面首先我们从Transceiver.cpp开始
OpenBTS 中 transceiver 的工作流程
1)入口Transceiver::start()
void Transceiver::start()
{
  mControlServiceLoopThread->start((void * (*)(void*))ControlServiceLoopAdapter,(void*) this);
}
启动了线程
mControlServiceLoopThread,对应的执行函数是ControlServiceLoopAdapter
mControlServiceLoopThread 是用于和GSM上层控制信息通信的线程
ControlServiceLoopAdapter 为其对应的执行体程序

2)ControlServiceLoopAdapter 
void *ControlServiceLoopAdapter(Transceiver *transceiver)
{
  while (1) {
    transceiver->driveControl();
    pthread_testcancel();
  }
  return NULL;
}
driveControl:处理同GSM控制信息的执行程序
3) driveControl
void Transceiver::driveControl()
{……
        mFIFOServiceLoopThread->start((void * (*)(void*))FIFOServiceLoopAdapter,(void*) this);
        mTransmitPriorityQueueServiceLoopThread->start((void * (*)(void*))TransmitPriorityQueueServiceLoopAdapter,(void*) this);
……
}
启动了两个线程
mFIFOServiceLoopThread  主要线程,用于数据读取的和radiointerface 通信的线程FIFOServiceLoopAdapter 是其执行程序
mTransmitPriorityQueueServiceLoopThread 用于处理GSM上层需要发送的数据
4)FIFOServiceLoopAdapter
void *FIFOServiceLoopAdapter(Transceiver *transceiver)
{
  while (1) {
    transceiver->driveReceiveFIFO();
    transceiver->driveTransmitFIFO();
    pthread_testcancel();
  }
  return NULL;
driveReceiveFIFO();是读取radiointerface 的处理程序
driveTransmitFIFO();和往radiointerface 写数据的程序
注意他们在同一个线程当中,这样做的目的是为了定时简单,避免冲突。
5)driveReceiveFIFO()
void Transceiver::driveReceiveFIFO() 
{
  rxBurst = pullRadioVector(burstTime,RSSI,TOA);
    mDataSocket.write(burstString,gSlotLen+10);
}
pullRadioVector(burstTime,RSSI,TOA);具体的信号接收处理部分,接收的数据将会返回到rxBusrt中,
然后封装成udp 报文,交于上层处理
6)pullRadioVector(burstTime,RSSI,TOA);
SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime,
                      int &RSSI,
                      int &timingOffset)
{
  radioVector *rxBurst = (radioVector *) mReceiveFIFO->get();
}
在这里,我们总算找到了radiointerface的入口 mReceiveFIFO了,他是radiointerface 和 transceiver的公共缓存区,在runtranceiver.cpp里面已经将它们关联,下一部分我们将研究GSMK信号的调制与解调
加载中
返回顶部
顶部