Sora软件部分介绍_第1页
Sora软件部分介绍_第2页
Sora软件部分介绍_第3页
Sora软件部分介绍_第4页
Sora软件部分介绍_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 姚远Brands owned by V3:V3 Technology(Beijing), LtdWireless SolutionAbout V3 Technology V3 Technology focus on accelerating the realization of innovative ideas in areas including Wireless , Smart Vision , Testing & Measurement and embedded computing. Innovation for RTypical C5SoraSora StationSora MIMO

2、Sora kitSoftware RadioSora station Sora MIMOSora kitComponent RCB RFCode讲述要点 Sora架构 UMX编程 Brick编程 编译及验证Sora架构 Sora简介 Sora软件无线电平台基于通用个人计算机架构,将模数变换器(A/D)及数模变换器(D/A)尽可能地靠近射频天线,建立一个具有“A/D-DSP-D/A”模型的通用的、开放的硬件平台。通过软件来完成尽可能多的通信功能,而硬件部分功能尽可能的简单,通用。从而提高系统灵活性和可编程性。 Sora的整体框图 在sora系统中,AD/DA转换器构成了软硬件的界面。通信系统的模

3、拟部分由硬件完成,数字部分由软件在通用处理器上实现。这包括物理层(基带)处理,MAC层,网络层及其他高层协议。 Sora系统架构图 硬件部分包括一块无线控制板(RCB),以及一系列可替换射频前端模块。RCB为射频前端模块和个人PC之间提供了一个基于PCIe总线标准的接口,可支持高速的数字信号采样。同时RCB上包含了一个存储器,用以缓存预先计算好的数据波形,这一功能可以显著的降低延时。 Sora软件架构图 Sora给开发者预留了两套编程所需接口 内核态的核心应用程序接口(Core API) 用户态的用户扩展接口(UMX API)。 程序员可以通过UMX接口在用户态就可以直接访问各种软件无线电资源

4、,UMX API是通过一个内核态驱动程序HWTest来实现的。UMX编程首先要了解什么是ARO以及ARO的工作原理Sora平台支持射频前端模块,不同的射频前端可能采用不同的芯片组,工作方式也不一样。为了避免这些复杂的操作,Sora将无线电射频硬件抽象成一个对象,称为抽象无线电对象(ARO)。ARO为应用软件提供了一个统一的接口用以控制和读写不同的射频硬件。ARO与射频硬件具有一一对应的关系。一个ARO包括一个发送信道,一个接收信道和一组统一的控制寄存器。应用程序通过ARO控制射频前端的过程:当应用程序执行写控制寄存器操作时,这一命令通过ARO传到RCB上,再由RCB转发到射频前端模块上,最后由

5、射频前端模块上的固件将这一命令翻译成射频芯片特定的操作指令。 在抽象无线电对象中,接收信道表示为一个数字信号样本流。接收到的信号在射频前端被数字化,然后传给RCB,最后由RCB通过直接内存访问(DMA)写入计算机内存中。Sora ARO通过两“步”方式发送一个数字信号。首先,应用程序将调制好的数字信号样本转存到RCB的存储器上;然后,应用程序指示ARO将一个转存好的信号从射频前端硬件上发送出去。这两步可以独立,异步执行。在ARO进行转存时,每一个信号都被分配了唯一的标号,在第二步时,ARO将使用这个标号来指定要发送的信号。UMX编程流图及对应函数下面总结UMX编程框架及函数调用形式:初始化UM

6、X库; 具体函数:SoraUInitUserExtension(“.HWTest”);初始化一个ARO; 具体函数:SoraURadioStart(TARGET_RADIO);为抽象无线电对象分配接收信道; 具体函数:SoraURadioMapRxSampleBuf(TARGET_RADIO,&RX_Buffer,&RX_BufferSize); 返回:接收信道的DMA缓存地址(RX_Buffer)和环形缓存区大小(RX_BufferSize)。从接收信道分配一个接收流; 具体函数:SoraURadioAllocRXStream(&RxStream,TARGET_RADIO,(PUCHAR)R

7、xBuffer,RxBufferSize); 作用:获得一个SORA_RADIO_RX_STREAM接收流对象,通过这个接收流访问接收到的样本数据。配置合适的无线接收机参数; 具体函数:ConfigureRadio(); 可配置参数包括:载波频率,频偏校正,发送增益,接收机第一级放大器增益,接收机第二级放大器增益。特别的,现有的Sora射频硬件没有自动增益控制功能。为发射信道分配一个转存数据缓存区; 具体函数:SoraUAllocBuffer(TxSampleBufferSize); 作用: 这个缓存区将在sora信号发送过程中使用。在转存缓存区里填写调制好的数字信号样本; 具体函数:proc

