【问题标题】:What timestamp would have the best space efficiency with a 10 year span and 1 second resolution?在 10 年跨度和 1 秒分辨率下,哪个时间戳具有最佳空间效率?
【发布时间】:2011-08-23 13:38:20
【问题描述】:

对于低端嵌入式微控制器(8 位),哪种时间戳结构最小?我也在考虑定制的。由于计算能力非常有限,读取秒、小时或天等也很重要。

This question 涵盖了我的问题,但我需要代表下一个至少 10 年,分辨率为秒。

更新: 我将在有限的 EEPROM 空间中存储许多时间戳。所以尺寸效率对我来说更重要。计算(确定当前时间戳大于另一个 2 或 3 个,在定制设计的液晶显示器上显示当前时间戳)通常每秒进行一次。

【问题讨论】:

  • 需要对时间戳进行哪些类型的操作?

标签: c embedded timestamp


【解决方案1】:

我需要以秒的分辨率代表下一个至少 10 年

如果您使用uint32_t,那么您在 2038 年之前都可以使用这些时间戳。使用localtimegmtime 等,如果需要,可以将它们转换为struct tm,并提取日期、月份等。

【讨论】:

  • 其实连签名 int32_t都可以到2038年; unsigned 将持续两倍的时间。
  • 遗憾的是我的编译器没有time.h。所以我必须实现标准时间类型和功能。
  • @Berk Demirkır 您可以从某个地方(例如 BSD)获取这些功能。
  • 在使用过的编译器上,我发现 IAR 有标准库,包括 time_t 和相关函数。我会走那条路。谢谢。
【解决方案2】:

这在一定程度上取决于您要对所述时间戳做什么以及它将来自何处。

通常在嵌入式情况下,系统会有一个 RTC(实时时钟),你有吗?或者您是否使用处理器时钟和/或 1Hz 定时器来跟踪时间?如果您确实有 RTC,我会倾向于使用时钟格式并保存任何进一步的处理。

同样相关的是你是否需要在本地处理这个时间戳?如果您需要在 micro 本身上使用它,那么以类似于您需要的格式保存它会有明显的好处。例如,如果您需要在屏幕上显示日期,将其保存为类似于您已链接的answer 的打包格式是有意义的。

一般来说,尽管对于大多数嵌入式工作,我发现如前所述,使用 32 位无符号整数表示您选择的任何时期的秒数是最好的。如果您必须比较值,这是一个不错的选择,因为它是简单的算术比较。

根据 BCD 十进制,有很多关于将 BCD 转换为 example 的问题,虽然该问题最初是 C#,但在 C 中的答案应该几乎相同。

【讨论】:

  • 是的,我正在使用微控制器的 RTC,但它的格式是基于 BCD 的。我不想用 bcd 格式浪费 eeprom 空间
  • 该格式是否包含年、月、日、小时、秒或其中的某些子集,例如仅天、小时、秒?
  • 更新了我的问题。我经常需要与其他时间戳进行比较。我还需要以标准格式在 lcd 上显示它们
【解决方案3】:

由于 π 秒是一个纳米世纪(或 3100 万秒是一年),您需要能够表示高达 3.2×108 的值来存储长达 10 年的数据。因此,您至少需要 29 位来存储这些值,这使得 32 位数字成为显而易见的选择。您需要考虑如何定义您的纪元 - 时间 0 的开始日期。但是 32 位有符号数最多可以存储 68 年的秒数(想想 Unix;time_t 的 32 位有符号值支持范围 1970-2037),范围很广。

【讨论】:

  • 你偏离了 2 倍:2^32 秒 = 136.1 年。带 0 = Jan 1 1970 的带符号的 32 位 #s 支持 1901 年 12 月 13 日-2038 年 1 月 18 日的范围;无符号 32 位 #s 支持 1970 年 1 月 1 日至 2106 年 2 月 7 日。
  • 我说带符号的 32 位数字最多可以支持 68 年;那是 68 年,也可能是 68 年的负向。如果你去无符号,那么范围是加倍的,当然。 (我确实折扣了 2038 年的 18 天 - 我说的是圆形术语。)
【解决方案4】:

一天有 86,400 秒。

暂时忽略闰年(和闰秒),一年有 31,536,000 秒。

这在 10 年内产生了 315,360,000 个。

加上 10 年内可能出现的三个闰日,你得到:315,619,200

该数字需要 29 位来表示,因此您不妨使用 32 位表示。

【讨论】:

    【解决方案5】:

    我会使用无符号的 32 位。编写一个例程将当前日期/时间转换为自开始时间以来的秒数,并编写一个例程将秒数转换为日期/时间。

    每个设备都可以使 0 成为第一个输入设备的日期/时间。然后,每当输入或输出日期/时间时,都会使用正确的功能对其进行按摩。用户从不知道自设置日期/时间以来,值在内部存储为秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-17
      • 2011-01-25
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多