用于备忘。
编译器环境
编译器:gcc
硬件:STM32F407IGT6,168MHz
测试结果
计算 value = r*arm_sin_f32(x), 大约 2583915 次/秒(258万次)
计算 value = r*arm_sin_f32(x)+ r*arm_cos_f32(x); 大约1441832次/秒(144万次)
测试方法
在测试函数中循环进行浮点运算,定时器中断后输出计算次数。
1.变量设置
static uint8_t times_up_cnt; //计算1s中断发生的次数
static float32_t x; //弧度值
static float32_t value; //保存计算结果
static uint32_t cnt; //计算次数
2.测试函数
void FPU_Test()
{
times_up_cnt = 0; //设置初值
float32_t r = 1.0f; //设置初值
HAL_TIM_Base_Start_IT(&htim4); //启动定时器
//**************************测试循环********************************
while(1)
{
x = 0.523598f; //设置初值
sin_value = r*arm_sin_f32(x_value); //浮点数运算
cnt++; //计算完毕cnt+1
if(times_up_cnt==30) //判断定时器溢出次数
{
HAL_TIM_Base_Stop_IT(&htim4); //停止定时器
break; //跳出循环
}
}
//******************************************************************
}
3.定时器中断服务函数
//定时器更新中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim4)
{
//输出计算结果
printf("#%d FPU Calculate frequence is %ldtimes/s.\n",times_up_cnt,cnt);
//溢出计数+1
times_up_cnt++;
//次数计数器清零
cnt = 0;
}
}
4.输出
后话:如何找到需要的定时器中断函数
关于为何使用定时器中断服务函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)的说明
CubeMX版本:6.10.0
固件库版本:STM32Cube FW_F4 V1.28.0
以下分析不一定适合其他固件版本。