CCS(Code Composer Studio)是一个完整的DSP集成开发环境,其不仅集成了常规的开发工具如源程序编辑器、代码生成工具(编译、链接器)以及调试环境外,还提供了DSP/BIOS开发工具。DSP/BIOS是一个简易的嵌入式操作系统,其可以大大方便用户编写多任务应用程序。从今天开始,我会结合个人在项目中对DSP/BIOS的使用,将全部或者部分模块的说明、使用及关键技术与大家分享。
在用CCS开发及调试项目时,总是会需要当程序运行到某一位置或者当某一错误出现时时打印一段消息给开发者,以便于其调试及排错。DSP/BIOSD提供的强大的LOG模块可以很好的帮助开发者完成这些工作,以下是LOG模块的介绍及本人在使用过程中的注意事项。
一、LOG模块概述
目标程序执行时,可以使用LOG模块中的事件日志来记录实时的事件。我们可以使用系统日志,也可以创建用户自定义的日志。如果日志类型是循环的,那么缓存区始终保存的是最后一次记录的信息。如果日志类型是固定的,那么缓存区始终保存了第一次记录的信息。LOG模块的系统日志存储与系统事件有关的消息,这些系统消息应该是我们在TRC跟踪模块中激活了的事件。
为了减少运行时间,日志数据的格式化处理总是在主机上完成。也就是说,由运行CCS的主机而不是DSP目标系统来处理这些日志数据,理解这点很重要。我们通常使用LOG_printf函数来替代标准C语言中的printf函数,以便更快的在CCS中显示需要打印的信息。
日志缓存区是在数据存储器中一段固定大小的存储空间。在日志缓存区里,一个消息占用4个字的存储空间。第一个字用来存储序号,这些序号控制事件日志用正确的顺序显示日志。剩下的3个字记录数据,它们是调用API函数时写进日志的。
二、LOG模块配置
打开DSP/BIOS配置文件,然后展开“Instrumentation”选项,LOG - Event Log Manager菜单下:“LOG_system”对象是系统创建该配置文件时自动添加的,用于系统事件记录;“LOG_msg”是用户自定义。鼠标右键单击该对象名称,在弹出的菜单中选择“Properties”激活属性窗口。
comment:添加一段注解来说明该LOG对象。
bufseg:选择日志缓冲区的存储段的名称。
buflen:说明日志缓冲区的大小(以字为单位)。
logtype:说明日志类型,循环或者固定。在缓冲区内,原有的循环类型的日志可以被新的事件覆盖,但是固定类型的日志不能被覆盖。因此,当你的日志消息可以正常显示但不更新时,请设置日志类型。
fixed(固定):只存储其最先接收的信息,当消息缓冲区满时就会拒绝接收新的信息。
circular(循环):当消息缓冲区满时,新日志会自动覆盖原有的日志。
datatype:如使用LOG_printf函数来打印输出日志信息时,请选择“printf”类型。如使用LOG_event函数记录日志信息,请选择“raw data”。
format:当datatype选择“raw data”即原始数据作为数据类型,那么就要写一段“printf风格”的格式串。
三、LOG模块API函数说明
1、LOG_disable:关闭指定对象的日志记录功能,此时日志缓冲区的内容将不会被更新。
2、LOG_enable:允许日志记录事件。DSP/BIOS默认日志记录功能为打开状态。
3、LOG_error:将一个事件、数据或者出错信息按指定的格式串写入系统日志。
4、LOG_event:将一个为格式化的事件消息吸入日志中。
5、LOG_message:功能及用法与LOG_error相同,只是它要受跟踪管理模块的影响。
6、LOG_printf:在指定的LOG窗口中显示消息,等效于标准C的printf()函数。
7、LOG_reset:复位日志缓冲区。
1.DSP/BIOS应用程序调试(2009.10.20)
在CCS2.0 的emulator写dsp/bios 的程序,编译链接无错误,而点击LOAD Program下载xxx.out完成时弹出如下对话框:
RTDX target application does not match emulation protocol!
Loaded program was created with an rtdx library which does not match the target device
这将导致RTDX(实时数据交换)不能使用
分析:
RTXD可以在DSP/BIOS中使用,也可以脱离DSP/BIOS使用;目前CCS Simulator不支持RTDX,故RTDX必须在Emulator下使用,即还需要硬件仿真器和DSP目标板。
故这是由于下载BIOS/DSP程序时RTDX设置错误导致的;
问题解决如下:
把DSP/BIOS配置窗口中的input/output-->RTDX -real-Time Exchange settings的RTDX mode 改为JTAG(原来是simulator),重新编译后LOAD,上述警告消除,可以在模拟的情况下进行BIOS调试了。
PS:虽然simulator能编译运行DSP/BIOS程序,并能提供实时查询程序运行情况(主要是CPU负荷,时序,日志以及线程等)。但实际开发DSP/BIOS应用程序时为了真实的了解目标板的各种信息,仅有Simulator(软件仿真器)是不行的,还需要使用Emulator(硬件仿真器)和DSP/BIOS插件(安装时已装入)。
2.RTDX应用程序调试(10.22)
RTDX测试DSP Target传输数据到PC机:
a)创建工程,编辑源代码(.c/。asm),加入头文件(.h),库文件(.lib)以及链接命令文件(.cmd)
b)添加修改具有实时数据传输的RTDX语句
包括:#include ; RTDX头文件(rtdx.h)
RTDX_CreateOutputChannel( ochan ); 定义一个全局的PC机数据输出通道,通道名可以任取
TARGET——INITIALIZE(); 初始化DSP目标系统;
RTDX_enableOutput( &ochan ); 使能输出通道写数据;
status=RTDX_write( &ochan,&data,sizeof(data) ); 传送数据至PC;
RTDX_disableOutput( &ochan ); 禁止输出通道传输数据。
c)进行数据处理,测试应用程序
编译链接完成后载入.out文件。在TOOLS-RTDX-Configration中设置RTDX使能,运行debug-run。
出现问题:下载可执行文件时提示
“Data verification failed at address 0x(某地址)Please verify target memory and memory map.”
按跳过提示下载完成后messages栏提示:
Can't Set Breakpoint: Error 0x00000008/-1076 Error during: Break Point, Cannot set/verify breakpoint at 0x80007958
Breakpoint Manager: An error was encountered attempting to set a breakpoint used
for end of program detection.
Can't Set Breakpoint: Error 0x00000008/-1076 Error during: Break Point, Cannot set/verify breakpoint at 0x800081B4
分析:根据CMD文件确认你的地址分配是否在DSP可分配的RAM中;如果给程序分配的地址不在片内的RAM段肯定是会出错的。可能CMD地址空间实际上不属于RAM映射地址范畴,导致不能正常读写。
另外如果DSP片内有程序正在运行,在下载新程序的时候也会出错。出现这种情况,可以在DSP启动前与CCS进行连接。
解决:更改cmd文件中的地址分配使之与OPTION中的Memory Map映射地址空间一致。
3.DSP硬件仿真环境问题汇总
a)无论是在硬件仿真环境还是软件仿真环境中都无法创建DSP项目,可能是安装时在以前安装过CCS的软件,导致冲突;链接文件.dll未注册,或者与系统文件不兼容,解决方法:建议备份文件后重装C盘
b)打开STEP后,无法初始化硬件仿真器
可能的原因是
CCS STEP中的硬件配置USB驱动安装或者I/O口出现错误(如1仿真器连接是否正常? 2仿真器的I/O设置是否正确? 3XDS仿真器的电源及仿真头是否正确? 4目标系统型号是否正确? 5仿真器是否正常?);
USB驱动程序未安装(从“我的电脑-管理”中可以查到是否安装成功驱动)
c)关于gel文件,memory map一致性问题
memory map的作用
1. 内存映射以页面为单位,将文件内容映射到内存中。
2. 使用内存映射可以创建内存映射文件。内存映射文件的优点是我们不需要调用 read 、write 之类的I/O函数,只需用从内存映射区取、存数据,实际的 I/O 操作是由内核执行的,可以简化代码。
3. 使用内存映射可以实现进程间共享内存。
选择有效的存储器空间映射关系
设计原则:CCS下的存储器空间设置应该与目标板的硬件实际配置一致,没有的存储器不要有效。这样便于调试,CCS会发现你调入程序时或程序运行时,是否访问了无效地址。
配置存储器空间映射的方法:
1)在GEL文件中设置;
2)在Option菜单下,选择Memory Map选项,根据你的硬件设置。注意一定要将Enable Memory Mapping置为使能。
常出现的相关情形:
出现以上情况均是由于内存单元设置不一致导致的。前图是由于点击option-memory map-Enable Memory Mapping项,CCS虽然使能了“Enable Memory Mapping”选项,但是初始化配置错误或者未作更改;后者通常是由于gel文件中设置分配的内存空间与存储器无法形成一一映射导致无法实际访问虚拟空间。
解决方法:更改gel文件重新合理分配内存单元。
OUT文件加载时提示“Data verification failed...”
Link的CMD文件分配的地址同GEL或设置的有效地址空间不符。中断向量定位处或其它代码、数据段定位处,没有RAM,无法加载OUT文件。
解决方法: 1)调整Link的CMD文件,使得定位段处有RAM。
2)调整存储器设置,使得RAM区有效。
引申:
补充概念:
cmd文件
用于DSP代码的定位。由于DSP的编译器的编译结果是未定位的,DSP没有操作系统来定位执行代码,每个客户设计的DSP系统的配置也不尽相同,因此需要用户自己定义代码的安装位置。
cmd文件由3部分组成:
1)输入/输出定义:.obj文件:链接器要链接的目标文件;.lib文件:链接器要链接的库文件;.map文件:链接器生成的交叉索引文件;.out文件:链接器生成的可执行代码;链接器选项
2)MEMORY命令:描述系统实际的硬件资源
3)SECTIONS命令:描述“段”如何定位
什么是CSL?
1,用于配置、控制和管理DSP片上外设
2,已为C6000和C5000系列DSP设计了各自的CSL库
3,CSL库函数大多数是用C语言编写的,并已对代码的大小和速度进行了优化
4,CSL库是可裁剪的:即只有被使用的CSL模块才会包含进应用程序中
5,CSL库是可扩展的:每个片上外设的API相互独立,增加新的API,对其他片上外设没有影响
为什么要设计CSL?
1,DSP片上外设种类及其应用日趋复杂
2,提供一组标准的方法用于访问和控制片上外设
3,免除用户编写配置和控制片上外设所必需的定义和代码
CSL的特点
1,片上外设编程的标准协议:定义一组标准的APIs:函数、数据类型、宏;
2,对硬件进行抽象,提取符号化的片上外设描述:定义一组宏,用于访问和建立寄存器及其域值
3,基本的资源管理:对多资源的片上外设进行管理;
4,已集成到DSP/BIOS中:通过图形用户接口GUI对CSL进行配置;
5,使片上外设容易使用:缩短开发时间,增加可移植.
boot loader
DSP的速度尽快,EPROM或flash的速度较慢,而DSP片内的RAM很快,片外的RAM也较快。为了使DSP充分发挥它的能力,必须将程序代码放在RAM中运行。为了方便的将代码从ROM中搬到RAM中,在不带flash的DSP中,TI在出厂时固化了一段程序,在上电后完成从ROM或外设将代码搬到用户指定的RAM中。此段程序称为“boot loader”。
初始化
DSP在RESET后,许多的寄存器的初值一般同用户的要求不一致,例如:等待寄存器,SP,中断定位寄存器等,需要通过初始化程序设置为用户要求的数值。初始化程序的主要作用: 1)设置寄存器初值。 2)建立中断向量表。 3)外围部件初始化。