打印

在2410中使用浮点的感受

[复制链接]
3900|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
treeslu|  楼主 | 2007-1-10 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GUI, ev, ui, RAM, TE
在2410中使用浮点
虽2410不提供浮点运算,但是我发现定义浮点,和做一些三角运算,好像还是可以的。
只是有时会出一些莫名其妙的问题。
因为UCGUI在void GUI_RotatePolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, float Angle)中要用到浮点,而我的需求要表针转动,所以野蛮的在2410中做浮点运算。
但是导致了很多奇怪的问题出现:
static float Speed_State=310;
void GUIDEMO_Automotive(void)
{

float Sub=1;
PARAM Param[1];            /* Parameters for drawing routine */ 
GUI_AUTODEV AutoDev[1];    /* Object for banding memory device */

GUI_MEMDEV_CreateAuto(&AutoDev[0]);

GUI_AA_EnableHiRes();
GUI_AA_SetFactor(MAG);

    while(1)
    {
  if(Mileage>=16)
  {
   Speed_State=Speed_State+Sub;
   Param[0].Angle =Speed_State*314/18000;
   GUI_RotatePolygon(Param[0].aPoints,
          _aNeedle_Navi, 
          countof(_aNeedle_Navi), 
          Param[0].Angle);
   GUI_MEMDEV_DrawAuto(&AutoDev[0], &Param[0].AutoDevInfo, _Draw_Speed, &Param[0]);
  }
  else
  {
      Speed_State=Speed_State-Sub;
      Param[0].Angle =Speed_State*314/18000;
      GUI_RotatePolygon(Param[0].aPoints,
          _aNeedle_Navi, 
          countof(_aNeedle_Navi), 
          Param[0].Angle);
   GUI_MEMDEV_DrawAuto(&AutoDev[0], &Param[0].AutoDevInfo, _Draw_Speed, &Param[0]);
     }
  
     //GUI_MEMDEV_DrawAuto(&AutoDev[0], &Param[0].AutoDevInfo, _Draw_Speed, &Param[0]);
      
     
    }
    
    
}

1,Speed_State放到函数内部定义为局部变量时无法正常显示,但步调试发现地址错位
2,GUI_MEMDEV_DrawAuto放到if/else内显示不正常, 外显示正常;如果将Sub定义为int,也不能正常,将Sub放到函数上面 用 # define Sub   1   则GUI_MEMDEV_DrawAuto放到if/else内外显示都正常;

初步猜测是定义的浮点导致了位无法对齐
大家有没有同样的遭遇和能解释的?可能在不带浮点的2410上进行浮点运算就是个罪孽。:)

相关帖子

沙发
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型运算的问题:
因为系统的软件架构是:UCOS+UC/GUI+APP;

问题:
1,float A=5.1234;
   float B=5.1;
   int   C=314,D=18000;
   float Sum;
   Sum = A+B;     //浮点的精确位数不同能否在定点CPU上运算?
   Sum = A*C/D;   //浮点和整型能做乘法,除法吗?
   
2,32位的ARM 定点CPU 进行浮点运算会不会造成位不能对齐?

使用特权

评论回复
地板
xwj| | 2007-1-11 09:33 | 只看该作者

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

用定点CPU来做浮点运算,只要编译器没BUG结果肯定是没问题的,
但速度会慢几十上百倍!

使用特权

评论回复
5
treeslu|  楼主 | 2007-1-11 11:11 | 只看该作者

偏偏就是浮点运算的问题

我现在的问题就出在浮点运算上,
我在做3.5-inch TFT LCD,UCGUI 如果在我的绘图程序中运算,表针需要旋转的角度
float Speed_State=310.0;
float Param[0].Angle ;
Param[0].Angle =Speed_State*314/18000;
能正常实现我的显示
但是
如果改成
float Speed_State=310.0;
float Param[0].Angle ;
Param[0].Angle =Speed_State*(3.14)/180;
则,会把未初始化的全局变量signed short WM__hATransWindow 的值改成0x00008A94,看似把WM__hATransWindow 挤到代码区了。
而我是用仿真器在SDRAM起始地址0x30000000中跑,比较奇怪的现象

2,还遇到过自己定义的一个全局变量 int Mileage = 0;单步跟踪发现Mileage 到代码区了,
如果int Mileage = 1;或其它非0的值,则没有问题。

使用特权

评论回复
6
treeslu|  楼主 | 2007-1-11 14:14 | 只看该作者

请版主把广告滤掉:)

使用特权

评论回复
7
treeslu|  楼主 | 2007-1-12 10:56 | 只看该作者

在定点CPU中进行浮点运算

在2410上进行浮点运算,确实没有问题,先前的问题是UCOS和UCGUI之间没有配置好,当不要UCOS,直接裸奔,先前出现的奇怪问题立即消失。

但是速度特别慢,原因猜测:
1,浮点运算;
2,Cache没有打开;
3,没有把2410 200MHz使用好,

有加速经验的,请分享

使用特权

评论回复
8
lpcfans| | 2007-1-12 14:18 | 只看该作者

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

但后来发现不是浮点的问题(慢)。因为定义一个简单的函数,只有一个浮点进行运算的话,没问题。定义很多浮点后,速度很慢。

使用特权

评论回复
9
treeslu|  楼主 | 2007-1-12 15:55 | 只看该作者

后来解决了吗?

后来有没有尝试将速度加快?

其实我认为200MHz的CPU系统主频用好的话,应该不至于这么慢。

使用特权

评论回复
10
lpcfans| | 2007-1-12 21:12 | 只看该作者

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

菜单太多了就慢。可能是RAM不够吧。
32KRAM做太多的界面,确实不如裸奔好。。

使用特权

评论回复
11
lianshumou| | 2007-1-12 21:41 | 只看该作者

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

定点算浮点本来就慢,你要在定太多,只有一个字慢!

使用特权

评论回复
12
treeslu|  楼主 | 2007-1-15 10:15 | 只看该作者

速度慢跟具体应用有关

现用2410接3.5-inch TFT LCD 做一个表盘,里面最耗时的运算是,指针的转动,由于是用UCGUI,所以为了防闪,用Memory Device,
这样一来好像慢得不行了。现在也不知道具体哪里最耗时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