阅读:2096回复:20
jec017,guoxh9进来帮俺回答一个dsp5510的问题,多谢
我用TMS320vc5510的DSK,为什么我写的程序不能用大内存模式(-ml)编译呢?我在编译选项里选中大内存模式就出现如下错误:
error: linking files for incompatible targets |
|
沙发#
发布于:2004-08-13 10:35
搞定了,等有了问题再问。 :D
|
|
板凳#
发布于:2004-08-13 10:43
把怎么搞定的发上来,大家学学!
|
|
地板#
发布于:2004-08-13 11:16
把用的.lib文件换换就行了。
新的问题,是关于指针操作的: 我定义一个指针:unsigned int * pAddr = (unsigned int *)0x10000 然后用pAddr指针可以访问大于65536的地址空间。 可是这样定义:unsigned int * pAddr = (unsigned int *)0x02000 却只能访问65536以内的地址空间,不过我看分配的时候给pAddr分配的确实是32位地址啊! 问题,如何用第二种定义方法访问大于64k的空间? |
|
地下室#
发布于:2004-08-13 12:08
long * pAddr = (long *)0x02000
是不是你的编译器认为整形是 16 位,换长整形应该就可以了。 |
|
5楼#
发布于:2004-08-13 12:22
你说的方法我试过,用了你的方法那么数据就会变成32位的,也就是数据存储方式就会变成一次读写32位了,可是我只想让指针是大于16位的,数据是16位的(其实应该是8位的,可是5510不能操作8位的)
用我说的那个第一种定义方法定义的指针,是可以访问大于64k数据空间的,同时指针的指向的数据是16位的。 |
|
6楼#
发布于:2004-08-13 12:52
可是两次的定义除了初值不同,其他没有不同啊!
你可以给相同的初值,在下面再重新赋值到 0x0200; 试试! |
|
7楼#
发布于:2004-08-13 12:57
还是不行,该死的编译器怎么这么笨啊! :(
|
|
8楼#
发布于:2004-08-13 13:09
还是不行,该死的编译器怎么这么笨啊! :( 你用仿真器看看当指针到 BASE+65536 时,有什么提示信息再说! |
|
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语言中调用这个宏!郁闷啊。 |
|
10楼#
发布于:2004-08-13 13:39
定义成函数就好调用了啊!
|
|
11楼#
发布于:2004-08-13 13:52
我知道啊,如果定义成函数,在调用函数的时候需要保存现场和恢复现场,这样会花费很多指令周期
这个东西可要调用几千万次啊,如果定义成函数恐怕要运行几分钟了!而我要求其在3s中内必须完成的,所以必须精简指令,所以才想到用宏,要不然我就用移位和 & | 指令了。 |
|
12楼#
发布于:2004-08-13 14:07
就用移位和 & | 指令
用 c 编写成一个宏,这样就好调用了。 |
|
13楼#
发布于:2004-08-13 14:08
而且 5510 的运行能力到 200MIPS,3s 应该是足够了。
|
|
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位地址范围内的空间,可是我访问不到啊!!! 难道还有什么寄存器需要设置??/ |
|
15楼#
发布于:2004-08-13 15:30
我对 5510 还是不了解,你可不可以这么做。
就是每次写完 65535 字节后,对指针变量重新赋值。 如* pAddr = (unsigned int *)0x10000 ,第二次就是 * pAddr = (unsigned int *)0x20000 ,如此也只要加不多的指令啊! |
|
16楼#
发布于:2004-08-16 09:03
那样不行,因为在遍历数据的时候并不知道数据在那一页中,如果每次都判断数据在那一页中,那么就会变得非常复杂,工作量也大增
我需要的就是5510那256KB的SARAM我用一个int或long型指针就可以从头到尾访问,不知道可不可行啊,现在还没解决。 |
|
17楼#
发布于:2004-08-16 09:17
那样不行,因为在遍历数据的时候并不知道数据在那一页中,如果每次都判断数据在那一页中,那么就会变得非常复杂,工作量也大增 去闻亭或合众达的水园逛过没? |
|
|
18楼#
发布于:2004-08-16 09:33
去过合众达的,没去过闻亭的,没找到相关的,一会去闻亭看看。
|
|
19楼#
发布于:2004-08-16 09:38
我实在是不知道怎么回事了,我现在用的事ARM的编译器,在小内存模式下也可以一个指针访问 1M 的空间。有点想不通!
|
|
上一页
下一页