在2410中使用浮点的感受

[复制链接]
5492|11
 楼主| treeslu 发表于 2007-1-10 15:47 | 显示全部楼层 |阅读模式
GUI, ev, ui, RAM, TE
在2410中使用浮点<br />虽2410不提供浮点运算,但是我发现定义浮点,和做一些三角运算,好像还是可以的。<br />只是有时会出一些莫名其妙的问题。<br />因为UCGUI在void&nbsp;GUI_RotatePolygon(GUI_POINT*&nbsp;pDest,&nbsp;const&nbsp;GUI_POINT*&nbsp;pSrc,&nbsp;int&nbsp;NumPoints,&nbsp;float&nbsp;Angle)中要用到浮点,而我的需求要表针转动,所以野蛮的在2410中做浮点运算。<br />但是导致了很多奇怪的问题出现:<br />static&nbsp;float&nbsp;Speed_State=310;<br />void&nbsp;GUIDEMO_Automotive(void)<br />{<br /><br />float&nbsp;Sub=1;<br />PARAM&nbsp;Param[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Parameters&nbsp;for&nbsp;drawing&nbsp;routine&nbsp;*/&nbsp;<br />GUI_AUTODEV&nbsp;AutoDev[1];&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Object&nbsp;for&nbsp;banding&nbsp;memory&nbsp;device&nbsp;*/<br /><br />GUI_MEMDEV_CreateAuto(&AutoDev[0]);<br /><br />GUI_AA_EnableHiRes();<br />GUI_AA_SetFactor(MAG);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;if(Mileage&gt=16)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Speed_State=Speed_State+Sub;<br />&nbsp;&nbsp;&nbsp;Param[0].Angle&nbsp;=Speed_State*314/18000;<br />&nbsp;&nbsp;&nbsp;GUI_RotatePolygon(Param[0].aPoints,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_aNeedle_Navi,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countof(_aNeedle_Navi),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Param[0].Angle);<br />&nbsp;&nbsp;&nbsp;GUI_MEMDEV_DrawAuto(&AutoDev[0],&nbsp;&Param[0].AutoDevInfo,&nbsp;_Draw_Speed,&nbsp;&Param[0]);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Speed_State=Speed_State-Sub;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Param[0].Angle&nbsp;=Speed_State*314/18000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GUI_RotatePolygon(Param[0].aPoints,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_aNeedle_Navi,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countof(_aNeedle_Navi),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Param[0].Angle);<br />&nbsp;&nbsp;&nbsp;GUI_MEMDEV_DrawAuto(&AutoDev[0],&nbsp;&Param[0].AutoDevInfo,&nbsp;_Draw_Speed,&nbsp;&Param[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//GUI_MEMDEV_DrawAuto(&AutoDev[0],&nbsp;&Param[0].AutoDevInfo,&nbsp;_Draw_Speed,&nbsp;&Param[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />1,Speed_State放到函数内部定义为局部变量时无法正常显示,但步调试发现地址错位<br />2,GUI_MEMDEV_DrawAuto放到if/else内显示不正常,&nbsp;外显示正常;如果将Sub定义为int,也不能正常,将Sub放到函数上面&nbsp;用&nbsp;#&nbsp;define&nbsp;Sub&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;则GUI_MEMDEV_DrawAuto放到if/else内外显示都正常;<br /><br />初步猜测是定义的浮点导致了位无法对齐<br />大家有没有同样的遭遇和能解释的?可能在不带浮点的2410上进行浮点运算就是个罪孽。:)<br /><br />
lianshumou 发表于 2007-1-10 19:26 | 显示全部楼层

不应有这样的问题的!定点CPU没规定不能算浮点数

C51还8位的片子,连双精度都可以算,何况是32位的ARM,你的浮点赋值是需要小数点的,即使你是1,也需要写为1.0
 楼主| treeslu 发表于 2007-1-11 09:19 | 显示全部楼层

那定点CPU跟浮点CPU就没有什么区别了?

我也发现可以算,因为先前的误解是,定点CPU不能定义float型,更不能进行运算,但后来尝试一下后发现是可以的。但老出一些想不通的问题,所以就判断是float型运算的问题:<br />因为系统的软件架构是:UCOS+UC/GUI+APP;<br /><br />问题:<br />1,float&nbsp;A=5.1234;<br />&nbsp;&nbsp;&nbsp;float&nbsp;B=5.1;<br />&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;C=314,D=18000;<br />&nbsp;&nbsp;&nbsp;float&nbsp;Sum;<br />&nbsp;&nbsp;&nbsp;Sum&nbsp;=&nbsp;A+B;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//浮点的精确位数不同能否在定点CPU上运算?<br />&nbsp;&nbsp;&nbsp;Sum&nbsp;=&nbsp;A*C/D;&nbsp;&nbsp;&nbsp;//浮点和整型能做乘法,除法吗?<br />&nbsp;&nbsp;&nbsp;<br />2,32位的ARM&nbsp;定点CPU&nbsp;进行浮点运算会不会造成位不能对齐?
xwj 发表于 2007-1-11 09:33 | 显示全部楼层

定点CPU跟浮点CPU最大区别就是浮点运算的效率

用定点CPU来做浮点运算,只要编译器没BUG结果肯定是没问题的,<br />但速度会慢几十上百倍!<br /><br />
 楼主| treeslu 发表于 2007-1-11 11:11 | 显示全部楼层

偏偏就是浮点运算的问题

我现在的问题就出在浮点运算上,<br />我在做3.5-inch&nbsp;TFT&nbsp;LCD,UCGUI 如果在我的绘图程序中运算,表针需要旋转的角度<br />float&nbsp;Speed_State=310.0;<br />float&nbsp;Param[0].Angle&nbsp;;<br />Param[0].Angle&nbsp;=Speed_State*314/18000;<br />能正常实现我的显示<br />但是<br />如果改成<br />float&nbsp;Speed_State=310.0;<br />float&nbsp;Param[0].Angle&nbsp;;<br />Param[0].Angle&nbsp;=Speed_State*(3.14)/180;<br />则,会把未初始化的全局变量signed&nbsp;short&nbsp;WM__hATransWindow&nbsp;的值改成0x00008A94,看似把WM__hATransWindow&nbsp;挤到代码区了。<br />而我是用仿真器在SDRAM起始地址0x30000000中跑,比较奇怪的现象<br /><br />2,还遇到过自己定义的一个全局变量 int&nbsp;Mileage&nbsp;=&nbsp;0;单步跟踪发现Mileage&nbsp;到代码区了,<br />如果int&nbsp;Mileage&nbsp;=&nbsp;1;或其它非0的值,则没有问题。
 楼主| treeslu 发表于 2007-1-11 14:14 | 显示全部楼层

请版主把广告滤掉:)

  
 楼主| treeslu 发表于 2007-1-12 10:56 | 显示全部楼层

在定点CPU中进行浮点运算

在2410上进行浮点运算,确实没有问题,先前的问题是UCOS和UCGUI之间没有配置好,当不要UCOS,直接裸奔,先前出现的奇怪问题立即消失。<br /><br />但是速度特别慢,原因猜测:<br />1,浮点运算;<br />2,Cache没有打开;<br />3,没有把2410 200MHz使用好,<br /><br />有加速经验的,请分享
lpcfans 发表于 2007-1-12 14:18 | 显示全部楼层

在LPC2136上用UCOS,浮点运算发现过。

但后来发现不是浮点的问题(慢)。因为定义一个简单的函数,只有一个浮点进行运算的话,没问题。定义很多浮点后,速度很慢。
 楼主| treeslu 发表于 2007-1-12 15:55 | 显示全部楼层

后来解决了吗?

后来有没有尝试将速度加快?<br /><br />其实我认为200MHz的CPU系统主频用好的话,应该不至于这么慢。
lpcfans 发表于 2007-1-12 21:12 | 显示全部楼层

我发现的现象是LCD刷新慢。但记数总量是正确的。

菜单太多了就慢。可能是RAM不够吧。<br />32KRAM做太多的界面,确实不如裸奔好。。<br />
lianshumou 发表于 2007-1-12 21:41 | 显示全部楼层

一个函数不要定义太多局部变量,那可都存在堆栈中的

定点算浮点本来就慢,你要在定太多,只有一个字慢!
 楼主| treeslu 发表于 2007-1-15 10:15 | 显示全部楼层

速度慢跟具体应用有关

现用2410接3.5-inch&nbsp;TFT&nbsp;LCD&nbsp;做一个表盘,里面最耗时的运算是,指针的转动,由于是用UCGUI,所以为了防闪,用Memory&nbsp;Device,<br />这样一来好像慢得不行了。现在也不知道具体哪里最耗时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

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