完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 一只耳朵怪 于 2018-6-25 10:22 编辑
从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=%dn",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的倍数啊。 感觉编译器应该会自动处理的啊。。 郁闷中 |
|
相关推荐
7个回答
|
|
1. 看起来是大小端(endian)的问题。请问你的PC和DSP是否使用的都是大端或小端?看起来DSP似乎用的是小端?
2. 使用BIOS时,如果需要添加段信息,请在new->other->RTSC wizard->new RTSC platform里添加(会出来关于new platform信息的新窗口,请添加你的仿真平台或EVM版的信息,然后再next,添加段信息) |
|
|
|
hkhwdz 发表于 2018-6-25 00:20 谢谢回复! 是的,PC和DSP都是用的小端模式。关于添加段信息,能详细点儿么。我现在是想让一个数据块,比如pdata这个指针所指向的内容从一个4的整数倍地址开始。便于正确读取。我有试过,用RTSC添加一个数据段,但是不知道怎么关联到我程序中的pdata指针。因为这个程序中已经有现成的*.cfg文件。我是不是还要修改这个文件中关于内存映射那块的程序。怎么弄呢,读了BIOS user guide 但还是不知道怎么操作。 或者有其他方法可以暂时解决这个问题,让程序跑起来的么??也试着在我定义的结构体之前,强行定义了int类型的变量,但是也没用。 |
|
|
|
hanbai795 发表于 2018-6-25 00:36 1. 添加段信息见附件 2.关联cmd文件:确认你的cmd文件出现在这里(一般只要放在工程目录下即可自动关联) 3. 数组N字节对齐:在数组定义之前加上 #pragma DATA_ALIGN(inMat, N) // make the array N byte aligned, N=8,16,.... Int32 inMat[SizeRank]; 如果你只需要4字节对齐,那么定义int或者int *,会自然产生4字节对齐地址 |
|
|
|
谢谢~ 嗯这个问题我现在是定义了 char * 的变量,单字节操作的。可以实现。明天再试试您的方法。 还有几个问题:如果您方便的话,帮我解答一下吧,谢谢了。 1. 我看了下附件里,cmd文件中定义了DDR2的段,这是外部存储器地址吧? 如果我将数据都放在DDR2这样的段里,是不是相当于直接就将数据存放在外部存储器里了,而不是存放在内部缓存。如果可以直接放在外存,这中间的驱动函数,比如DDR2的读写函数,没有使用么?这是怎么实现的?和EDMA的区别? 2.EDMA操作也是同样的问题,通过EDMA将DDR2内的数据搬移到缓存中,就可以将源地址设置为DDR2的地址,然后搬移。这其中,也没有涉及到DDR2 的驱动函数么? |
|
|
|
hanbai795 发表于 2018-6-25 01:04 1. 不需要读写函数。EDMA搬移也不需要驱动。你看到的就像是内存一样,不过效率低些。 2. 补充关于初始化:DDR是需要初始化的,但是一般来说,你load你的out到版子上的时候,gel文件会对DDR进行初始化,所以你感觉不到。在simulator下,不需要初始化就能用 |
|
|
|
hkhwdz 发表于 2018-6-25 01:19 谢谢您的耐心回复。 基本明白了。我也查了下SDRAM的工作机制,是我自己理解有问题。不需要读写函数的。当初始化完成后,就可以读写的。 关于EDMA是怎么实现的,还是不明白。只知道它独立于CPU工作。 举个例子我DDR中存了一幅图片,现在需要对它进行滤波等处理,我应该选择什么样的方式读取呢?是直接将DDR中数据读到内存中,放到指定位置,还是通过EDMA搬移更好点儿? 这里是不是有所谓的效率问题?还有就是这两个速度,谁更快呢?如何衡量呢? |
|
|
|
hanbai795 发表于 2018-6-25 01:29 EDMA搬移的话,启动之后无需CPU的干预,CPU可以做别的。 通常的做法是先启动EDMA把数据搬到片内,同时CPU执行别的任务,等到搬移完成后,再用CPU对片内数据进行操作。 |
|
|
|
只有小组成员才能发言,加入小组>>
354 浏览 1 评论
547 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
793 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
664 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1141 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
90浏览 29评论
345浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
267浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
215浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
70浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 20:43 , Processed in 1.122781 second(s), Total 90, Slave 73 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号