8、ess(); 自己的处理流图将数字样本块转存到RCB存储器上; 具体函数:SoraURadioTransferEx(TARGET_RADIO,TxSampleBuf,TxSampleBufSize,&TxID);指示RCB存储器发送已经转存好的信号样本块; 具体函数:SoraURadioTx(TARGET_RADIO,TxID);在程序终止前去初始化(de-initialize)UMX库。 具体函数:SoraUCleanUserExtension(); 一个UMX程序框架示例/ 首先,初始化UMX库,然后调用主处理函数。处理完成后清除UMX库。int _cdecl main(int argc,

9、const char *argv) / Initialize UMX API if(SoraUInitUserExtension(.HWTest) printf(Error:fail to find the hwtest driver!n); return -1; / Start the main procedure umx_main(); / Clean UMX extension SoraUCleanUserExtension(); return 0;/ umx_main函数中内容/ 首先,创建一个ARO,然后将ARO的接收通道映射到用户态。PVOID RxBuffer = NULL ;U

10、LONG RxBufferSize = 0 ;SORA_RADIO_RX_STREAM RXStream ;PVOID TxSampleBuffer = NULL ;ULONG TxSampleBufferSize = _M(4) ;void umx_main() HRESULT hr; / Create a ARO hr = SoraURadioStart(TARGET_RADIO); if(FAILED(hr) printf(Fail to start an ARO (%d)n,TARGET_RADIO); return ; / Map Rx channel buffer hr = Sor

11、aURadioMapRxSampleBuf(TARGET_RADIO,&RxBUffer,&RxBufferSize); if(FAILED(hr) printf(Fail to map rx buffer!n); return ; / 获得ARO接收流对象用来访问接收到的样本数据,然后设置合适的无线电射频参数。 hr = SoraURadioAllocRxStream(&RxStream,TARGET_RADIO,(PUCHAR)RxBuffer,RxBufferSize); if(FAILD(hr) printf(Fail to allocate a RX stream!n); goto

12、error_exit(); / configure radio parameters properly ConfigureRadio(); / 分配转存数据缓存区,在信号发送过程中使用,最后调用处理函数。 TxSampleBuffer = SoraUAllocBuffer(TxSampleBufferSize); if(!TxSampleBuffer) printf(Fail to allocate TX buffer!n); goto error_exit(); / call processing function process();/ 出现错误退出时,释放相应资源 error_exit:

13、 /Release virtual Rx stream SoraURadioReleaseRxStream(&RxStream,TARGET_RADIO); /Release Tx sample buffer if(TxSampleBuffer) SoraUReleaseBuffer(TxSampleBuffer); TxSampleBuffer = NULL ; /Unmap Rx channel if(RxBuffer) hr = SoraURadioUnmapRxSampleBuf(TARGET_RADIO,RxBuffer); / Configure函数内的具体内容,需要说明的是,现有

14、sora射频硬件没有自动增益控制功能void Configure() / Set radio carrier frequency /Here we set the carrier frequency to 5.2GHz(channel 40) SoraURadioSetCentralFreq(TARGET_RADIO,5200*1000); / Set frequency offset if needed SoraURadioSetFreqOffset(TARGET_RADIO,0); / Set Tx gain SoraURadioSetTxGain(TARGET_RADIO,0 x1500

15、); / 21dB / Congfig receiving gain SoraURadioSetRxPA(TARGET_RADIO,0 x2000); / 接收机第一级放大器增益 16dB SoraURadioSetRxGain(TARGET_RADIO,0 x1000); / 接收机第二级放大器增益 16dB/ 发送端函数void send(PVOID TxSampleBuf,ULONG TxSampleBufSize) HRESULT hr; ULONG TxID = 0 ; / Transfer the Tx digital samples to the Tx channel hr =

16、SoraURadioTransferEx(TARGET_RADIO,TxSampleBuf,TxSampleBufsize,&TxID); if(SUCCEEDED(hr) / Instruct the radio hardware to send the signal out hr = SoraURadioTx(TARGET_RADIO,TxID); / Release the Tx channel resource hr = SoraURadioTxFree(TARGET_RADIO,TxID); / 接收端函数void receive() SignalBlock sigblk; whil

17、e(1) hr = SoraRadioReadRxStream(&SampleStream,&fReachEnd,sigblk); process_signals(sigblk); if(fReachEnd) break; Sora的两种独特机制数据包反射机制 Sora的数据包反射机制将UMX应用程序整合到Windows的网络协议栈中。HWTest驱动程序将一个虚拟以太网口开放给操作系统,因此,网络程序可以通过通常的网络套接口从这个虚拟网络接口收发报文。HWTest驱动程序会捕获所有的发送报文,并临时存放在一个发送队列(sendQueue)中。UMX应用程序可以通过Sora数据包反射API来获

18、取这些临时存储的报文,这些数据包又被反射到用户态。这样,UMX应用程序可以把这些数据包进行调制,产生相应的数字信号,然后从射频硬件上发射出去。 在接收时,UMX应用程序将数据包从接收信号里解调出来,然后通过Sora数据包反射API将解调的数据报文插入到HWTest驱动的接收队列(recvQueue)中。最后,这些数据包通过虚拟网络接口传递到上层的TCP/IP层,直至网络应用程序的套接口上。数据包反射机制框图:Sora数据包反射API: SoraUEnableGetTxPacket初始化Sora数据包反射API; SoraUGetTxPacket从sendQueue中获取数据包; 使用数据包后,

19、SoraUCompleteTxPacket将与数据包相关联的资源退还给HWTest驱动; SoraUIndicateRxPacket将数据包插入到HWTest驱动的接收队列recvQueue中;Sora独占线程机制 通用的软件系统(例如Windows)的处理时间往往是不确定的,造成这种原因的的是因为CPU是被多种不同的的任务共享。这无法满足无线通信协议对实时性的要求。Sora采用了另一种思路,充分利用现代CPU的多核功能。Sora采用一种内核专用的的方法来保障实时性。内核专用是通过独占线程来实现的。独占线程具有最高的优先级,即Windows操作系统的实时优先级,不能被其他较低优先级抢占。同时,

20、独占线程被固定到一个特定的内核上,因此,它只能使用这一指定的CPU内核。 每一个独占线程包含一个实时任务的程序指针列表和一个调度程序该调度程序以轮询的方式循环调用每一个实时任务。在实际使用中,一个实时任务占用专用内核的时间应该最多不能超过几毫秒。 独占线程流程: (1). SoraUThreadAlloc分配一个独占线程对象; (2). SoraUThreadStart给独占线程分配一个内核并开始执行;Brick编程模型Sora平台上的数字信号处理程序是建立在细粒度的软件模型Brick基础上的。不同的Brick可以相互连接起来构成一个有向无环的数据流图。Brick模型共分为五类,分别为: 信源

21、(source),信宿(Sink),过滤器(filter),分路器(demux),合路器(mux)。一个积木由三部分组成:(1) 端口(Ports):可以定义一个输入端口,一个或多个输出端口。端口描述了积木对于数据的读/写行为,例如读写数据的类型以及每次读写数据的个数。端口由一个二元组来定义:();例如,则表明从该端口一次读取4个复整数类型数据。要连接一个输入端口到一个输出端口上,这两个端口的数据类型必须相同,但是他们的突发长度可以不同。(2) 接口(interfaces):每个积木构件必须实现一个简单的基本接口。通过这个接口,上游的积木可以把数据传送给下游积木。一个积木构件必须支持三种基本接

22、口: 重置(Reset)。重置函数用来重新初始化积木构件。 处理(Process)。处理函数是一个构件的核心函数,它把一个端口缓存队列作为它的调用参数 ,这个队列包括从上游传下来的数据,完成数据处理后,将数据写入到输出端口中,传给下游积木。 清空(Flush)。清空函数用来结束一个数据流。(3) 上下文(context):上下文为整个处理图中的所有积木构件提供了一个共享的全局状态空间。原则上,应该让处理图的上下文尽可能的小。积木编程是通过C+模板类来实现的。具体实例在后面会详细讲述。编译及验证第一步 了解各文件夹内容,如下图 在brick编程过程中,主要修改文件即在umxsdrbrick文件夹

23、内。修改编译后的应用程序,注意路径第二步 修改目录文件。进入SDK根目录,编辑dir_x86文件,添加下图代码.目的是在编译过程中加入umxsdrbrick文件夹。第三步,修改程序 在后面会做两处修改,这里不赘述。第四步,编译 首先找到编译工具,如下图,选择x86 Free Build 。 编译时使用x86 Free Build ,如果使用x64 Free Build编译会提示缺少一个库;使用x86编译器编译的应用程序可以在64位系统上使用,这是SDK本身的的问题。 新搭建的DDK编译环境在编译时可能会出现下面的错误提示解决办法:改变警告级别;如果你遇到了以下错误,且不是代码的问题,则需要改变

24、WDK的警告级别:error C2220: warning treated as error修改方法:bin目录i386mk.inc的MSC_WARNING_LEVEL的值替换为 /W1添加一行,如下:MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) $(COMPILER_WX_SWITCH)MSC_WARNING_LEVEL= /W1你电脑是64位的就是修改ia64mk.inc,修改完成后,Build不会再报error C2220:的错误。Ia64mk.incI386mk.incAmd64mk.inc然后,输入下图命令Enter键继续会出现下图,在命令窗口输入bcz命令,开始编译最后,等待编译完成,如图 修改示例 这里做两处修改。首先修改main函数,只简单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论