开发环境:DSP6678开发板+CCS5.5+win7。
因为项目需要把81M的数据放入DDR3中处理,所以第一步就是如何加载数据。DSP6678识别的数据类型是dat、bin、raw、yuv。
加载数据有三种方式:
第一种是在debug模式下,tool → load memory。然后弹出如下对话框:File:即添加你要加载的数据的文件路径,注意路径不能有中文。下面的对话框里最后一句意思是:你是否利用文件头信息进行数据加载地址和大小的设定。可以不用理会(如果你的头文件信息配置的正确可以直接利用,此处我是没有用,我是在下面进行直接配置)。点击next
开始地址:即你想把数据存入DSP内存的位置,我是把数据存到DDR3的起始位置(0x80000000,这个地址根据你DSP的实际地址设置),长度即你想加载多少个数据到DSP内存中,我是加载100个数据(每个数据是四个字节大小)到DDR3中。然后点击finish。
下面是DSP识别的.dat的数据格式:第一行第一个数据是个魔数,必须是1651你可以认为这个是DSP识别.dat格式的标志数。
第二个数据1是代表数据格式是十六进制整型 “2”(十进制整型),“3”(十进制长整型),“4”(十进制浮点型)。
第三个数据80000000是加载到DSP内存中的地址。
第四个数据1代表数据 “0”(程序)。
第五个数据100是加载数据的长度。
下面是要加载的数据内容。第一行数据代表的是.dat文件的头信息。注意第一行数据是自己手动加载的,因为这些内容我是在记事本中编辑的,然后保存成.dat格式。
查看是否成功加载数据:view → load memory 可以看到数据成功加载了。在此过程遇到了问题因为加载到DDR3是我自己指定的地址,而我又是在裸机下测试程序,所以DDR3模块没有使能,导致数据无法成功加载,弄了好久才发现这个问题,如果你是自己指定的地址,首先你一定要保证你指定的内存单元模块被使能了。或者你是在SYSBIOS系统下加载数据就不会存在模块未使能情况。我后来是使用了DSP6678.get文件,我是买的创龙开发板,此文件中有各个模式使能配置。
第二种是你把要加载的数据存到一个数组中,此方法适合小数据。
在主源文件中加入如下语句:
#pragma DATA_SECTION(inp_buffer,“my_sect”)// 把inp_buffer数组放到my_sect段中
unsigned char inp_buffer[100];//定义一个inp_buffer数组,
然后在dsp的.cmd文件中把my_sect放到你想放到的数据内存单元(如果你想指定具体位置你要会配置.cmd)。在.cmd文件SECTOR内加入:
my_sect > DDR3 //是把inp_buffer放到DDR3内存中(我的DDR3对应的是内存0x80000000)。注意此次处my_sect > DDR3前面没有点,不是.my_sect > DDR3
在debug模式下设置个断点,断点可以设置在你定义这个数组之后和你使用这个数组之前的某个位置。然后在“breakpoints ”窗口中点击左键,选择“Breakpoint Properties”选项,然后进行如下配置。也可以不加#pragma DATA_SECTION(inp_buffer,“my_sect”)和my_sect > DDR3语句,这样系统会自动给inp_buffer数组分配地址。如果你自己指定了inp_buffer的存储地址,要保证此地址是被使能的,就是对你使用的内存进行配置。系统自动分配的数组内存地址则不用担心是否使能。
数据被成功加载到inp_buffer中。
第三种加载数据的方式:
#include
void main()
{
int tmp=0;
int i=0;
unsigned char tmp;
FILE *file_test;
fie_test = fopen("c:\\input.dat", "r");此处注意一定是\\不然c语言认为转意字符\
if (file_test == NULL)//打开文件失败则退出!
{
printf(“打开文件失败!程序退出!”);
exit(-1);
}
for (i=0; i<100; i++)//从文件中读取100个数据到inp_buffer数组中
{
if(fscanf(file_test, "%x", &tmp)!= EOF)
{
inp_buffer[i] = tmp;
}
}
fclose(file_test);//文件操作,关闭文件
return;
}