时间/日期在MCU上的实现
我正在一个MCU上工作,我的目标是在MCU上实现时间/日期 我使用一个计时器,它每秒钟滴答一次,并将其存储在时间/日期在MCU上的实现,c,date,time,microcontroller,elapsedtime,C,Date,Time,Microcontroller,Elapsedtime,我正在一个MCU上工作,我的目标是在MCU上实现时间/日期 我使用一个计时器,它每秒钟滴答一次,并将其存储在uint32\u 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;
uint32\u 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中使用哪种算法,以使它需要最少的资源吗
例如,使用什么算法来计算此值
如果您有任何代码片段,如果您能与我分享,我将不胜感激。您只需进行计算,没有其他方法可以解决。您正在从基数2转换为基数10(基数10表示基数60) 同样地,对于月-日的事情,你也必须苦读一遍,用一张每月天数的表格来处理闰年
做数学的另一个选择是改变你的计算方式,使用更多的内存但更少的计算。基本上是BCD方法。当秒数从9滚动到10时,则增加数十秒,并将秒数设置为0。一直重复到日期。或者在59次掷骰的过程中进行一半秒的掷骰,掷骰到零,并以分钟为增量…然后用10为基数,将10秒和1秒的掷骰分开。如果你没有除法,你可以用一张表来计算。你只需要做数学运算,没有其他办法。您正在从基数2转换为基数10(基数10表示基数60) 同样地,对于月-日的事情,你也必须苦读一遍,用一张每月天数的表格来处理闰年
做数学的另一个选择是改变你的计算方式,使用更多的内存但更少的计算。基本上是BCD方法。当秒数从9滚动到10时,则增加数十秒,并将秒数设置为0。一直重复到日期。或者在59次掷骰的过程中进行一半秒的掷骰,掷骰到零,并以分钟为增量…然后用10为基数,将10秒和1秒的掷骰分开。如果你没有除法,你可以用一个表来表示。这不是一个编程问题,因为你不能用一个微控制器来可靠地完成。一个内部RC振荡器将是太不准确了,即使你使用一个高精度的外部晶体振荡器,它会随着时间漂移,并可能随温度变化 唯一正确的解决方案是在硬件上添加一个实时时钟电路,最好与备用电池一起使用。如何与实时时钟电路通信是特定于硬件的
最好问这样的问题,这些问题与硬件有关。这不是一个编程问题,因为单用微控制器无法可靠地做到这一点。一个内部RC振荡器将是太不准确了,即使你使用一个高精度的外部晶体振荡器,它会随着时间漂移,并可能随温度变化 唯一正确的解决方案是在硬件上添加一个实时时钟电路,最好与备用电池一起使用。如何与实时时钟电路通信是特定于硬件的
最好问一些与硬件有关的问题。我只想指出,您可以获得RTC(实时时钟)易趣上的便士模块实现了非常简单的通信接口,并且通常有一个电池槽,即使MCU关闭,也能让它们运行数年。你能不能不使用time C库?闻起来像是X-Y问题。为什么你需要将秒数转换为时间+日期+年份,谁会在乎呢?@MatthewGoulart:1)易趣对于专业产品来说是一个坏来源(我们不知道!)2)人们通常没有空间使用额外的硬件,或者重量是个问题3)甚至一些“便士”对于大批量产品来说是一个问题4)在软件中实现这一点是一个很好的做法。我不想解释所有的实现以及为什么,因为问题太长,相关信息太多。我知道RTC,但无法在我的应用程序中使用。我正在利用这段时间为一天中的特定时间安排活动。例如,用户可以在2月27日的4:30:27安排系统应该做什么。由于flash限制,我计划每月更新计划。2月27日转换的一个首选项。。。从2000年到现在,问题都是一样的,用什么算法来计算经过的时间我想指出的是,你可以得到RTC(实时时钟)易趣上的便士模块实现了非常简单的通信接口,并且通常有一个电池槽,即使MCU关闭,也能让它们运行数年。你能不能不使用time C库?闻起来像是X-Y问题。为什么你需要将秒数转换为时间+日期+年份,谁会在乎呢?@MatthewGoulart:1)易趣对于专业产品来说是一个坏来源(我们不知道!)2)人们通常没有空间使用额外的硬件,或者重量是个问题3)甚至一些“便士”对于大批量产品来说是一个问题4)在软件中实现这一点是一个很好的做法。我不想解释所有的实现以及为什么,因为问题太长,相关信息太多。我知道RTC,但无法在我的应用程序中使用。我正在利用这段时间为一天中的特定时间安排活动。例如,用户可以在2月27日的4:30:27安排系统应该做什么。由于flash限制,我计划每月更新计划。2月27日转换的一个首选项。。。从2000年到现在,这个问题