产品中心
Group news
江苏宏丰木业有限公司    您的位置: 首页  >  产品中心  >  正文

可提高软件模块化、并行性和维护性的实时操作系统

2019年11月03日 文章来源:网络整理 热度:56℃ 作者:刘英

德州仪器新推出的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  <stdio.h>

/*  Header  files  needed  for  DSP  BIOS  */

#include  <std.h>

#include  <log.h>

/*  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  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()。这些API对数据的操作功能如表1所示。

可提高软件模块化、并行性和维护性的实时操作系统

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

/*  Header  files  needed  for  DSP  BIOS  */

#include  <sts.h>

#include  <clk.h>

/*  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)

上一篇:基于FPGA的图像采集压缩SOC系统设计与实现


下一篇:基于32位处理器MPC5200B的PCI仲裁器逻辑扩展设计

友情链接
Links
鸿运国际官网_鸿运国际备用网址