8位微控制器的64位整数实现

3
我正在处理OKI 431微控制器。这是一款8位微控制器。我们不希望在项目中执行任何浮点运算,因此我们以某种方式将所有浮点运算转换为整数运算。但是我们不能消除一个浮点运算,因为优化整数运算的计算需要64位整数,而该微控制器并不原生支持它。它有支持最多32位整数运算的C编译器。计算需要太长时间,用户可以明显感觉到。
我想知道是否有任何可轻松用于微控制器编程的64位整数库。或者编写这样的东西的最简单方法是什么?在这里,“高效”意味着最小化所需时间。
提前致谢。

是的,我确定。这很令人惊讶,但编译器非常基础。 - Donotalo
1
你们使用什么需要64位的高科技湿度传感器?甚至没有任何接近那种精度的A/D转换器。 - starblue
非常抱歉,我未能澄清这一点。我正在使用Sensirion的湿度传感器。对于12位分辨率,他们提供了一个涉及浮点运算的方程。该方程很简单。但是,如果我需要使用整数执行整个操作,然后进行四舍五入,那将需要64位整数。 - Donotalo
(15955 * read_out_16bit * read_out_16bit) / 10e10 + 20498 / 10e4 这个表达式需要使用64位整数才能得到正确结果,当前的实现是使用了双精度数据类型。read_out_16bit 是传感器读取到的16位无符号整数。 - Donotalo
@Donotalo:那里不需要64位整数。计算平方,除以100000,乘以15955,再除以100,最后加上20498。结果应该是以.0001为单位的整数。虽然不是绝对精确,但可能远远超出传感器的精度范围。 - supercat
显示剩余5条评论
3个回答

3

由于这是一个微控制器,您可能希望使用一个简单的汇编库。它支持的操作越少,它就越简单、更小巧。您也可能发现,您可以使用小于64位的数字(例如48位),从而减少运行时间和寄存器需求。


是的,由于微控制器是8位的,任何8的倍数都足够了。一些针对8位微控制器的编译器甚至有24位浮点数的选项。扩展到64位数学运算只会使其变慢。 - phuclv

2
您可能需要进入汇编语言来完成这个任务。显而易见,您需要的是:
  • 加法

  • 2s补码(反码加一)

  • 左右算术移位1位

通过这些,您可以构建减法、乘法、长除法和更长的移位操作。请记住,两个64位数相乘会得到一个128位的结果,而长除法可能需要能够处理128位的被除数。
这可能看起来很慢,但在这样的机器上,假设您需要一个小的占用空间,而不是速度。我假设您正在使用尽可能低频的频率进行计算。
开源库可能有一种稍微快一点的方法来完成它,但它也可能比较慢。

关于计算频率:计算必须定期进行。最小周期为10秒。 - Donotalo
@Donotalo:如果基本时钟是1MHz,我猜乘法或除法的时间应该在毫秒级别,所以应该没问题。 - Mike Dunlavey
1
@Donotalo:当然,一个基本的IEEE浮点数软件库也会在同一范围内,并且不是自制的。你的编译器可能已经带有这样一个库。 - Mike Dunlavey
@Donotalo:曾经我在8088(16位寄存器)上执行了IEEE浮点加法。它大约需要300条指令,其中只有少数是实际的加法。其余的是解包、打包、归一化、检查特殊值等等。但如果你不需要高频率,它完全可以正常工作。 - Mike Dunlavey
我们可以使用两个时钟速度:32K和500K。32K是首选。 - Donotalo
@Donotalo:所以基本操作可能需要30-60毫秒。 - Mike Dunlavey

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接