我正在研发MCU,我的目标是在MCU上实现时间/日期。
我使用一个每秒滴答的计时器并将其存储在uint32_t count
上,该计时器有足够的大小存储136年。我希望2000作为参考,max应该是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天,而且每4年就有29天。
我看到linux源代码实现,但我认为它是一个操作系统,而不是一个简单的MCU。
任何人都可以暗示我应该在MCU中使用哪种算法,以便它需要min。资源?
例如,使用什么算法来计算此http://www.mathcats.com/explore/elapsedtime.html
如果您有任何代码段,我将不胜感激,如果您可以分享它。
答案 0 :(得分:1)
你必须做数学,没有其他办法解决它。您正在从基数2转换为基数10(基数为10的基数为60)。
同样对于一个月的日子来说,你也必须研究这个问题,每个月都有几天的表格并处理闰年。
进行数学计算的替代方法是改变计算方式,使用更多内存但计算量更少。基本上是BCD方法。当秒数从9滚动到10然后增加数十秒并将秒数设置为0.重复一直到日期。或者在59个卷到零的中途和秒数达到零并且增加分钟...然后执行基础10的东西以将几十分钟与几分钟小时分开。如果你没有分歧,你可以用一张桌子。
答案 1 :(得分:1)
这不是编程问题,因为只有微控制器才能可靠地完成这项工作。内部RC振荡器太不准确,即使您使用高精度外部晶体振荡器,它也会随时间漂移并随温度变化。
唯一正确的解决方案是在硬件上添加实时时钟电路,最好是与备用电池一起使用。如何与实时时钟电路通信是特定于硬件的。
最好在https://electronics.stackexchange.com/上将问题放在边境地区的硬件上。