打印
[APM32E1]

极海E103 FPU浮点运算性能简单测试

[复制链接]
14944|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2023-6-13 15:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #技术资源#
查看规格书发现,APM32E103系列除了可以兼容STM32F103系列外,还增加了一些外设功能。比如FPU、CAN2、外扩SDRAM等。
其中FPU(浮点运算单元)一般是在M4内核的芯片上才有的,可以大大提升浮点数的运算效率。
查看手册和SDK发现,APM32E103的FPU使用上是与M4内核自带的FPU有区别的,需要像使用外设一样开启时钟,调用封装好的库函数。
FPU库的sc_math.h中声明了能使用的浮点运算函数。

C语言中进行浮点运算,可以调用math.h来进行浮点计算。
接下来就简单对比测试下APM32E103的FPU与math.h中进行同样的sin()和cos运算,看计算时间分别是多少。

计算思路就是通过先清零TMR5计数值,读进行100次浮点运算前后的计数值来计算所用时间。
 void TMR5_Init(void)
{
    TMR_BaseConfig_T TMR_BaseConfigStruct;

    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5);

    TMR_BaseConfigStruct.clockDivision = TMR_CLOCK_DIV_1;
    TMR_BaseConfigStruct.countMode = TMR_COUNTER_MODE_UP;
    TMR_BaseConfigStruct.division = 7;
    TMR_BaseConfigStruct.period = 0xFFFF;
    TMR_BaseConfigStruct.repetitionCounter = 0;
    TMR_ConfigTimeBase(TMR5, &TMR_BaseConfigStruct);


    TMR_Enable(TMR5);
}
int main(void)
{
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_FPU);
    RCM->CFG |= BIT27;

                TMR5_Init();
                Usart_Init();
               
                a=10*PI/180;
               
                printf("Angle=%5.11f\r\n",a);
               
                TMR_ConfigCounter(TMR5,0);
               
                m=TMR_ReadCounter(TMR5);
                                for (s = 0; s < 100; s++)
                        {
                                ans[0] = sc_math_sin(a);//FPU sin()
                        }
                n=TMR_ReadCounter(TMR5);
                printf("\r\nAPM32 FPU SIN(): %5.11f\r\n", ans[0]);
                printf("Time:%d\r\n",(n-m));


                        TMR_ConfigCounter(TMR5,0);
                        m=TMR_ReadCounter(TMR5);
                                                for (s = 0; s < 100; s++)
                        {
                                ans[1] = sin(a);//math.h SIN()
                        }
                        n=TMR_ReadCounter(TMR5);
                        printf("\r\nC math.h SIN(): %5.11f\r\n", ans[1]);
                        printf("Time:%d\r\n",(n-m));
                       
                TMR_ConfigCounter(TMR5,0);
                m=TMR_ReadCounter(TMR5);
                                for (s = 0; s < 100; s++)
                        {
                                ans[0] = sc_math_cos(a);//FPU cos()
                        }
                                n=TMR_ReadCounter(TMR5);
                        printf("\r\nAPM32 FPU COS(): %5.11f\r\n", ans[0]);
                                printf("Time:%d\r\n",(n-m));


                        TMR_ConfigCounter(TMR5,0);
                        m=TMR_ReadCounter(TMR5);
                                                for (s = 0; s < 100; s++)
                        {
                ans[1] = cos(a);//math.h cos()
                        }
                                                n=TMR_ReadCounter(TMR5);
                        printf("\r\nC math.h COS(): %5.11f\r\n", ans[1]);
                        printf("Time:%d\r\n",(n-m));
                       
                       
}
使用串口就能打印输出浮点运算值和所用时间。
输入角度为10°时的结果。

输入角度为120°的结果:

从计算结果来对比看,浮点运算值都还是比较准确的。
APM32E103的FPU对计算效率的提升还是很明显的,目前由于是硬件完成计算,不同的输入值对运算时间基本没有影响。
而使用math.h的sin()和cos()需要转换运算,不同输入值的计算时间都不一样。
整体而言APM32E103的FPU对支持的浮点运算函数,运算的效率和准确性还是很不错的,有比较多浮点运算的场合还是比较合适的。

