这一章在干嘛?
FPU 实验:Cortex-M4F 单精度浮点单元、Julia 分形绘制、性能对比(不开 FPU vs 开 FPU)。
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.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.3.1:开启 FPU 后分形图渲染加速
36.4 下载验证
LCD 上显示 Julia 分形图,按 KEY0/KEY_UP 改变参数,分图实时变化。
性能对比:关闭 FPU 渲染一帧约 30 秒,开启后 3 秒。差别来自「float vs double + 软件模拟」。
Cortex-M4F 是否内置 FPU?
是。
FPU 计算精度?
单精度 float(32 位)。
如何开启 FPU?
MDK 选 FPU + Define 加
__FPU_PRESENT=1, __FPU_USED=1。