这一章在干嘛?

FPU 实验:Cortex-M4F 单精度浮点单元、Julia 分形绘制、性能对比(不开 FPU vs 开 FPU)。

36.1 FPU & Julia 分形简介

36.2 硬件设计

36.3 程序设计

36.4 下载验证

36.1 FPU & Julia 分形简介

36.1.1 FPU

FPU(Floating Point Unit):硬件单精度浮点(float)运算单元。

  • Cortex-M4F 内置 FPU;
  • 32 位 float 一次 1 个时钟周期;
  • 比软件模拟快 10~100 倍。

注意:FPU 只算 float(32 位),double(64 位)还是软件模拟。如果你的代码全是 double,请改为 float。

36.1.2 Julia 分形

Julia 集合是一种经典分形图,由复数迭代公式 z = z² + c 生成。

原书图 36.1.2.1:Julia 分形图原书图 36.1.2.1:Julia 分形图

36.2 硬件设计

TFTLCD 显示分形图,KEY0/KEY_UP 切换 c 参数。

36.3 程序设计

36.3.1 开启 FPU

  • MDK:Target → Floating Point Hardware → Single Precision
  • Define:__FPU_PRESENT=1, __FPU_USED=1
  • CubeMX:Project Manager → Project Settings → Advanced Settings → 勾选 FPU

36.3.2 关键代码

void julia(int x, int y, float cx, float cy) {
    float zx = (x - 200) / 200.0f;
    float zy = (y - 240) / 200.0f;
    int iter = 0;
    while (zx*zx + zy*zy < 4.0f && iter < 100) {
        float tmp = zx*zx - zy*zy + cx;
        zy = 2.0f * zx * zy + cy;
        zx = tmp;
        iter++;
    }
    LCD_DrawPoint(x, y, iter_color(iter));   // 按迭代次数上色
}

main:
    while (1) {
        for (int y = 0; y < 480; y++)
            for (int x = 0; x < 800; x++)
                julia(x, y, cx, cy);
    }

原书图 36.3.2.1:FPU 开启前后性能对比原书图 36.3.2.1:FPU 开启前后性能对比

原书图 36.3.3.1:开启 FPU 后分形图渲染加速原书图 36.3.3.1:开启 FPU 后分形图渲染加速

36.4 下载验证

LCD 上显示 Julia 分形图,按 KEY0/KEY_UP 改变参数,分图实时变化。

性能对比:关闭 FPU 渲染一帧约 30 秒,开启后 3 秒。差别来自「float vs double + 软件模拟」。