DSP

DSP/BIOS简介

2019-07-13 12:07发布

4.4 DSP/BIOS的功能

4.4.1DSP/BIOS简介

DSP/BIOS是一个实时操作系统内核。主要应用在需要实时调度和同步的场合。此外,通过使用虚拟仪表,它还可以实现主机与目标机的信息交换。DSP/BIOS提供了可抢占线程,具备硬件抽象和实时分析等功能。
DSP/BIOS由一组可拆卸的组件构成。应用时只需将必需的组建加到工程中即可。DSP/BIOS配置工具允许通过屏蔽去掉不需要的DSP/BIOS特性来优化代码体积和执行速度。
在软件开发阶段,DSP/BIOS为实时应用提供底层软件,从而简化实时应用的系统软件设计,节约开发时间。更为重要的是,DSP/BIOS的数据获取(Data Capture)、统计(Statistics)和事件记录功能(Event Logging)在软件调试阶段与主机CCS内的分析工具BIOScope配合,可以完成对应用程序的实时探测(Probe)、跟踪(Trace)、和监控(Monitor),与RTDX技术和CCS可视化工具相配合,除了可以直接实时显示原始数据(二维波信号或三维图像)外,还可以对原始数据进行处理,进行数据的实时FFT频谱分析、星座图和眼图处理等。
DSP/BIOS包括如下工具和功能:
(1)DSP/BIOS 配置工具。程序开发者可以利用该工具建立和配置DSP/BIOS目标。该工具还可以用来配置存储器、线程优先级和中断处理函数等。
(2)DSP/BIOS 实时分析工具。该工具用来测试程序的实时性。
(3)DSP/BIOS API 函数。应用程序可以调用超过150个DSP/BIOS API 函数。

4.4.2一个简单的DSP/BIOS实例

本节通过一个简单的例子来介绍如何使用DSP/BIOS创建、生成、调试和测试程序。该实例就是常用的显示“hello world”程序。在这里没有使用标准C输出函数而是使用DSP/BIOS功能。利用CCS2的剖析特性可以比较标准输入函数和利用DSP/BIOS函数执行的性能。值得注意的是,开发DSP/BIOS应用程序不仅要有Simulator(软件调试仿真),还需要使用Emulator(硬件仿真)和DSP/BIOS插件(安装时装入)。
1.创建一个配置文件
为使用DSP/BIOS的API函数,一个程序必须有一个配置文件用来定义程序所需的DSP/BIOS对象。
(1)在C: imyprojects目录下新建一个新文件夹HelloBios
(2)将文加夹C: i utorialsim54xxhello1下的全部文件复制到新建立的文件夹HelloBios中。
(3)运行CCS,并打开C: imyprojectsHelloBios下的hello.pjt
(4)CCS会弹出如图所示的对话框,提示没有找到库文件,这是因为工程被移动了。单击Browse按钮,在C: ic5400cgtoolslib找到rts.lib库文件。


(5)单击hello.pjt、Libraries和Source旁边的“+”号,展开工程视图。
(6)双击hello.c程序,将其打开,可以看出本程序通过puts("hello world! ")函数输出hello world!。
(7)编译、下载和运行程序,输出“hello world!”。下面修改程序,使用DSP/BIOS输出“hello world!”。
#include
#include "hello.h"
#define BUFSIZE 30
struct PARMS str =
{
2934,
9432,
213,
9432,
&str
};
/*
* ======== main ========
*/
void main()
{
#ifdef FILEIO
int i;
char scanStr[BUFSIZE];
char fileStr[BUFSIZE];
size_t readSize;
FILE *fptr;
#endif
/* write a string to stdout */
puts("hello world! ");
#ifdef FILEIO
/* clear char arrays */
for (i = 0; i < BUFSIZE; i++) {
scanStr[i] = 0 /* deliberate syntax error */
fileStr[i] = 0;
}
/* read a string from stdin */
scanf("%s", scanStr);
/* open a file on the host and write char array */
fptr = fopen("file.txt", "w");
fprintf(fptr, "%s", scanStr);
fclose(fptr);
/* open a file on the host and read char array */
fptr = fopen("file.txt", "r");
fseek(fptr, 0L, SEEK_SET);
readSize = fread(fileStr, sizeof(char), BUFSIZE, fptr);
printf("Read a %d byte char array: %s ", readSize, fileStr);
fclose(fptr);
#endif
}
(8)执行菜单命令FileNewDSP/BIOS Configuration。
(9)选择与您的DSP仿真器相对应的模板并单击OK按钮确认。此时将弹出一个新窗口。窗口左半部分为DSP/BIOS模块及对象名,右半部分为模块和对象的属性。
(10)右键单击LOG-Event Log Manager,在弹出菜单中选择Insert Log,此时创建一个被成为LOG0的LOG对象。
(11)右键单击LOG0对象,在弹出菜单中选择Rename,对象更名为trace。
(12)将配置文件存为myhello.cbd,存盘到C: imyprojectsHelloBios中,此时将产生以下文件:
①myhello.cdb 配置文件,保存配置设置。
②myhellocfg.cmd:链接命令文件。
③myhellocfg.s54:汇编语言源文件。
④myhellocfg.h54:myhellocfg.s54包含的头文件
⑤myhellocfg.h:DSP/BIOS模块头文件。
⑥myhellocfg_c.c:CSL结构体和设置代码。
2.将DSP/BIOS添加到工程中
下面将刚才存盘时生成的文件添加到工程文件中。
(1)执行菜单命令ProjectAdd Files to Project,将myhello.cbd加入,此时工程视图中将添加一个名为DSP/BIOS Config的目录,myhello.cbd被列在该目录下。
(2)链接输出的文件名必须与.cdb文件名一样,在Project Build Options的Linker栏中将输出文件名修改为myhello.out。
(3)执行菜单命令ProjectAdd Files to Project,将myhellocfg.cmd加入CCS中。由于工程中只能有一个链接命令文件,因此产生如图所示的警告信息。


