TI中文支持网
TI专业的中文技术问题搜集分享网站

C 6000 数据结构 地址对齐

从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对片内数据进行操作。

赞(0)
未经允许不得转载:TI中文支持网 » C 6000 数据结构 地址对齐
分享到: 更多 (0)