【请问】44b0如何将浮点数打印到串口助手上去呢???

[复制链接]
5450|5
 楼主| quiza 发表于 2008-1-9 11:08 | 显示全部楼层 |阅读模式
在程序的某些断点上向串口调试助手发送一些变量,便于调试时观察变量变化<br />整形、字符串都没问题,但是浮点数串口助手显示的不正确:<br />a=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;<br />b=1?500000&nbsp;<br />程序中对应的代码为:<br />Uart_Printf(&quot;a=%10.2d&nbsp;
&quot;,a);&nbsp;&nbsp;&nbsp;&nbsp;<br />Uart_Printf(&quot;b=%f&nbsp;
&quot;,b);<br />请问是不是我printf的格式用错了?
老狼 发表于 2008-1-9 15:53 | 显示全部楼层

我还是奉劝一句

这种不带浮点的CPU,不要使用浮点,效率太低!<br />就上面的例子,你得到的一手数据肯定是整数型的,不必化成浮点型,然后发送,直接发送整数到串口,修改&nbsp;Uart_SendString(string);效率要高得多。<br /><br />不要使用系统的Printf这一类函数,能直接调用硬件,就不要用这一类的系统函数,很占资源,我现在写程序,很多函数都自己写,比库函数快多了,例如开方函数,那个库函数效率太低了。<br /><br /><br />
 楼主| quiza 发表于 2008-1-9 17:03 | 显示全部楼层

我把代码贴出来,看看这个如何用整数优化

最小二乘法(根据最近5次lc与hi的关系,拟合直线,得到y=k1x+k2系数a,b)<br />float&nbsp;x,y,sx,sy,sxx,syy,sxy,k1,k2,r;<br />U32&nbsp;i;<br />U16&nbsp;lc[5],hi[5];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sx=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sy=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sxx=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;syy=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sxy=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;lc[1]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;hi[1]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;lc[2]=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;hi[2]=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;lc[3]=3;<br />&nbsp;&nbsp;&nbsp;&nbsp;hi[3]=3;<br />&nbsp;&nbsp;&nbsp;&nbsp;lc[4]=4;<br />&nbsp;&nbsp;&nbsp;&nbsp;hi[4]=4;<br />&nbsp;&nbsp;&nbsp;&nbsp;lc[5]=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;hi[5]=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt5;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=lc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y=hi;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sx=sx+x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy=sy+y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sxx=sxx+x*x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;syy=syy+y*y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sxy=sxy+x*y;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;k1=(5*sxy-sx*sy)&nbsp;/(5*sxx-sx*sx);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;k2=sy/5-k1*sx/5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;r=(5*sxy-sx*sy)/(sqrt(5*sxx-sx*sx)*sqrt(5*syy-sy*sy));&nbsp;&nbsp;&nbsp;&nbsp;//相关系数<br /><br />不知道这样如何用整数方式来优化?谢谢老狼!
老狼 发表于 2008-1-9 18:27 | 显示全部楼层

在计算机内部都是以二进制计算为最快捷

<br />不管是浮点数还是整数,在计算机内部都是以二进制计算为最快捷的.因此,计算和保存应该使用二进制,只有需要显示的时候才需要转换成十进制数,以及其它形式的数.&nbsp;<br /><br />1.根据系统的实际,确定数据处理过程中小数点后应该保留的有效位数是多少,比如是5位,那么参与运算的数据全部放大,乘上100000.&nbsp;<br /><br />2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围.&nbsp;<br /><br />如果上2条满足,就适合将浮点转换成整数计算了.&nbsp;<br /><br />============================================&nbsp;<br />用个简单例子看具体的处理和设计.&nbsp;<br /><br />假定一个系统通过测汽车轮子转速来计算距离,一个脉冲表示轮子转一圈,轮子的直径为0.485米.那么理论计算公式是:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;=&nbsp;N&nbsp;*&nbsp;3.1415926...&nbsp;*&nbsp;0.485&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;为距离(米)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;为脉冲个数(肯定是整数)&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;那么我们就要首先确定计算结果的精度.根据实际情况,距离的精度到达毫米即可.因此计算中的精度为毫米.这样轮子的直径为485.0毫米,4位有效数字.然后将3.1415926变成整数31416,放大10000,5位有效(保证计算精度).&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;那么S&nbsp;=&nbsp;(N&nbsp;*&nbsp;31416&nbsp;*&nbsp;485)&nbsp;/&nbsp;(10000)&nbsp;毫米&nbsp;&nbsp;&nbsp;====&gt(2)&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;接下来看无符号长整型数为4个字节,表示最大数为:4294967295,那么:&nbsp;4294967295&nbsp;/&nbsp;31416&nbsp;/&nbsp;485&nbsp;==&nbsp;&nbsp;281.88&nbsp;(N的值)&nbsp;<br />&nbsp;&nbsp;&nbsp;因此,2式中的N最大不能超过281.&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;取N为280,为1秒内轮子转动的圈数,则280*3.1416*0.485&nbsp;=&nbsp;426.63米/秒&nbsp;&nbsp;换算成公里/小时为:1535.85公里/小时!!&nbsp;<br />&nbsp;&nbsp;&nbsp;实际汽车的速度不可能这么快,所以N不会超过280个/每秒.2式可以使用.&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;这样浮点的计算换成了整数计算.&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;系统可以每一秒计算一次:&nbsp;<br />&nbsp;&nbsp;&nbsp;将在一秒内测得的圈数N,按N*31416*485计算(纯整数计算).&nbsp;<br />&nbsp;&nbsp;&nbsp;计算结果的小数点左移7位显示速度(米/秒),&nbsp;<br />&nbsp;&nbsp;&nbsp;计算结果除10000(单位毫米)送距离累加.&nbsp;<br /><br />//-----------------------------------------------------------------<br />以上是别人的帖子。转过来的,自己写太麻烦!文中一个观点我不赞同,“2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围”,如果,32位不能保证精度怎么办?那就扩呀,扩展成64位,哈哈,方法和51单片机实现方式差不多。这种方法实现起来确实不如直接用浮点方便,但是速度快多了,sqrt也不能调用库函数,找一个整数开方的函数。
 楼主| quiza 发表于 2008-1-9 21:42 | 显示全部楼层

多谢老狼指点!

事实上,现在做的系统就包含了里程测距功能,实现的方法和老狼转贴内所述基本思想是一致的,的确速度上加快了不少,但是不够直观,需要注释,如果对精度、分辨率要求很高时,就需要注意是否会溢出。所以现在想想还不如用浮点做呢,虽然慢点,好在系统实时性要求不高,上面我列的那个代码段,用软件浮点处理的话,在SDRAM里运行耗时270us,在FLASH里运行耗时780us,基本是可以接受的
wangshujun 发表于 2008-1-17 09:48 | 显示全部楼层

找一下老帖子,ads的浮点格式可以配置,通过配置国家选项

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

102

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部