(4)单击Yes按钮,用myhellocfg.cmd替换原来的hello.cmd命令文件。
(5)在Project视图中移去Vector.asm,这是因为硬件中断矢量已在DSP/BIOS配置中自动定义。
(6)移去rts.lib文件,因为此运行支持库也已在myhellocfg.cmd中指定,链接时将自动加入。
(7)将hello.c文件内容修改为以下代码。LOG_printf和put函数占用相同的资源。
#include
#include
#include "hellocfg.h"
/*
* ======== main ========
*/
Void main()
{
LOG_printf(&trace, "hello world!");
/* fall into DSP/BIOS idle loop */
return;
}
在以上程序代码中:
①程序首先包含了std.h和log.h两个头文件。所有使用DSP/BIOS API的程序必须包含std.h头文件。此外还应包括该模块使用的头文件,本例中的LOG模块头文件为log.h。在log.h中定义了LOG_Obj结构,并在LOG模块中声明API操作。在头文件中,std.h必须放在其他文件前面,其余模块的先后次序则并不重要。
②程序中使用关键字extern,声明在配置文件中创建的LOG对象。
③主函数调用LOG_pritf函数并将LOG对象&trace和hello world信息作为参数传给主函数。
④主函数返回,程序将进入DSP/BIOS等待循环状态,等待软件和硬件中断发生。
(8)保存hello.c。
(9)执行菜单命令ProjectBuild Option,直接将Compiler栏的命令行参数-d FILEIO删除。
(10)重新编译程序。
3.用CCS测试
由于程序只有一行,因此没有必要分析程序。下面对程序进行测试。
(1)执行菜单命令File Load Program,加载myhello.out。
(2)执行菜单命令Debug Go main,编辑窗口显示hello.c文件内容且main函数的第一行被高亮显示,表明程序执行到此后暂停。
(3)执行菜单命令DSP/BIOSMessage Log,此时将在CCS窗口下方出现Message Log区域。
(4)在Log Name栏选择trace作为要观察的LOG名。
(5)运行程序将在Message Log区域出现“hello world!”信息。
(6)在Message Log区域按右键并选择Close,为下面使用剖切(Profiler)作准备。
4.分析DSP/BIOS代码执行时间
下面使用剖切(Profiler)获得LOG _printf的执行时间。
(1)执行菜单命令FileReload Program,重新加载程序。
(2)执行菜单命令Profiler Enable Clock,使能时钟
(3)双击hello.c,查看源代码
(4)执行菜单命令ViewMax Source/ASM ,同时显示C及相应汇编代码。
(5)将光标放在LOG_printf(&trace, "hello world!");行。
(6)在Project工具栏上的Toggle Profile Point图标,设置剖切点。
(7)将光标移至程序最后一行花括号处,并设置第二个剖切点。虽然return是程序的最后一条语句,但不能将剖切点放在此行,因为此行不包含等效汇编代码。如果将剖切点放在此行,则CCS运行时自动纠正此错误。
(8)执行菜单命令ProfilerStart New Session,弹出Profile Session Name窗口,取默认名字,点击OK,出现Profile Statistics窗口。
(9)运行程序。
(10)可以看到第二个剖切点的指令周期约为58,即为执行LOG_printf的时间。调用LOG_printf比调用C中的puts函数更为有效,这是因为字符格式串格式是在主机上而不是象puts函数那样在目标DSP上处理。使用LOG_printf函数监视系统状态对程序的实时运行影响比使用puts函数小得多。
(11)停止程序运行。
(12)执行以下操作以释放被Profile任务占用的资源。
① 执行菜单命令Profiler Enable Clock,禁止时钟。
② 关闭Profile Statistics窗口。
③ 执行菜单命令Profiler profile points删除所有剖切点。
④ 执行菜单命令View Mixed Source/ASM,取消C与汇编的混合显示。
⑤ 关闭所有源文件和配置窗口
⑥ 执行菜单命令ProjectClose,关闭工程。
注意:必须将I/O口脱开,数据才避免丢失。