分类:
2008-12-16 11:15:50
本章通过使用DSP/BIOS优化第二章中的hello world实例介绍DSP/BIOS及如何创建、编译、调试和测试使用DSP/BIOS编写的程序。 基本要求:CCS的DSP/BIOS组件,目标板。 实现hello world程序的另一种方法是使用DSP/BIOS API的LOG模块,它能在嵌入式程序中提供基本运行服务。对于实时DSP上的应用而言,API模块是最优的。与诸如put()这样的C库函数调用不同,API无需中止目标板中运行的应用程序就能进行实时分析。此外,API代码比标准C库函数的I/O占用空间少且运行快,根据程序需要可使用一个或多个DSP/BIOS模块。 本章使用DSP/BIOS API修改第二章中的应用程序 (如果要跳过第二章,则须从2.1和2.2节开始)。 在使用DSP/BIOS API的程序中必须创建一个配置文件,它定义了程序中使用的所有DSP/BIOS对象。本节介绍如何创建配置文件。 1. 2. 选择File→New→DSP/BIOS Config,弹出一个含有“c54xx.cdb”和“sd54.cdb”的窗口。 3. 在此窗口中选择与你的系统板相适应的DSP模板,然后点击OK(TMS320C54X DSP/BIOS 用户指南阐述了怎样创建一个用户模板),将出现上面这样一个窗口,点击左边的+和-字符能扩张和收缩列表单,窗口右边显示窗口左边选中对象的属性。 4. 在LOG-Event Log Manager处点击鼠标右键,从弹出菜单中选择Insert LOG, 这时创建一个名为LOG0的LOG对象。 5. 6. 选择File→Save。在弹出窗口中选择你的工作路径(通常是c:\ti\myprojects\hello 1),并将此配置保存为myhello.cdb,实际上创建了下述文件: o myhello.cdb 保存配置设置 o myhellocfg.cmd 连接命令文件 o myhellocfg.s54 汇编语言源文件 o myhellocfg.h54 由myhellocfg.h54包含的汇编语言头文件 回顾上节所建立的配置文件,它实际上包括四个新文件myhello.cdb、myhellocfg.cmd、myhellocfg.s54、myhellocfg.h54。本节介绍如何向工程添加这些文件并删除被取代的文件。 1. 选择Project→Add Files to Project 在弹出窗口的文件类型框中选择配置文件(*.cdb),然后选择myhello.cdb并点击Open。注意此时在Project View中的DSP/BIOS Config文件夹下面包含配置文件myhello.cdb。另外,myhellocfg.s54作为源文件出现在source文件夹中。注意在编译工程文件的过程中,CCS在扫描文件间的依赖关系时自动向工程中添加包含文件(在此添加的是myhellocfg.h54)。 2. 输出文件名必须与.cdb文件名匹配(myhello.out和 myhello.cdb)。选择Project→Options 将出现Build Option窗口,然后选择Linker ,在Output Filename栏中确认输出文件名为myhello.out,点击OK。 3. 4. 点击Yes,则加入新生成的配置文件myhellocfg.cmd并取代hello.cmd。 5. 在Project View中的vectors.asm源文件上点击鼠标右键,然后从弹出菜单中选择Remove from project。DSP/BIOS配置文件将自动定义硬中断矢量。 6. 在RTS.lib库文件处点击鼠标右键将它从project中删除。该库已经由myhellocfg.cmd文件自动包含。 7. 双击程序hello.c打开并编辑该文件,在弹出的代码框中如果显示了汇编指令,则选择View→Mixed Source/ASM可隐藏汇编代码。 8. 源文件中需修改的内容如下。(可以从c:\ti\c5400\tutorial\hello2\hello.c中复制和粘贴)由于puts()和 LOG_printf使用同样的资源,你必须确保使用下面的主函数取代当前存在的主函数。 /* ======== hello.c ======== */ /* DSP/BIOS header files*/ #include #include /* Objects created by the Configuration Tool */ extern LOG_Obj trace; /* ======== main ======== */ Void main() { LOG_printf(&trace, "hello world!"); /* fall into DSP/BIOS idle loop */ return; } 9. 注意源程序中的下述几点: (1)C源程序中包含std.h 和 log.h头文件。所有使用DSP/BIOS API的程序都必须包含头文件std.h 和 log.h。在LOG模块中头文件log.h定义了LOG_Obj的结构并阐述了API的功能。源代码中必须首先包含std.h,而其余模块的顺序并不重要。 (2)源程序中声明了配置文件中创建的LOG对象。 (3)主函数中,通过调用LOG_printf,将LOG对象的地址(&trace)和hello world信息传到LOG_printf。 (4)主函数返回时,程序进入DSP/BIOS空循环,DSP/BIOS在空循环中等待软中断和硬中断信号,第五、六、七章将阐述这些内容。 10. 选择File→Save 或按Ctrl+S保存修改后的源程序。 11. 选择Project→Optins,在弹出窗口中选择Compiler,然后选择Category中的 Symbols,并在define symbols中删除FILEIO, 然后点击OK。 12. 点击工具栏按钮或选择Project→Rebuild All 。 由于使用LOG的程序只写了一行,没有更多的内容需要分析。在第五、六、七章中将用更多的方法分析程序功能。 1. 选择File→Load Program 选取myhello.out并点击open。 2. 选择Debug→Go Main。 3. 选择Tools→DSP/BIOS→Message Log,在CCS 窗口底部出现一个Message Log 窗口。 4. 在Message Log窗口中点击鼠标右键,从弹出的菜单中选择Property Page。 5. 选择trace作为监视对象,然后点击OK。缺省的刷新频率为1秒。(如果要修改刷新频率,可选择Tools→DSP/BIOS→RTA Control Panel。在RTA Control Panel处点击鼠标右键,选择Property Page并选取一个新的刷新频率,点击OK。) 6. 7. 选择Debug→Halt或按 Shift F5暂停程序运行。主函数返回后,程序在DSP/BIOS空循环中等待中断信号,欲了解空循环的更多信息,请参见3.5节。 8. 在Message Log中点击鼠标右键,然后选择Close关闭Message Log。在下一节中将使用Profiler,因此必须关闭Message Log。 9. 选择Tools→RTDX启动RTDX插件,并从下拉的菜单中选取RTDX disable,然后点击鼠标右键并选择Hide。 注意:在某些目标系统中Profiling 和RTDX不能同时使用。
当试图同时使用Profiling和RTDX时将导致错误信息,见上图。 LOG_printf所需的指令周期数,可像前面的puts()一样,利用CCS的功能来测算。 1. 选择File→Reload Program。 2. 选择Profiler→Enable Clock,在Enable Clock旁边可见到√。 3. 在Project View中,双击hello.c文件。 4. 选择View→Mixed Source/ASM,则灰色的汇编指令紧随C源程序。 5. 将光标放在LOG_printf(&trace, "hello world!")行上。 6. 点击工具栏按钮(Toggle Profile-point),则这一行和其下一行的汇编指令变为绿色高亮显示。 7. 向下移动滚动条,把光标放在程序结尾的大括号所在的行上,然后点击工具栏按钮(Toggle Profile-point),你可能会认为在程序的return行上设置了第二个测试点。但是,要注意直到大括号后一直没有相应的汇编语言显示出来。如果在return这一行上设置了测试点,CCS 将在程序运行时自动纠正这一问题。 8. 选择Project→View Statistics。 9. 点击(Run)工具栏按钮或按F5运行程序。 10. 11. 点击工具栏按钮或按Shift F5暂停程序运行。 12. 在进行下一章的工作之前(3.5节结束之后)做下述工作,释放测试时占用的资源。 o 进入Profiler 菜单,撤消Enable Clock前的“√”。 o 在Profiler Statistics 窗口中点击鼠标右键,并从打开的菜单选择Hide o 选取Profiler→Profile-points,然后选择Delete All ,点击OK。 o 进入View菜单,撤消Mixed Source/ASM前的“√”。 o 关闭所有的源文件和配置窗口。 o 选择Project→Close关闭Project 为进一步了解CCS,试作如下工作: o 加载myhello.out 并在LOG_printf行设置断点,选取Debug→Breakpoints并在IDL_F_loop上设置断点。(在弹出对话框的Location栏中键入IDL_F_loop,并点击Add)。 运行程序 在第一个断点处,使用View CPU Registers CPU Registers观察寄存器值。注意:当主函数执行时,INTM=1表明中断非使能。 运行到下一个断点 注意现在INTM=0,表明中断使能。注意在执行程序时将重复遇到该断点。 启动进程和主函数执行完毕后,DSP/BIOS应用程序将进入空循环的后台线程。空循环由IDL 模块管理, 直到程序暂停时才结束工作;它在中断使能有效时循环,且允许响应任一ISR中断信号,能满足实时任务处理的要求。第五、六、七章将进一步阐述ISRs和DSP/BIOS的软中断。 o 在MS-DOS窗口中,键入以下命令行可运行sectti.exe程序。如果安装路径不是c:\ti,则须将路径修改为安装了CCS 的目录路径。 cd c:\ti\c5400\tutorial\hello1 sectti hello.out > hello1.prn cd ..\hello2 sectti hello.out > hello2.prn 比较hello1.prn和 hello2.prn文件可以发现使用stdio.h和DSP/BIOS时存储器段和空间大小的差别。与使用stdio中的puts()函数相比,DSP/BIOS调用LOG_printf时.text段占用的空间小。有关sectti工具的其它信息可参见TMS320C54x DSP/BIOS 用户指南。 进一步学习使用CCS 和DSP/BIOS,请参见CCS中 的在线帮助,也可参见CCS 用户指南和TMS320C54x DSP/BIOS 用户指南。 |