DSP/BIOS简介 dsp bios sys bios

1 实时操作系统
  简单地说,实时操作系统与一般意义上的操作系统(如Windows、  Unix等)的主要差别就在于实时操作系统提供了一种机制,使得运行于其上的应用程序都能够满足实时性的要求。  在Windows中常见的沙漏现象(即用户等待现象)在实时系统中是绝对不允许的。因为这可能造成通讯中断,马达损毁等灾难性的结果。  DSP/BIOS是特别针对德州仪器C5000,C6000,C28XX系列的运行于DSP之上的一个实时操作系统。  DSP/BIOS实际上是一个可调用的系统模块API的集合。以下就各个模块分别加以介绍。


2 LOG
  在C语言开发的时候通常需要使用printf()来显示当前状态。但是printf()是非常花费时间的函数、而且不具有实时性。因为DSP需要对显示的数据进行分析,整理成合适的显示格式,并调用输出显示模块。所以在一个实时性要求很高的应用中,对printf()的调用可能会使系统根本无法满足实时要求。在DSP/BIOS中引入了一个相应的函数LOG_printf()。该函数是LOG对象的一个方法(或调用函数〕。LOG对象本质上是一个32bit的整形数,其高低16bit分别代表要显示的两个数据。例1是分别使用printf()和LOG_printf()作比较的示范程序:
  #include  <stdio.h>  
  
  #include  <std.h>
  #include  <log.h>

  
  void  func_printf();
  void  func_LOG_printf();
  
  
  extern  LOG_Obj  logTrace;
  
  void  main  ()
  {
  return;
  }

  void  func_printf(int  time)
  {
  printf(″Strart  printf  demon″); 
  printf(″Current  time=%d  n″  、  time);
  printf(″End  printf  demon″);
  return;
  }

  void  func_LOG_printf(int  time)
  {
  LOG_printf(&logTrace、″Strart  LOG_printf  demon″);
  LOG_printf(&logTrace、    ″Current  time=%d  n″  、  time);
  LOG_printf(&logTrace、  ″End  LOG_printf  demon″);
  return;
  }
  func_printf()和func_LOG_printf()由DSP内时钟控制每100ms周期性地分别调用一次。通过对printf()和LOG_printf()运行时间作比较发现,在C6211运行在150MHz的情况下,printf()需花费4000个周期约26.7μs,LOG_printf()只花费36个周期约0.24μs。printf()比LOG_printf()多开销100倍以上的时间,因此LOG_printf()对于实时地显示一些运行状态是非常有帮助的。而且对于熟悉C语言的开发者来说,LOG_printf()的调用格式几乎与printf()完全一样。

3  STS
  对一个软件进行分析优化时,通常会用到profile的功能。但是在实时运行的DSP的环境中使用profile等效于加入了多个程序断点。  由于现在的DSP通常具有很深的流水线结构来保证DSP的高运算能力,如德州仪器的C6000系列的流水线长度为12级,程序断点需要排空所有已经进入流水线的指令。这样也就破坏了真正的运行环境。同时profile还必须调用输出模块向主机传递时间信息。因此在profile的情况下真正的实时运行环境是没有办法得到保护的。DSP/BIOS针对这种情况引入了一个统计模块STS。STS对象只有4个数据Previous、Count、Total和Max。调用的方法(API)也只有4个,即STS_add()、  STS_set()、  STS_delta()和STS_reset()。如果要对某一段程序进行分析时,只需在其前后调用STS_set和STS_delta就可以了。如例2使用STS测试程序段执行周期如下:
  
  #include  <sts.h>
  #include  <clk.h>

  
  void  func_load();

  
  extern  STS_Obj  stsLoad;

  
  void  main()
  {

  
   return;
  }

  void  func_load()
  {
  STS_set(&stsPrintf、  CLK_gethtime());

  
  ...
  STS_delta(&stsPrintf、  CLK_gethtime());
  }
  func_load()为一个中断服务程序(ISR)。在C6211,150MHz的情况下,仅插入33个周期,约0.22μs。


4  任务调度(HWI/SWI/TSK)
  一个操作系统的核心永远都是任务的调度。在DSP/BIOS中任务的调度是通过HWI、SWI和  TSK  三个模块来实现的。这三个模块分别对应于不同的调度方法。HWI即硬件中断。在  DSP/BIOS中硬件中断主要负责从外部设备中读写数据。由于硬件中断直接与硬件打交道,所以对应的中断服务程序ISR应该尽可能地短小精悍。需要注意的是HWI并不引起任务调度,因此在ISR的入口和出口成对地调用_HWI_enter()和_HWI_exit()这两个宏是必须的。HWI在处理完数据的输入输出后调用SWI_post()来调度相应的软件中断,SWI来完成数据处理工作。SWI是  DSP/BIOS任务调度的核心,共有14个优先级,每个优先级可以有多个任务。SWI任务是抢断式的,即高优先级的任务可以抢断低优先级的任务。但是SWI任务是不可阻塞的。所有SWI任务共享一个堆栈,SWI任务只能在程序编制时预先定义好。DSP/BIOS中对任务的动态产生和对阻塞状态的支持是通过TSK模块来实现的。TSK有15个优先级,也是可以抢断的,但是每个TSK任务使用独立的堆栈。TSK任务是通过TSK_create()和TSK_delete()来动态生成和结束的。

5  同步(SEM/ATM/QUE/MBX)
  多任务系统中多个任务之间的协调同步工作可以通过多种方法来实现。常用方法如信号量、原子量、队列和邮箱等。在DSP/BIOS中对这些方法的支持分别通过模块SEM、ATM、QUE和MBX来实现。由于这些方法的使用与一般的操作系统完全一样,在这里就不再赘述了。仅就最灵活的在SWI中使用Mailbox的方法来加以简单地说明。每个SWI任务都带有一个Mailbox,对它的操作可以是计数型的SWI_inc()、  SWI_dec()  也可以是比特位操作型的  SWI_or()、  SWI_andn()。Mailbox控制SWI任务被调度的条件。

or操作是将Mailbox中的某一位置1,同时引起SWI任务的调度。当一个SWI任务可能由多个事件触发时,使用or操作可以方便地表示出触发的事件。

andn操作是将Mailbox中的某一位清0,如果Mailbox为0,则引起SWI任务的调度。一个SWI任务需要多个条件都满足时才运行的情况下,使用andn操作可以方便地表示出这些条件的状态。

inc和dec操作则更加灵活,用户可以借此实现多种应用。唯一需要注意的是,inc操作总是引起任务调度,而dec操作仅在Mailbox减到0时才引起一次任务调度。

6  通讯(PIP/SIO/HST)
一个系统如何从外部设备中取得数据,向外部设备输出数据,如何在两个任务之间进行数据正常交换是多样灵活的。但是这种多样性也给软件的维护升级以及模块化工作带来许多不利因素。因此在保持多样性的同时,保持接口的一致性对于一个软件来说是非常有帮助的。考虑到DSP大多数是通过某种类型的串行接口如中继线E1、IIS、SPI、同步串行口等与外部设备进行数据交换的,所以在DSP/BIOS中提供了两种非常有用的接口对象PIP和  SIO。
  PIP对象包含一个缓冲队列,与之对应的有两个任务读和写。例3,例4分别是一个PIP对象对应的读任务和写任务的示范程序。

例3  PIP对应的读任务:
  extern  far  PIP_Obj  pip;
  reader()
  {
  Uns  size;
  Ptr  addr;
  if(PIP_getReaderNumFrames(&pip)>0)
  {
  PIP_get(&pip);
  addr=PIP_getReaderAddr(&pip);
  size=PIP_getReaderSize(&pip);

  
  PIP_free(&pip);
  }
  else{
  LOG_error(″no  frames  available″);
  
  }
  }
  例4  PIP对应的写任务:
  extern  far  PIP_Obj  pip;
  writer()
  {
  Uns  size;
  Ptr  addr;
  if(PIP_getWriterNumFrames(&pip)>0){
DSP/BIOS简介 dsp bios sys bios
   PIP_alloc(&pip);
   addr=PIP_getWriterAddr(&pip);
   size=PIP_getWriterSize(&pip);
   
   PIP_put(&pip);
  }
  else{
   LOG_error(″no  frames  available″);
   
  }
  }
  由逻辑关系可以看到,通过使用PIP应用程序可以保持一个简单统一接口而不必关心具体的硬件操作,因此当该软件移植到不同环境中时,至多只需要改写设备驱动程序。使用PIP的一个具体实例就是HST模块。HST模块在主机和DSP之间建立起一条数据链路,该链路就是一个PIP对象。对HST的操作方式与PIP一致。其差别仅仅在于HST在初始化时指向了预定义的DSP上的HPI接口而已。
  SIO:从PIP的逻辑关系可以看出,读写PIP就是一个数据拷贝的过程。这在某些应用中,如实现网络协议TCP/IP时,不是非常有效。因为数据每向上传递一层就需要进行一次数据拷贝,其效率非常差。如果采用SIO来实现就会有很大的改善。SIO的操作只有get()和  put()两种。与PIP不同的是SIO没有自己的缓冲队列。每次get()  或  put()  操作时都会在应用程序和设备驱动程序之间交换缓冲的指针。所以SIO操作的实质是数据地址的交换。由于没有数据拷贝,其运行效率就很高。

7 RTDX
  实时数据交换Real-Time-Data-eXhange是DSP/BIOS提供的一个全新的功能。在很多应用中要求DSP不能够停下来,而需要从主机中实时地读取数据或者向主机实时地输出数据。德州仪器的C5000,C6000系列的DSP都可以通过JTAG接口来实现这个功能。

RTDX在主机端可以与任何符合OLE接口的应用程序交换数据。例5是一个使用RTDX在主机和DSP之间进行数据传递的例子。主机端是一个基于VB的小程序。
  例5  DSP程序:
  #include<rtdx.h>
  RTDX_CreateInputChannel(writeload);
  RTDX_CreateOutputChannel(readload);

  int  main()
  {
  RTDX_enableInput(&writeload);
  RTDX_enableOutput(&readload);
  return;
  }

  void  doExchange()
  {
  if(!RTDX_channelBusy(&writeload)){
  RTDX_readNB(&writeload、&loadVoal、sizeof(load-Val));
  }
  RTDX_write(&readload、&loadVal、sizeof(loadVal));
  }
  使用VB编制的主机端程序
  set  r=CreateObject(“RTDX”)
  status=r.open(“readload”、“R”)
  set  w=CreateObject(“RTDX”)
  status=w.open(“writeload”、“W”)
  status=r.ReadI4(data)
  status=w.WriteI4(value、bufferstate)
  综上所述,DSP/BIOS针对DSP的应用环境,通过一系列的对象模块向开发者提供了一个实用优秀的实时操作系统。它可以帮助用户提高软件的模块化、并行性和维护性等,有利于降低系统成本和缩短开发周期。

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/147292.html

更多阅读

bios怎么恢复出厂设置 bios中英文对照表

bios怎么恢复出厂设置——简介BIOS作为电脑启动时的首要信息读取位置,如果设置不当将导致电脑无法正常引导启动。当电脑出现无法正常启动的故障时,我们可以通过恢复BIOS出厂设置来完成未知错误的修复。下面就来看一下具体的恢复出厂设

进入BIOS的方法 惠普电脑怎么进入bios

进入BIOS的方法——简介对于刚接触计算机的新用户,有时想通过自己来安装系统,就需要通过设置BIOS来实现从光盘或可移动优盘启动。那么该如何操作才能进入BIOS呢?一般情况下,在电脑开机的时候,屏幕上会有提示,告诉你进入BIOS进行设置的方法

华硕笔记本怎么进入bios 华硕笔记本重装系统

华硕笔记本怎么进入bios——简介 BIOS(Basic Input/Output System,基本输入输出系统)全称是ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电脑提供最低级最直接的硬件控制的程序,它是连通软件程序和硬件设备

电脑怎么进入BIOS的方法集合 dell进入bios的方法

电脑怎么进入BIOS的方法集合——简介 现在电脑品牌上百种,每种品牌又有各种类型,所以BIOS的类型也是成百上千,因为BIOS是在DOS下面的,而且现在的BIOS大多数都是以英文为主,BIOS又是整个系统中最神密最难掌握的,所以很多想自已装系统的或想

华硕主板BIOS怎么设置从U盘启动 华硕主板按f几进入u盘

华硕主板BIOS怎么设置从U盘启动——简介现在的新电脑一般都可以按F10(如HP电脑)或FN+F12可弹出启动引导盘选择项。但一些旧电脑尤其是ASUS主板的电脑可能没有这样的选项,还得从BIOS里进去设置才行。华硕主板BIOS怎么设置从U盘启动——

声明:《DSP/BIOS简介 dsp bios sys bios》为网友淡酒無蠻勁分享!如侵犯到您的合法权益请联系我们删除