Time/date 在 MCU 上的实现
Time/date implementation on a MCU
我正在开发 MCU,我的目标是在 MCU 上实现 time/date。
我使用每秒滴答的计时器并将其存储在 uint32_t count
上,它的大小足以存储 136 年。我想以 2000 作为参考,最大应该是 2099。
这是我的数据结构:
typedef struct
{
uint8_t sec; // Seconds. [0-60] (1 leap second)
uint8_t min; // Minutes. [0-59]
uint8_t hour; // Hours. [0-23]
uint8_t day; // Day. [1-31]
uint8_t month; // Month. [0-11]
uint8_t year; // Year - from 2000. [00-99]
} osal_time_t;
使用最少的资源将秒数 (uint32_t count
) 正确转换为 min/hr/day/month/year 的最佳方法是什么?
时间、小时和年份看似简单,但一天变得棘手,28-29-30-31 天,2 月是每 4 年 29 天。
我看到了 linux 源代码实现,但我认为它是 OS 设计的,而不是一个不起眼的 MCU 的最佳选择。
任何人都可以提示我应该在 MCU 中使用哪种算法,以便它至少需要。资源?
举个例子,这个是用什么算法计算的http://www.mathcats.com/explore/elapsedtime.html
如果您有任何代码片段,请与我们分享。
你只能做数学题,别无他法。您正在从基数 2 转换为基数 10(基数 60 以基数 10 表示)。
同样,对于月日的事情,您也必须通过 table 处理每月的天数并处理闰年。
做数学的另一种方法是改变你的计数方式,使用更多的内存但更少的计算。基本上是 BCD 方法。当秒数从 9 滚动到 10 时,然后增加数十秒并将秒数设置为 0。一直重复直到日期。或者遇到一半,超过 59 秒滚动到零并增加分钟......然后做以 10 为底的东西,将几十秒和几秒分小时分开。如果你没有分界线,你可以使用 table。
这不是编程问题,因为仅使用微控制器无法可靠地完成此操作。内部 RC 振荡器太不准确,即使您使用高精度外部 crystal 振荡器,它也会随时间漂移并可能随温度变化。
唯一正确的解决办法是在硬件上加一个实时时钟电路,最好加上备用电池。如何与实时时钟电路通信是硬件相关的。
这种属于硬件边界的问题最好在https://electronics.stackexchange.com/上问。
我正在开发 MCU,我的目标是在 MCU 上实现 time/date。
我使用每秒滴答的计时器并将其存储在 uint32_t count
上,它的大小足以存储 136 年。我想以 2000 作为参考,最大应该是 2099。
这是我的数据结构:
typedef struct
{
uint8_t sec; // Seconds. [0-60] (1 leap second)
uint8_t min; // Minutes. [0-59]
uint8_t hour; // Hours. [0-23]
uint8_t day; // Day. [1-31]
uint8_t month; // Month. [0-11]
uint8_t year; // Year - from 2000. [00-99]
} osal_time_t;
使用最少的资源将秒数 (uint32_t count
) 正确转换为 min/hr/day/month/year 的最佳方法是什么?
时间、小时和年份看似简单,但一天变得棘手,28-29-30-31 天,2 月是每 4 年 29 天。
我看到了 linux 源代码实现,但我认为它是 OS 设计的,而不是一个不起眼的 MCU 的最佳选择。
任何人都可以提示我应该在 MCU 中使用哪种算法,以便它至少需要。资源?
举个例子,这个是用什么算法计算的http://www.mathcats.com/explore/elapsedtime.html
如果您有任何代码片段,请与我们分享。
你只能做数学题,别无他法。您正在从基数 2 转换为基数 10(基数 60 以基数 10 表示)。
同样,对于月日的事情,您也必须通过 table 处理每月的天数并处理闰年。
做数学的另一种方法是改变你的计数方式,使用更多的内存但更少的计算。基本上是 BCD 方法。当秒数从 9 滚动到 10 时,然后增加数十秒并将秒数设置为 0。一直重复直到日期。或者遇到一半,超过 59 秒滚动到零并增加分钟......然后做以 10 为底的东西,将几十秒和几秒分小时分开。如果你没有分界线,你可以使用 table。
这不是编程问题,因为仅使用微控制器无法可靠地完成此操作。内部 RC 振荡器太不准确,即使您使用高精度外部 crystal 振荡器,它也会随时间漂移并可能随温度变化。
唯一正确的解决办法是在硬件上加一个实时时钟电路,最好加上备用电池。如何与实时时钟电路通信是硬件相关的。
这种属于硬件边界的问题最好在https://electronics.stackexchange.com/上问。