http://tech.ddvip.com/2008/08/121870641354428.html

德州仪器新推出的DSPC6400系列最高运行时钟可以达到1.1GHz,运算能力可以达到8800MIPS.如何充分发挥DSP的这种性能优势,对软件提出了很高的要求.首先为了降低系统成本,就要求将许多以前用硬件实现的功能软件化,原来由多个DSP完成的工作由一块DSP完成,DSP要能够同时完成多个相同或不同的任务而相互之间没有影响.其次为了产品的维护和升级,要求软件尽可能地模块化,使用高级语言如C来编程,有统一的接口API.所有这些新的要求,都需要使用实时操作系统.以往直接将应用程序运行于裸机之上的作法显然已经不再适用了.德州仪器推出的 DSP/BIOS技术正是基于其多年从事DSP研制生产的经验,为开发者量身定做的一个优秀软件平台. 更可贵的是该操作系统是免费的,这为众多的中小用户使用DSP打开了方便之门.

  1 实时操作系统

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

  2 LOG

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

  #include
  /* Header files needed for DSP BIOS */
  #include
  #include
  /* functions */
  void func_printf();
  void func_LOG_printf();
  /* Objects created by the Configuration Tool */
  extern LOG_Obj logTrace;
  /*
  *======== main ========
  */
  void main ()
  {
  return;
  }
  void func_printf(int time)
  {
  printf(″Strart printf demo ″);
  printf(″Current time=%d ″ , time);
  printf(″End printf demo ″);
  return;
  }
  void func_LOG_printf(int time)
  {
  LOG_printf(&logTrace,″Strart LOG_printf demo ″);
  LOG_printf(&logTrace, ″Current time=%d ″  time);
  LOG_printf(&logTrace, ″End LOG_printf demo ″);
  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().这些API对数据的操作功能如表1所示.

  表1 STS模块方法(API)的功能

STS_add(x) STS_set(y) STS_delta(z) STS_reset()
Previous y Z
Count +1 +1 0
Yotal +x +(z-Previous) 0
Max If x>Max,Max=x If z-Previous>Max,

  最大负整数

  Max=z-Previous

  如果要对某一段程序进行分析时,只需在其前后调用STS_set和STS_delta就可以了.如例2使用STS测试程序段执行周期如下:

  /* Header files needed for DSP BIOS */
  #include
  #include
  /* functions */
  void func_load();
  /* Objects created by the Configuration Tool */
  extern STS_Obj stsLoad;
  /*
  * ======== main ========
  */
  void main()
  {
  /* fall into DSP/BIOS idle loop */
  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任务是不可阻塞的.它的运行状态如图1所示.

  所有SWI任务共享一个堆栈,SWI任务只能在程序编制时预先定义好.DSP/BIOS中对任务的动态产生和对阻塞状态的支持是通过TSK模块来实现的.TSK有15个优先级,也是可以抢断的,但是每个TSK任务使用独立的堆栈.TSK任务是通过TSK_create()和TSK_delete()来动态生成和结束的.它的运行状态如图2所示.

  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任务被调度的条件.这些操作的功能如表2所示.

  表2 SWI中Mailbox的操作功能

Mailbox是比特操作 Mailbox是计数操作
总是引起任务调度 SWI_or SWI_inc
仅在Mailbox=0时引起任务调度 SWI_andn SWI_dec

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

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

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

  6 通讯(PIP/SIO/HST)

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

  PIP对象包含一个缓冲队列,与之对应的有两个任务读和写.图3很好地说明了PIP的逻辑关系和操作方式.例5,例6分别是一个PIP对象对应的读任务和写任务的示范程序.

  例5 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);
  /*Code to empty the frame*/
  PIP_free(&pip);
  }
  else{
  LOG_error(″no frames available″);
  /* or you could just return;*/
  }
  }

  例6 PIP对应的写任务:

  extern far PIP_Obj pip;
  writer()
  {
  Uns size;
  Ptr addr;
  if(PIP_getWriterNumFrames(&pip)>0){
  PIP_alloc(&pip);
  addr=PIP_getWriterAddr(&pip);
  size=PIP_getWriterSize(&pip);
  /* fill the frame up to size */
  PIP_put(&pip);
  }
  else{
  LOG_error(″no frames available″);
  /* or you could just return;*/
  }
  }

  由逻辑关系可以看到,通过使用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操作的实质是数据地址的交换.由于没有数据拷贝,其运行效率就很高.SIO的运行逻辑如图4所示.

  7 RTDX

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

  RTDX在主机端可以与任何符合OLE接口的应用程序交换数据.例7是一个使用RTDX在主机和DSP之间进行数据传递的例子.主机端是一个基于VB的小程序.

  例7 DSP程序:

  #include
  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的应用环境,通过一系列的对象模块向开发者提供了一个实用优秀的实时操作系统.它可以帮助用户提高软件的模块化、并行性和维护性等,有利于降低系统成本和缩短开发周期.同时由于它是免费的,可以预计DSP/BIOS将对DSP技术在中国的推广使用起到积极的推动作用.

