0

我正在开发 MCU,我的目标是在 MCU 上实现时间/日期。

我使用一个每秒滴答的计时器并将其存储在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使用最少的资源正确地将秒()转换为分钟/小时/天/月/年的最佳方法是什么?

时间、小时和年份似乎很简单,但一天变得棘手,有 28-29-30-31 天,而 2 月是每 4 年 29 天。

我看到了 linux 源代码实现,但我认为它是一个操作系统,而不是一个不起眼的 MCU。

任何人都可以暗示我应该在 MCU 中使用哪种算法,以便它需要最少。资源?

例如,使用什么算法来计算这个http://www.mathcats.com/explore/elapsedtime.html

如果您有任何代码片段,如果您能分享它,我将不胜感激。

4

2 回答 2

1

你必须做数学,没有其他办法。您正在从以 2 为基数转换为以 10 为基数(以 10 为基数表示以 60 为基数)。

同样对于月日的东西,您也必须通过某种表格来处理每月几天的表格并处理闰年。

做数学的替代方法是改变你的计数方式,使用更多的内存但更少的计算。基本上是 BCD 方法。当秒数从 9 滚动到 10 时,增加数十秒并将秒数设置为 0。一直重复直到日期。或者在 59 次滚动到零并增加分钟的中途和秒数中相遇……然后做以 10 为基础的东西,将十数与秒数小时分开。如果你没有分隔线,你可以使用一张桌子。

于 2016-03-31T14:01:40.920 回答
1

这不是编程问题,因为仅使用微控制器无法可靠地做到这一点。内部 RC 振荡器会太不准确,即使您使用高精度的外部晶体振荡器,它也会随着时间的推移而漂移,并可能随温度而变化。

唯一正确的解决方案是在硬件中添加实时时钟电路,最好与备用电池一起使用。如何与实时时钟电路通信是特定于硬件的。

最好在https://electronics.stackexchange.com/上询问硬件边界上的此类问题。

于 2016-03-31T14:24:57.867 回答