【发布时间】:2021-08-08 03:52:26
【问题描述】:
在特定的 STM32 微控制器上,系统时钟由 PLL 驱动,其频率 F 由以下公式给出:
F := (S/M * (N + K/8192)) / P
S 是 PLL 输入源频率(1 - 64000000,或 64 MHz)。
其他因素M、N、K和P是用户可以修改以校准频率的参数。从我使用的 SDK 中的位掩码来看,每个位掩码的值可以限制为最大 M < 64、N < 512、K < 8192 和 P < 128。
不幸的是,我的目标固件不支持 FPU,所以浮点运算不可用。相反,我需要使用纯整数算法来计算 F。
我试图重新排列给定的公式,考虑到 3 个目标:
- 扩展和分配所有乘法因子
- 最小化每个分母中的因子数
- 尽量减少执行的分区总数
- 如果两个表达式具有相同的除数,请选择分母具有最小最大值的一个(在前面的段落中确定)
但是,我每次尝试扩展和重新排列表达式都会产生大于的错误,因为它最初是逐字表达的。
为了测试公式的不同排列并比较错误,我写了a small Go program you can run online here。
是否可以改进这个公式,以便在使用整数运算时将误差降至最低?还有我上面列出的任何目标不正确或无用吗?
【问题讨论】:
-
避免 FP 的另一个原因是该代码是从中断服务例程中调用的,其中 FP 中断会增加复杂性并且最好避免。请记住,我提到这是在 STM32 微控制器上运行的代码。
-
@StevenPenny 你能解释一下为什么你删除了你原来的评论并且现在投票结束这个问题吗?如果我做错了什么,知道将来不应该做什么以获得支持性答案会很有帮助
标签: go integer subtraction arithmetic-expressions tinygo