[技术问答] hc32f460浮点运算很费时间吗?

[复制链接]
2230|12
 楼主| yangjiaoshai 发表于 2021-12-2 14:41 | 显示全部楼层 |阅读模式
单片机使用的hc32f460jeua,系统时钟设置的为200M,见图片获取时钟参数,
然后在ADC中断内执行少量的浮点运算,ADC中断周期为50us,在ADC执行的函数插上IO口跳变,开始然LED1跳变,LED1对示波器蓝色,然后运算开始和结尾用LED0来指示跳变,LED0对应示波器黄色,见示波器抓拍图片,在蓝色的1和2跳变之间只执行了4条语句,用时17Us,请问这个正常吗?执行浮点运算这么耗时吗?

系统时钟参数设置

系统时钟参数设置

1和2跳变执行的代码

1和2跳变执行的代码

AD中断内执行的运算

AD中断内执行的运算

1和2跳变用了17us

1和2跳变用了17us
sjnh 发表于 2021-12-2 14:49 | 显示全部楼层
M4硬件只支持单精度浮点计算,而C语言默认是双精度的浮点运算,可能速度并不快
martinhu 发表于 2021-12-2 16:01 | 显示全部楼层
FPU功能不是默认就使能的,需要配置之后才可以,否则对应的运算就很慢,开启方法和友商的一样,因为属于内核的东西 。
xch 发表于 2021-12-2 17:13 | 显示全部楼层
不正常。你是不是没有打开FPU?

我有个程序也是ADC信号处理,MCU主频设置144MHZ:
{
  Vbat_mv = (ADC_VREFINT*48000+ (adc_result[0]>>1)) /adc_result[0];
  tmp = (float)adc_result[1] *(float)Vbat_mv;
  tmp = tmp/3000.0;
  asm("nop");
  tmp = tmp/16.0;
  Tamb = (tmp -TS_CAL1 )*(130-30)/(TS_CAL2-TS_CAL1)+30-4.3;
  Tamb_int = (int16_t)(Tamb*10);
   
  Vsen_uv = ( (uint32_t)adc_result[2] *(uint32_t)3300*125 +4096 )>>(13);
}

打开FPU,计算394~398周期,相当于494/144 微秒; (第一次运算慢些398拍)
关闭FPU,计算979~980周期,相当于慢了一倍。
xch 发表于 2021-12-2 17:17 | 显示全部楼层
改成双精度运算,且打开FPU 运算时间增加到523拍,523/144微秒。不到4微秒。
xch 发表于 2021-12-2 17:41 | 显示全部楼层
按照你的函数CurrentReconstruction,在我的144MHZ mcu上跑了457拍,3微秒多.
使用双精度。
uint32_t cnt_dsp;
double ia,ib,ic;
const double ia_offset= 0.1,ib_offset= 0.2,ic_offset= 0.3;
void Dsp(void)
{
  cnt_dsp = TIM2->CNT;
  ia = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ib = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ic = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ib = 0.0 -ia-ic;  
  cnt_dsp = TIM2->CNT-cnt_dsp;
  asm("nop");
}
caigang13 发表于 2021-12-2 21:18 来自手机 | 显示全部楼层
如果没有FPU的话是这样
地瓜patch 发表于 2021-12-2 22:22 | 显示全部楼层
费,很费
xch 发表于 2021-12-3 09:21 | 显示全部楼层
以上数据说明你的MCU 时钟频率不是200MHZ. 可能仅20MHz 左右
oufuqiang 发表于 2021-12-3 10:13 | 显示全部楼层
本帖最后由 oufuqiang 于 2021-12-3 10:49 编辑

unsigned int long cnt_dsp;
double ia,ib,ic,adc_result[3];
const double ia_offset= 0.1,ib_offset= 0.2,ic_offset= 0.3;
void Dsp(void)
{
  ia = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ib = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ic = ( (double )adc_result[0] -ia_offset ) *0.00234;
  ib = 0.0 -ia-ic;  
}

void main()
{
        while(1)
        {
                Dsp();
        }
}

这个我放到51上面试了试,1217个时钟,慢3倍,同频率下,感觉还能接受。35MHz  40微秒.
 楼主| yangjiaoshai 发表于 2021-12-3 13:12 | 显示全部楼层
第一个是没打开FPU,然后我把费时的计算优化了,基本可以了
james03 发表于 2021-12-3 13:43 | 显示全部楼层
1)、确认开启了硬件FPU
2)、确认是否开启了硬件Cache
3)、如何不是必须要求使用双精度,可以使用单浮点运算
cyclefly 发表于 2021-12-7 15:22 | 显示全部楼层
貌似相对来说是比较费时的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

43

帖子

2

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