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/上问。