打印

我像几位版主请教个51到DSP程序的移植问题。

[复制链接]
3329|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoyu9632|  楼主 | 2010-8-19 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个问题已经困扰我好久,但论坛上发帖鲜有人回答,而在google也搜索不到相关经验,难道诸位兄弟从来没有遇到过类似问题?希望版主能回答小弟的提问,在线等待。问题如下:
我查阅了多种DSP,发现DSP只能进行16bit的操作,而不能进行8bit字节的操作,所以如果想将51单片机上的程序移植到DSP环境中,就会涉及到数据结构不匹配的问题,就像我们的FAT32文件系统中DBR/DPT等数据结构有字节的定义,有字和双字的定义。这些数据结构的定义已经被完全固定。譬如我们读一个sector到DSP中的ram,那么就由512个字节变为了DSP中的256个字,很显然原本的数据结构在DSP中已经无法在匹配。就像下面的一个结构体:
typedef _peripheral_struct{
              BYTE  bdata1;
              WORD  wdata1;
              BYTE   bdata2;
}peripheral_struct;
当我从该外设读到DSP的时候,因为DSP是按字操作的,所以该数据结构存储在DSP中就变成了两个字。上面数据结构中的WORD就被拆分,高字节和bdata1组成一个字,低字节则和bdata2组成一个字。如果我想在DSP定义同样的一个结构体,很显然得不到我想要的数值。
同样的道理因为DSP只能进行WORD操作的原因,所以在从8bit的外设读进来的数据在执行memcpy和memcmp等操作的时候也会遇到问题。

相关帖子

沙发
红尘有约| | 2010-8-19 18:21 | 只看该作者
其实就是个数据格式的转换问题
在单位上网不方便
回去看看找个转换的程序 其实很简单的

使用特权

评论回复
板凳
xiaoyu9632|  楼主 | 2010-8-19 18:32 | 只看该作者
恩,这确实是个数据格式的转换问题,不过我想请教各位大虾的是在这些转换的方式中哪个是最好最方便的。譬如以下几个方法:
1、读512个字节数据进入DSP ram,然后写个函数根据数据结构的定义拆解成想要的新的数据结构。此法再针对不同的数据结构的时候很难做到灵活处理。
2、采用位段的方式定义,遇到跨界的字或者数组定义就拆解成相应的字节形式。这样可以节约空间并做到和原数据结构一一对应,缺点就是譬如MP3的ID3V1信息等歌曲名,作者信息等都是很大的数组,那么拆解开来又未免繁琐。而且程序每次再调用这些拆解开来的位段变量的时候需要进行组合成新的变量值。
3、同方法2,但再定义一个新的结构体,将位段定义的结构体一一映射到新的结构体的变量,这样上层一如既往的操作,像可以操作字节一样。

我就想到这些方法,期待红尘兄的方法。

使用特权

评论回复
地板
aresc| | 2010-8-20 10:45 | 只看该作者
可以看一下DSP的C编译器是否支持修改内存对齐方式。类似标准C里的#pragma pack来修改编译器的内存对齐方式。如果不支持#pragma pack,估计没有什么简单的办法,只能修改所有相关的这种数据结构。

关于#pragma的用法你可以参考一下附件中的第67页,也可以google一下。

C语言深度解剖.pdf

897.89 KB

使用特权

评论回复
5
aresc| | 2010-8-20 10:46 | 只看该作者
这个版面有版主的吗?好像从没见过,呵呵。

使用特权

评论回复
6
xiaoyu9632|  楼主 | 2010-8-20 14:58 | 只看该作者
本帖最后由 xiaoyu9632 于 2010-8-20 15:03 编辑

呵呵多谢楼上兄弟,我看看你发的这个文档。不过DSP的地址加1在物理结构上就是指向的下一个字的首地址,这方面估计很难改变。

使用特权

评论回复
7
ar_dong| | 2010-8-23 09:34 | 只看该作者
结构体在不同机器,编译器上差别很大
移植起来的确困难
有时候同一个结构体在不同系统上占据字节数都不一样

使用特权

评论回复
8
xiaoyu9632|  楼主 | 2010-8-24 21:34 | 只看该作者
楼上兄弟说的在理,其实这个还是取决于芯片本身是否支持字节的操作,只要芯片本身支持,那么都可以很方便的实现的。仅多就是对齐的方式和类型的定义有所变化而已。

使用特权

评论回复
9
tjsheep| | 2010-8-25 13:53 | 只看该作者
谁说没版主的,偶来啦……
这个问题我遇到过,联系过TI,我当时是发现:移植别的程序到240x,在对8bit char做左移时候,由于原来的char是8bit,移位后,高位溢出,比如0xf0<<1,移位后得到0xe0,没有问题,但是在240x内部,直接都按16it数据操作,那么0xf0<<1后变成0x1e0.就不对了。
后来只能全文搜索,在所有左移操作时候,都加上&0xff。

这个我也不知道好办法……

使用特权

评论回复
10
xiaoyu9632|  楼主 | 2010-8-30 18:17 | 只看该作者
呵呵不好意思啊,等了版主好多天,这几天忙却没登录成21IC,呵呵。从8位机到16bit的dsp移植会有很多问题,譬如版主刚刚提到的8bit左移问题。还有我标题上所提出的问题。还有涉及到的mem拷贝和cmpare的问题。最后如果直接操作外设还会涉及16bit到8bit转换的问题。版主有时间的话我请教下你使用DSP的心得啊。

使用特权

评论回复
11
tjsheep| | 2010-9-3 12:38 | 只看该作者
没问题,共同进步嘛

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:漂泊的小船

23

主题

159

帖子

0

粉丝