DSP/BIOS 介绍相关推荐

  1. DSP/BIOS的基本介绍

    DSP/BIOS的基本介绍 DSP/BIOS是一个简易的实时嵌入式操作系统,主要面向实时调度与同步.主机/目标系统通信,以及实时监测等应用,具有实时操作系统的诸多功能,如任务的调度管理.任务间的同步和 ...

  2. 基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案

    随着嵌入式应用的普及,嵌入式操作系统的问题日益引人关注.由于DSP代表了一类重要的嵌入式应用,以DSP为核心的嵌入式操作系统也正在成为人们研究的热点.为了对自己的DSP产品提供软件支持,TI公司发行了 ...

  3. DSP/BIOS详解入门-再回炉

    DSP/BIOS是TI公司特别为其TMS320C6000TM,TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内核,是TI公司的Code ...

  4. DSP/BIOS入门

    转载自 http://blog.chinaunix.net/uid-20620288-id-3379093.html 1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简 ...

  5. DSP/BIOS详解入门

    百度百科DSPBIOS DSP/BIOS是TI公司特别为其TMS320C6000TM,TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内 ...

  6. DSP/BIOS简介

    1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序.DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的 ...

  7. dsp/bios初步了解

    1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序.DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的 ...

  8. DSP/BIOS设计指导书

    DSP/BIOS设计指导书 1 概述 CCS是TI的DSP芯片集成开发环境,v3.2版本中集成了DSP/BIOS v5.21,支持Himalaya TCI6482芯片. 下面对CCS v3.2和DSP ...

  9. DSP/BIOS中的数据类型

    DSP/BIOS API并非像C语言一样直接采用如int或char的数据类型.然而,为了保证与其他处理器的DSP/BIOS API兼容性,DSP/BIOS定义了自己的标准数据类型.下述数据类型在std ...

最新文章

  1. win7安装mysql-5.7.18
  2. 浅谈跨平台框架 Flutter 的优势与结构
  3. 哈尔滨工程大学计算机学院保研政策,哈尔滨工程大学计算机科学与技术学院(专业学位)计算机技术保研夏令营...
  4. PyCharm中批量查找及替换
  5. java读取空格_java 读取文件路径空格和中文的处理
  6. 工信部:手机预装软件下月起须报备审核
  7. 用python做简单的题目_「每日一练」巧用python做小学的数学题
  8. 63. windows php 加载不了 curl
  9. 阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
  10. Markdown 编辑器 Editor.md 图片上传使用
  11. python 词频统计
  12. 骗分技巧————《OI骗分导论》
  13. c++语言“case”,C++ switch case详解
  14. RGB色彩,HSV色彩模式、灰度图,亮度,对比度,饱和度、图像平滑、降噪、锐化、增强
  15. supermap地图展示OD图
  16. UVA 10499 正义的土地
  17. 【高并发】解密导致并发问题的第二个幕后黑手——原子性问题(文末有福利)
  18. java面向对象三大特性之多态---编译时多态和运行时多态详解
  19. 设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。
  20. 计算机网络基础心得体会结尾,学习《计算机网络基础知识》心得体会

热门文章

  1. mcjava盗版联机_使用N2N组建虚拟局域网联机游戏(我的世界 Java版)
  2. 解密PDF文件打开密码
  3. 软件产业向互联网转型正当时
  4. 大型网站技术架构-2. 大型网站架构模式
  5. python爬虫进阶-滑块验证码破解(bilibili)
  6. 大数据之MaxWell
  7. 【设计原则】开闭原则(对扩展开放、对修改关闭)
  8. 设计模式-到底什么是builder模式
  9. 纯css3实现圆环占比图
  10. 学习Mybatis源码