【问题标题】:64-bit integer implementation for 8-bit microcontroller8 位微控制器的 64 位整数实现
【发布时间】:2015-04-17 08:08:30
【问题描述】:

我正在开发 OKI 431 微控制器。这是 8 位微控制器。我们不喜欢在我们的项目中执行任何浮点运算,因此我们消除了所有浮点运算并以某种方式将它们转换为整数运算。但是我们不能消除一个浮点运算,因为优化整数运算的计算需要 64 位整数,而 micro 本身并不支持。它具有支持高达 32 位整数运算的 C 编译器。计算时间过长,这对用户来说是显而易见的。

我想知道是否有任何 64 位整数库可以在 C 中轻松用于微控制器编码。或者什么是有效地编写这样的东西的最简单方法?这里有效地意味着所需的时间最少。

提前致谢。

【问题讨论】:

  • 你确定编译器不支持 64 位长整数 unsing long long unsigned 或类似的吗?
  • 是的,我确定。令人惊讶的是,编译器非常基础。
  • 为什么需要 64 位?是什么类型的操作?
  • 它将来自湿度传感器的原始湿度读数转换为实际相对湿度。
  • 您有什么样的高科技湿度传感器需要 64 位?甚至没有任何 A/D 转换器接近这种精度。

标签: c optimization 64-bit performance microcontroller


【解决方案1】:

由于这是一个微控制器,您可能希望使用一个简单的汇编库。它必须支持的操作越少,它就越简单、越小。您可能还会发现,您可以使用小于 64 位的数字(也许是 48 位)并减少运行时间和寄存器要求。

【讨论】:

  • 是的,因为微控制器是 8 位,任何 8 的倍数就足够了。一些 8 位微控制器的编译器甚至可以选择 24 位浮点数。扩展到 64 位数学只会减慢速度
【解决方案2】:

您可能必须进入装配区才能执行此操作。您需要的显而易见的东西是:

  • 加法

  • 2s 补码(反转和递增)

  • 左右算术移位 1

您可以从中构建减法、乘法、长除法和更长的移位。请记住,将两个 64 位数字相乘得到 128 位数字,而长除法可能需要能够获得 128 位被除数。

它看起来慢得令人痛苦,但在这样的机器中假设你需要一个小的足迹,而不是速度。我假设您正在以尽可能低的频率进行这些计算。

开源库可能有一个稍微快一点的方法, 但它也可能更慢。

【讨论】:

  • 关于计算频率:必须定期进行计算。最短时间为 10 秒。
  • @Donotalo:如果基本时钟是 1mhz,我猜乘法或除法大约是毫秒,所以应该没问题。
  • @Donotalo:当然,一个基本的 IEEE 浮点软件库也在同一范围内,而且不会是本土开发的。你的编译器可能自带一个。
  • @Donotalo:有一次我在 8088(16 位寄存器)上逐步完成了 IEEE 浮点加法。它花了大约 300 条指令,其中只有少数是实际添加的。剩下的就是拆包、打包、规范化、检查特殊值等。但如果你不需要高频,它就可以了。
  • 我们可以使用两种时钟速度:32K 和 500K。 32K 是首选。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2019-03-25
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多