This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP下C语言里的类型强制转换问题



我在Linux下写了个小程序:

int main(void)

{

unsigned char src[] = {

0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99

};

 

unsigned char *p, *q;

int a, b;

p = src+1;

a = *(int *)p;

q = src+2;

b = *(int *)q;

return 0;

}

调试时查看a,b的值:

a=0x44332211

b=0x55443322

这是我所期望的结果。但我把同样的程序放到CCS3.3中编译,却得到如下结果:

a=0x33221100

b=0x33221100

a和b的结果竟然一样,而且其最低位的地址都是从src[0]的地址开始的!我再看了一下,p,q倒是得到了正确的地址,但最后得到的a,b的值却不对,似乎CCS强制使用了4字节的对齐,而不能像Linux或者其他环境下的编译器那样从任意位置开始解引用。

我想问问这是什么原因造成的,如果我要在CCS下实现象在Linux下那样的效果,又应该怎么做?

  • 你好,在dsp中,例如,DDR2 data bus width如果是32位,每次访问,都是直接访问内存中4个字节的数据。如果在Linux系统中,因为有MMU,所以用户操作的内存都是虚拟内存,可以用字节操作。如果在CCS中实现像在Linux下的那样效果,首先需要配置:DDR2 data bus width,以符合你访问的方式。

  • 谢谢!我在《TMS320C6000 Programmer's Guide》中找到了答案,似乎还是和编译器有关。解决办法是使用TI的intrinsic函数_mem4(p),这样就可以访问不对齐的word数据了。上面的例子中用法是

       a = *(int *)p;

    现在只需改成下面的形式就可以了

       a = _mem4(p);