TMS320VC33字长问题

TMS320VC33是TI经典的浮点运算DSP,是从c3x中演变而来的,具有低功耗,大RAM(与c3x相比),在2000年的设计中使用较多,目前已经停产。就这么个片子把我搞惨了。

首先是原本的程序用C编程,使用File级的优化-03,优化级别最高了,对于代码的分析就有困难了,但原本的程序经过使用验证是没有问题的。现在的工作是需要加入一个CRC校验函数。首先通过VC2005编写一个可以在windows下正确运行的crc c程序,用cc编译后下载到片子上运行,从串口看数据crc校验错,程序有问题。开始怀疑编译器优化有问题,将此文件的优化去掉,还是不对。又怀疑是crc算法效率太低,采用bit移位法计算,改变crc算法,采用查表法,但是不对。

由于完整程序太大,不能在线仿真,所以调试起来很麻烦。最后没有办法,单单将crc函数挂上仿真器单独跑,结果crc错。这么就好找原因了,将每次crc查表的结果printf出来,很快就找到原因了。在程序中查表的位置号用unsigned char变量,crc结果用unsigned short,从中间结果看unsigned char型变量可以达到0×400值,unsigned short可以达到0×1287D0,这crc能校验对才有问题呢?printf sizeof 各种数据类型发现,在VC33中unsigned char、unsigned short、unsigned int、unsigned long int的长度都是1,位长度都是32bit,也就是说在VC33定义的变量类型只是个符号,与内存的分配无关,通常情况在cc下将float赋给int,连个warning都没有。在软件仿真和硬件仿真下都可以验证,这是编译器决定的。找到了原因,在每次运算完之后,根据理想的数据类型,取有效的位数即可(铵位与运算)。

另外VC33的地址空间也是与1字(int)对应的,就是一个地址对应一个存储空间,只是这个存储空间是32bit长。

最早使用ADI的BF系列芯片也没有这样的,到后期使用TI的C6000系列数据类型也是与存储空间严格对应的。

你可能感兴趣的:(TMS320VC33字长问题)