从pc端发送数据到DSP的程序。定义了数据格式如下
typedef struct baohead//包头
{
int size;
int id;
int recvsize;
}ElemType;
ElemType datahead;
struct recvbuf//包格式
{
ElemType head;//包头
char buf[1024];//存放数据的变量
int bufSize;//存放数据长度的变量
};
struct recvbuf data,*pdata;
PC端VC++ 断点运行,显示了发送数据如下。
我主要测试了包的头文件的这两个参数:Size=0x00010436=66614;id=0x00000001;
DSP端断点运行在变量观察窗口和内存分别查看了接收到的数据
为了方便观察,在CCS内存观察窗内,我选择了Hex 8 bit 查看了内容,跟PC端发送的是一致的。但是在DSP程序中打印了这两个变量值
printf("id=%d\n",pdata->head.id);
printf("size=%d",pdata->head.size);
得到的结果却是:id=65537 size=70691714
也就是说DSp是这样读取数据的,以4字节为单位读取。size=0x0436AB82;id=0x00010001;也就是按照CCS中Hex 32 bit – TI Style这种方式读取的,如下图。
请问我如何操作才能得到想要的结果,也就是Size=0x00010436=66614;id=0x00000001;还有就是CCS变量观察窗口为什么给出了正确的结果,它的取址是单字节取址?
PS:我试了下#pragma DATA_SECTION (pdata,"my_sect")
由于该程序是NDK中helloworld的例程改编的。它使用了BIOS,没有.cmd文件,我试着硬加上了一个cmd文件。
cmd文件内容如下:
MEMORY
{
PAGE 1 : spacename : origin= 0x0020B628,length=0x410
}
SECTIONS
{
.my_sect :{} >spacename PAGE 1}
出现了一个警告:creating aoutput section "my_sect" without a SECTIONS spceification.
最后结果也没有任何变化。 能具体说下,我这样做错在哪儿了么。pdata指针指向的内容并没有出现在指定的0x0020B628 内存中。或者有没有其他方法,能够使数据地址默认是4的倍数啊。 感觉编译器应该会自动处理的啊。。 郁闷中
Hong Lan:
1. 看起来是大小端(endian)的问题。请问你的PC和DSP是否使用的都是大端或小端?看起来DSP似乎用的是小端?
2. 使用BIOS时,如果需要添加段信息,请在new->other->RTSC wizard->new RTSC platform里添加(会出来关于new platform信息的新窗口,请添加你的仿真平台或EVM版的信息,然后再next,添加段信息)
yi gu:
回复 Hong Lan:
谢谢回复! 是的,PC和DSP都是用的小端模式。关于添加段信息,能详细点儿么。我现在是想让一个数据块,比如pdata这个指针所指向的内容从一个4的整数倍地址开始。便于正确读取。我有试过,用RTSC添加一个数据段,但是不知道怎么关联到我程序中的pdata指针。因为这个程序中已经有现成的*.cfg文件。我是不是还要修改这个文件中关于内存映射那块的程序。怎么弄呢,读了BIOS user guide 但还是不知道怎么操作。 或者有其他方法可以暂时解决这个问题,让程序跑起来的么??也试着在我定义的结构体之前,强行定义了int类型的变量,但是也没用。
yi gu:
回复 Hong Lan:
谢谢~ 嗯这个问题我现在是定义了 char * 的变量,单字节操作的。可以实现。明天再试试您的方法。
还有几个问题:如果您方便的话,帮我解答一下吧,谢谢了。
1. 我看了下附件里,cmd文件中定义了DDR2的段,这是外部存储器地址吧? 如果我将数据都放在DDR2这样的段里,是不是相当于直接就将数据存放在外部存储器里了,而不是存放在内部缓存。如果可以直接放在外存,这中间的驱动函数,比如DDR2的读写函数,没有使用么?这是怎么实现的?和EDMA的区别?
2.EDMA操作也是同样的问题,通过EDMA将DDR2内的数据搬移到缓存中,就可以将源地址设置为DDR2的地址,然后搬移。这其中,也没有涉及到DDR2 的驱动函数么?
yi gu:
回复 Hong Lan:
谢谢您的耐心回复。
基本明白了。我也查了下SDRAM的工作机制,是我自己理解有问题。不需要读写函数的。当初始化完成后,就可以读写的。
关于EDMA是怎么实现的,还是不明白。只知道它独立于CPU工作。
举个例子我DDR中存了一幅图片,现在需要对它进行滤波等处理,我应该选择什么样的方式读取呢?是直接将DDR中数据读到内存中,放到指定位置,还是通过EDMA搬移更好点儿? 这里是不是有所谓的效率问题?还有就是这两个速度,谁更快呢?如何衡量呢?
Hong Lan:
回复 yi gu:
EDMA搬移的话,启动之后无需CPU的干预,CPU可以做别的。
通常的做法是先启动EDMA把数据搬到片内,同时CPU执行别的任务,等到搬移完成后,再用CPU对片内数据进行操作。