使用特权

评论回复
沙发
Alden|  楼主 | 2023-6-13 15:11 | 只看该作者

使用特权

评论回复
评论
21小跑堂 2023-6-15 14:46 回复TA
halo大佬,咱们原创要求800字哦,您这篇还差点,可以填充下内容到800左右即可哈 
板凳
joengchao| | 2023-6-13 17:29 | 只看该作者
学习了

使用特权

评论回复
地板
cauhorse| | 2023-6-14 10:46 | 只看该作者
FPU和C函数计算值,小数后几位不一样是什么原因呢?

使用特权

评论回复
5
Alden|  楼主 | 2023-6-14 15:25 | 只看该作者
cauhorse 发表于 2023-6-14 10:46
FPU和C函数计算值,小数后几位不一样是什么原因呢?

毕竟能储存的精度有限,算法不一样精度损失不同,结果就不同

使用特权

评论回复
6
kai迪皮| | 2023-6-14 16:28 | 只看该作者
好贴点赞

使用特权

评论回复
评论
ljm9823 2023-6-15 14:15 回复TA
没错 
7
byeyear| | 2023-6-15 14:59 | 只看该作者
计算结果不一样可能是因为math.h里的sin函数接受double参数并返回double结果。可以用sinf函数试试。
大部分数学函数都有double和float两个版本,默认是double版本,需要float版本的话在函数名后面加个f。
例如sin/sinf, cos/cosf, log/logf,等等。

使用特权

评论回复
8
lxc88998899| | 2023-6-15 16:20 | 只看该作者
好资料,谢谢

使用特权

评论回复
9
740071911| | 2023-6-28 08:52 | 只看该作者
不错哦,价格怎么样呢

使用特权

评论回复
10
nawu| | 2023-7-4 16:04 | 只看该作者
当CPU要进行一次浮点运算时,可通过三种不同的浮点运算器来执行运算

使用特权

评论回复
11
tpgf| | 2023-7-4 16:51 | 只看该作者
有三种方式可以执行:软件仿真器(浮点运算函数库)、附加浮点运算器和集成浮点运算单元

使用特权

评论回复
12
gwsan| | 2023-7-4 17:13 | 只看该作者
目前基于ContexTM构架的ARM处理均集成了浮点运算单元

使用特权

评论回复
13
tfqi| | 2023-7-4 17:24 | 只看该作者
ARM 浮点架构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持

使用特权

评论回复
14
aoyi| | 2023-7-4 18:00 | 只看该作者
在没有硬件浮点运算器的情况下,也可以进行浮点运算,但是计算速度会慢很多

使用特权

评论回复
15
zljiu| | 2023-7-4 18:41 | 只看该作者
在大多数现代计算机的架构中,浮点运算和整数运算是分开的

使用特权

评论回复
16
caigang13| | 2023-7-5 07:26 | 只看该作者
浮点运算单元是硬件实现的,肯定比软件快。

使用特权

评论回复
17
两只袜子| | 2023-7-5 09:33 | 只看该作者
好文章支持一下

使用特权

评论回复
18
两只袜子| | 2023-7-5 09:33 | 只看该作者
好文章支持一下

使用特权

评论回复
19
xiaohn| | 2024-7-26 12:21 | 只看该作者
按照用户手册,的步骤,最终卡在第6步,FPU_ISTS 寄存器一直是busy。
对于 SUM 、SUB 、PRDCT 、SUMSQ ,建议配置如下:
1 - 配置 FPU_CTRL 寄存器,选择需要的模式,
2 - 在 nLEN 字段录入 n 的值,
3 - 设置起始(STR)位
4 - P0 操作数写入 FPU_FPI1
5 - P1..n-1 的操作数依次写入 FPU_FPI2
6 - 等待中断完成或者检查 FPU_ISTS 寄存器的完成(DONE)标志从 FPU_FPO 读取结果

使用特权

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

本版积分规则

37

主题

84

帖子

1

粉丝