amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 610|回复: 9

有没有谁测过STC8的浮点运算速度

[复制链接]
发表于 2019-8-22 16:22:08 | 显示全部楼层 |阅读模式
比如加、减、乘、除、平方根等浮点运算
发表于 2019-8-22 16:58:47 来自手机 | 显示全部楼层
你用keil编译试试。依赖标准c库实现。效率一般不算太低,但加减要耗掉不少资源。
发表于 2019-8-23 12:45:58 | 显示全部楼层
我测试过,要好几十个mS,单浮点运算
 楼主| 发表于 2019-8-23 17:02:55 | 显示全部楼层
wxdn 发表于 2019-8-23 12:45
我测试过,要好几十个mS,单浮点运算

你这个夸张了
发表于 2019-8-23 21:35:38 | 显示全部楼层
我用STC8系列做四轴飞控,跑24MHz,大量的浮点运算,加减乘除、乘方、开方、反三角函数,都是不到3ms。
其中四元数处理最多计算,然后是3轴的双环PID计算。

下面仅仅是四元数计算,全部是浮点计算,大约2ms多点,大家可以看看计算量:

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
        float data norm;
        float idata vx, vy, vz;
        float idata ex, ey, ez;

        norm = sqrt(ax*ax + ay*ay + az*az);        //把加速度计的三维向量转成单维向量   
        ax = ax / norm;
        ay = ay / norm;
        az = az / norm;

                //        下面是把四元数换算成《方向余弦矩阵》中的第三列的三个元素。
                //        根据余弦矩阵和欧拉角的定义,地理坐标系的重力向量,转到机体坐标系,正好是这三个元素
                //        所以这里的vx vy vz,其实就是当前的欧拉角(即四元数)的机体坐标参照系上,换算出来的
                //        重力单位向量。
        vx = 2*(q1*q3 - q0*q2);
        vy = 2*(q0*q1 + q2*q3);
        vz = q0*q0 - q1*q1 - q2*q2 + q3*q3 ;

        ex = (ay*vz - az*vy) ;
        ey = (az*vx - ax*vz) ;
        ez = (ax*vy - ay*vx) ;

        exInt = exInt + ex * Ki;
        eyInt = eyInt + ey * Ki;
        ezInt = ezInt + ez * Ki;

        gx = gx + Kp*ex + exInt;
        gy = gy + Kp*ey + eyInt;
        gz = gz + Kp*ez + ezInt;

        q0 = q0 + (-q1*gx - q2*gy - q3*gz) * halfT;
        q1 = q1 + ( q0*gx + q2*gz - q3*gy) * halfT;
        q2 = q2 + ( q0*gy - q1*gz + q3*gx) * halfT;
        q3 = q3 + ( q0*gz + q1*gy - q2*gx) * halfT;

        norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
        q0 = q0 / norm;
        q1 = q1 / norm;
        q2 = q2 / norm;
        q3 = q3 / norm;

        AngleX = asin(2*(q0*q2 - q1*q3 )) * 57.2957795f; // 俯仰   换算成度
        AngleY = asin(2*(q0*q1 + q2*q3 )) * 57.2957795f; // 横滚
}
发表于 2019-8-23 23:49:08 | 显示全部楼层
没有硬件的FPU,速度快不了
发表于 2019-8-24 00:09:29 来自手机 | 显示全部楼层
单精度还好,double就厉害了,其实只要没有fpu,那个内核都是弟弟
发表于 2019-8-24 21:56:19 | 显示全部楼层
给你个参考,stc8a8k,53.33us的中断周期,在中断函数中计算两个浮点数直接相乘,完全没有问题,所有的控制逻辑正常执行,中断函数比较简单,相乘之后的结果直接转成uchar赋给寄存器;同时也试过,如果在这个中断函数中计算正弦函数时间就不够了
发表于 2019-8-24 21:57:14 | 显示全部楼层
MYQQ2018 发表于 2019-8-24 21:56
给你个参考,stc8a8k,53.33us的中断周期,在中断函数中计算两个浮点数直接相乘,完全没有问题,所有的控制 ...

忘了说了,24MHz主时钟
发表于 2019-8-25 11:15:41 | 显示全部楼层
momo_li 发表于 2019-8-24 00:09
单精度还好,double就厉害了,其实只要没有fpu,那个内核都是弟弟

keilC51好像不支持DOUBLE吧,定义了DOUBLE,最终编译的代码和单精度一样的
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-15 14:52

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表