hc32f460浮点运算很费时间吗?
单片机使用的hc32f460jeua,系统时钟设置的为200M,见图片获取时钟参数,然后在ADC中断内执行少量的浮点运算,ADC中断周期为50us,在ADC执行的函数插上IO口跳变,开始然LED1跳变,LED1对示波器蓝色,然后运算开始和结尾用LED0来指示跳变,LED0对应示波器黄色,见示波器抓拍图片,在蓝色的1和2跳变之间只执行了4条语句,用时17Us,请问这个正常吗?执行浮点运算这么耗时吗?
M4硬件只支持单精度浮点计算,而C语言默认是双精度的浮点运算,可能速度并不快 FPU功能不是默认就使能的,需要配置之后才可以,否则对应的运算就很慢,开启方法和友商的一样,因为属于内核的东西 。 不正常。你是不是没有打开FPU?
我有个程序也是ADC信号处理,MCU主频设置144MHZ:
{
Vbat_mv = (ADC_VREFINT*48000+ (adc_result>>1)) /adc_result;
tmp = (float)adc_result *(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 *(uint32_t)3300*125 +4096 )>>(13);
}
打开FPU,计算394~398周期,相当于494/144 微秒; (第一次运算慢些398拍)
关闭FPU,计算979~980周期,相当于慢了一倍。 改成双精度运算,且打开FPU 运算时间增加到523拍,523/144微秒。不到4微秒。 按照你的函数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 -ia_offset ) *0.00234;
ib = ( (double )adc_result -ia_offset ) *0.00234;
ic = ( (double )adc_result -ia_offset ) *0.00234;
ib = 0.0 -ia-ic;
cnt_dsp = TIM2->CNT-cnt_dsp;
asm("nop");
} 如果没有FPU的话是这样 费,很费 以上数据说明你的MCU 时钟频率不是200MHZ. 可能仅20MHz 左右 本帖最后由 oufuqiang 于 2021-12-3 10:49 编辑
unsigned int long cnt_dsp;
double ia,ib,ic,adc_result;
const double ia_offset= 0.1,ib_offset= 0.2,ic_offset= 0.3;
void Dsp(void)
{
ia = ( (double )adc_result -ia_offset ) *0.00234;
ib = ( (double )adc_result -ia_offset ) *0.00234;
ic = ( (double )adc_result -ia_offset ) *0.00234;
ib = 0.0 -ia-ic;
}
void main()
{
while(1)
{
Dsp();
}
}
这个我放到51上面试了试,1217个时钟,慢3倍,同频率下,感觉还能接受。35MHz40微秒. 第一个是没打开FPU,然后我把费时的计算优化了,基本可以了 1)、确认开启了硬件FPU
2)、确认是否开启了硬件Cache
3)、如何不是必须要求使用双精度,可以使用单浮点运算 貌似相对来说是比较费时的
页:
[1]