jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
阅读:2094回复:20

jec017,guoxh9进来帮俺回答一个dsp5510的问题,多谢

楼主#
更多 发布于:2004-08-13 10:21
我用TMS320vc5510的DSK,为什么我写的程序不能用大内存模式(-ml)编译呢?我在编译选项里选中大内存模式就出现如下错误:
error: linking files for incompatible targets
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-13 10:35
搞定了,等有了问题再问。 :D
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-13 10:43
把怎么搞定的发上来,大家学学!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-13 11:16
把用的.lib文件换换就行了。
新的问题,是关于指针操作的:
我定义一个指针:unsigned int * pAddr = (unsigned int *)0x10000
然后用pAddr指针可以访问大于65536的地址空间。
可是这样定义:unsigned int * pAddr = (unsigned int *)0x02000
却只能访问65536以内的地址空间,不过我看分配的时候给pAddr分配的确实是32位地址啊!

问题,如何用第二种定义方法访问大于64k的空间?
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-13 12:08
long  * pAddr = (long *)0x02000

是不是你的编译器认为整形是 16 位,换长整形应该就可以了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-13 12:22
你说的方法我试过,用了你的方法那么数据就会变成32位的,也就是数据存储方式就会变成一次读写32位了,可是我只想让指针是大于16位的,数据是16位的(其实应该是8位的,可是5510不能操作8位的)

用我说的那个第一种定义方法定义的指针,是可以访问大于64k数据空间的,同时指针的指向的数据是16位的。
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-13 12:52
可是两次的定义除了初值不同,其他没有不同啊!

你可以给相同的初值,在下面再重新赋值到 0x0200; 试试!

jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-13 12:57
还是不行,该死的编译器怎么这么笨啊! :(
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-13 13:09
还是不行,该死的编译器怎么这么笨啊! :(


你用仿真器看看当指针到 BASE+65536 时,有什么提示信息再说!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-13 13:36
变成0了!
看来我要么用long,要么用0x10000做起始地址了
好像只要赋值小于65536,便一起就自动识别为int型指针,否则识别为long型指针。
可是如果定义成long型指针,那么地址里的数据也会按照long型数据存放,真是讨厌啊!
实在不行,我用0x10000作为起始地址吧,这样少了几十k的存储空间,影响不是致命的。

还有,除了用移位的和&的方法,你有没有简单一些的方法来分别访问一个16位中的高8位和低8位,就是用汇编指令中的low_byte和high_byte,我昨天尝试把它编成一个宏,如下:
LSB .macro x, y
    MOV high_byte(x), y//将x的高8位存放到y中
    .endm

结果不知道如何在c语言中调用这个宏!郁闷啊。
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-13 13:39
定义成函数就好调用了啊!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-13 13:52
我知道啊,如果定义成函数,在调用函数的时候需要保存现场和恢复现场,这样会花费很多指令周期
这个东西可要调用几千万次啊,如果定义成函数恐怕要运行几分钟了!而我要求其在3s中内必须完成的,所以必须精简指令,所以才想到用宏,要不然我就用移位和 & | 指令了。
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-13 14:07
就用移位和 & | 指令

用 c 编写成一个宏,这样就好调用了。
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-13 14:08
而且 5510 的运行能力到 200MIPS,3s 应该是足够了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-13 14:52
完了,还是只能访问一页的数据,我要崩溃了!
我的内存分配如下:
        DARAM0  : origin = 0000100h, length = 0007F00h
        DARAM1  : origin = 0008000h, length = 0008000h
        SARAM   : origin = 0010000h, length = 0040000h
        .cinit   : {} > DARAM1 PAGE 0
        .text    : {} > DARAM1 PAGE 0
        isrs     : {} > DARAM1 PAGE 0
其余的段都在DARAM0,
我现在想在SARAM段放一幅图像256KB,可是却只能访问到0x20000,也就是说只有64K字,128K字节!
如果将初始地址设置到0x20000,那么可以访问从0x20000~0x30000的这一段。
我已经启用了大内存模式,不管是int指针还是long指针都只能访问64K字的空间!按照datasheet上的说法,只要启用大内存模式,就可以访问24位地址范围内的空间,可是我访问不到啊!!!

难道还有什么寄存器需要设置??/
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-08-13 15:30
我对 5510 还是不了解,你可不可以这么做。

就是每次写完 65535 字节后,对指针变量重新赋值。

如* pAddr = (unsigned int *)0x10000 ,第二次就是
  * pAddr = (unsigned int *)0x20000 ,如此也只要加不多的指令啊!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-08-16 09:03
那样不行,因为在遍历数据的时候并不知道数据在那一页中,如果每次都判断数据在那一页中,那么就会变得非常复杂,工作量也大增

我需要的就是5510那256KB的SARAM我用一个int或long型指针就可以从头到尾访问,不知道可不可行啊,现在还没解决。
hzhq1
驱动老牛
驱动老牛
  • 注册日期2002-12-13
  • 最后登录2012-03-29
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望1054点
  • 贡献值0点
  • 好评度606点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-16 09:17
那样不行,因为在遍历数据的时候并不知道数据在那一页中,如果每次都判断数据在那一页中,那么就会变得非常复杂,工作量也大增

我需要的就是5510那256KB的SARAM我用一个int或long型指针就可以从头到尾访问,不知道可不可行啊,现在还没解决。


去闻亭或合众达的水园逛过没?
这是一个,一个风雨交加的,漆黑的夜晚......恩,情节越来越复杂了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-08-16 09:33
去过合众达的,没去过闻亭的,没找到相关的,一会去闻亭看看。
jec017
驱动太牛
驱动太牛
  • 注册日期2002-08-22
  • 最后登录2008-01-09
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-08-16 09:38
我实在是不知道怎么回事了,我现在用的事ARM的编译器,在小内存模式下也可以一个指针访问 1M 的空间。有点想不通!
上一页
游客

返回顶部