打印
[技术问答]

hc32f460浮点运算很费时间吗?

[复制链接]
1881|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机使用的hc32f460jeua,系统时钟设置的为200M,见图片获取时钟参数,
然后在ADC中断内执行少量的浮点运算,ADC中断周期为50us,在ADC执行的函数插上IO口跳变,开始然LED1跳变,LED1对示波器蓝色,然后运算开始和结尾用LED0来指示跳变,LED0对应示波器黄色,见示波器抓拍图片,在蓝色的1和2跳变之间只执行了4条语句,用时17Us,请问这个正常吗?执行浮点运算这么耗时吗?

IO跳变抓.jpg (364.58 KB )

1和2跳变用了17us

1和2跳变用了17us

IO口跳变.png (338.32 KB )

AD中断内执行的运算

AD中断内执行的运算

1和2条执行程序.png (310.86 KB )

1和2跳变执行的代码

1和2跳变执行的代码

获取时钟参数.png (276.97 KB )

系统时钟参数设置

系统时钟参数设置

使用特权

评论回复
沙发
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周期,相当于慢了一倍。

使用特权

评论回复
5
xch| | 2021-12-2 17:17 | 只看该作者
改成双精度运算,且打开FPU 运算时间增加到523拍,523/144微秒。不到4微秒。

使用特权

评论回复
6
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");
}

使用特权

评论回复
7
caigang13| | 2021-12-2 21:18 | 只看该作者
如果没有FPU的话是这样

使用特权

评论回复
8
地瓜patch| | 2021-12-2 22:22 | 只看该作者
费,很费

使用特权

评论回复
9
xch| | 2021-12-3 09:21 | 只看该作者
以上数据说明你的MCU 时钟频率不是200MHZ. 可能仅20MHz 左右

使用特权

评论回复
10
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微秒.

使用特权

评论回复
11
yangjiaoshai|  楼主 | 2021-12-3 13:12 | 只看该作者
第一个是没打开FPU,然后我把费时的计算优化了,基本可以了

使用特权

评论回复
12
james03| | 2021-12-3 13:43 | 只看该作者
1)、确认开启了硬件FPU
2)、确认是否开启了硬件Cache
3)、如何不是必须要求使用双精度,可以使用单浮点运算

使用特权

评论回复
13
cyclefly| | 2021-12-7 15:22 | 只看该作者
貌似相对来说是比较费时的

使用特权

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

本版积分规则

11

主题

43

帖子

2

粉丝