完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
DSP的C/C++编程时有多少种数据类型?float,double和long double,long和long long这些绕口的名字究竟有什么区别?数据类型使用不正确又会有什么后果?如果你感觉说不清楚,那我们来看看这些到底都是何方神圣吧:
表1 C28x C/C++支持的数据类型 Ø 64位整数的处理 从上面的表中,可以看出C28x的编译器是支持64位的整数类型的,这使得在处理某些高精度智能编码器的反馈数据时特别方便,因为在更老的不支持64位整数类型的器件上编程时,需要我们自己定义64位类型,在运算时要自己定义运算规则才行。一个long long类型的整数需要使用ll或者LL前缀,才能被I/O正确处理,例如,我们使用下面的代码才能正确把它们显示在屏幕上: printf(“%lld”, 0x0011223344556677); printf(“%llx”, 0x0011223344556677); 需要注意的是,虽然编译器支持了64位整数,但是实际的CPU的累加器还有相关的CPU寄存器还是32位的,在程序运行时,64位整数类型是被CPU“软支持”的。我们可以添加相关的实时运行库来提高效率,其中包含了llabs(), strtoll() 和strtoull()等函数。 Ø 浮点的处理 从表1中我们可以看出,C28x的编译器支持32位的单精度浮点、64位的单精度和双精度浮点运算。在定义双精度64位变量时,也要记得使用l或者L前缀,否则会被视为双精度的32位变量,造成精度的损失。例如: long double a = 12.34L; /* 初始化为双精度64位浮点 */ long double b = 56.78; /* 把单精度浮点强制类型转换为双精度浮点 */ 在I/O处理时,也要标有相关的前缀,例如: printf(“%Lg”, 1.23L); printf(“%Le”, 3.45L); 需要注意的是,虽然编译器支持了双精度浮点,但是FPU只支持硬件的32位单精度浮点,在程序运行时,双精度浮点类型是被CPU“软支持”的。特别是long double的操作,需要多个CPU寄存器的配合才能完成(代码尺寸和执行时间都会变长);在多个long double操作数的情况下,前两个操作数的地址会传递到CPU辅助寄存器XAR4和XAR5中,其它的地址则被放置在栈中。例如下面的代码中: long double foo(long double a, long double b, long double c) { long double d = a + b + c; return d; } long double a = 1.2L; long double b = 2.2L; long double c = 3.2L; long double d; void bar() { d = foo(a, b, c); } 在函数bar()中调用foo的时候,CPU寄存器的值为: [tr][td]CPU寄存器[/td][td]寄存器的值[/td][/tr][tr][td]XAR4[/td][td]变量a的地址[/td][/tr][tr][td]XAR5[/td][td]变量b的地址[/td][/tr][tr][td]*.SP[2][/td][td]变量c的地址[/td][/tr][tr][td]XAR6[/td][td]变量d的地址[/td][/tr][/table] CPU寄存器寄存器的值: 在C28x的浮点操作中,以加法为例,其汇编代码是有区别的: LCR FS$$ADD ; 单精度加法 LCR FD$$ADD ; 双精度加法 一般情况下,没有特殊的需要,完全可以不实用双精度的浮点,例如在电机控制系统中,因为A/D采样的精度限制,整个系统的精度是无法实现那么高的精度的。 Ø 数据类型很多,使用时一定要小心 单精度与双精度,有符号与无符号,一个大于65535的数赋给16位宽的类型……这些转换都是隐患重重,使用一定要小心啊!例如: 如果你用Excel分析对比数据 记得Excel中浮点类型只能使用双精度的浮点数。所以如果你把DSP中单精度的浮点数据取出放入Excel中,发现数据发生了变化,就不会觉得奇怪了。例如,单精度浮点的0.2放到Excel,就变成0.200000002980232了。 |
|
|
|
只有小组成员才能发言,加入小组>>
791 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2710 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1070浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:20 , Processed in 1.193365 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号