Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
时间/日期在MCU上的实现_C_Date_Time_Microcontroller_Elapsedtime - Fatal编程技术网

时间/日期在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;

我正在一个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;       // 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年到现在,这个问题