C++ 嵌入式系统时钟

C++ 嵌入式系统时钟,c++,c,time,embedded,C++,C,Time,Embedded,我正在开发一个项目,其中我需要支持具有ms粒度的日历+时钟。 我设法配置了芯片的RTC来帮助我计时,但我很难找到正确的数据类型来显示时间 我一直使用time\t(Unix时代),但是它是以秒为基础的,所以不起作用。 那么struct timeval呢?在演示上下文(asctime)中,似乎不支持将此结构作为struct tm 在嵌入式系统中,表示时间的首选方式是什么 注意:此系统与基于java的后端服务器接口,需要与之同步时间,因此我正在寻找一种可以在多种语言中使用的现成结构。您对毫秒粒度的需求

我正在开发一个项目,其中我需要支持具有ms粒度的日历+时钟。 我设法配置了芯片的RTC来帮助我计时,但我很难找到正确的数据类型来显示时间

我一直使用
time\t
(Unix时代),但是它是以秒为基础的,所以不起作用。 那么
struct timeval
呢?在演示上下文(asctime)中,似乎不支持将此结构作为
struct tm

在嵌入式系统中,表示时间的首选方式是什么


注意:此系统与基于java的后端服务器接口,需要与之同步时间,因此我正在寻找一种可以在多种语言中使用的现成结构。

您对毫秒粒度的需求以及与基于java的东西的交互都表明,自epoch以来的64位时间是合适的,直截了当的选择


现在大多数编译器都有64位类型;如果不是,您可以将其作为两种32位类型的结构,以适当的本地endian顺序进行处理,并放入代码来处理进位。

您需要毫秒粒度以及与基于Java的东西进行交互,这两种情况都表明,从epoch开始的64位时间将是一个合适且简单的选择


现在大多数编译器都有64位类型;如果没有,您可以将其作为两个32位类型的结构,以适当的本地endian顺序处理,并输入代码来处理进位。

有毫秒和毫秒,一个简单,另一个困难

我们运行一个1ms硬件定时器中断循环,处理必须在固体光栅上运行的东西(例如电机控制)。我们从这个例程中增加一个全局32位“ticks”值,然后可以使用它来计时需要在亚秒间隔发生的事情(例如每50毫秒轮询一次)

这与使用micro的硬件计时器作为计时基准不同,在这样的系统中,任何东西的精确度都存在问题-从时钟晶体的精确度到所有各种预分频器、中断延迟等等。现在,我们不在乎我们的马达控制程序是每秒运行999次还是每秒运行1001次,也不在乎我们是否每49.5毫秒而不是每50秒轮询一个引脚的状态,因为它足够接近,重要的是它能及时发生。在24小时的过程中,我们很可能会得到比一天中毫秒数更多的“滴答声”,这将成为一个糟糕的手表

例如,时钟预分频器是先计数到N再复位,还是先计数到N-1再复位?它是立即复位还是需要一个时钟周期?这类细节在微型计算机中造成了计时难题

我会将RTC用作一天中的时间参考,然后可能会将ms计数器与秒的滴答声同步(每1Hz RTC中断将“滴答声”重置为0),这意味着您的ms值相对于RTC只会略微偏离。您甚至可以直接读取RTC的输入时钟寄存器,以提取运行RTC的更快时钟(通常为32.768kHz时钟)。我们这样做是为了从1kHz定时器的预分频器时钟寄存器中获取微秒值。它不是完美的,我们不使用它来保持时间,只是为了捕捉次毫秒事件


或者,看看应用程序是否真的需要ms,或者你可以在100ms内编一个数字并报告,这不像JS是原子钟级别的计时方式,甚至不是米老鼠手表级别。如果你真的需要这种准确性,那你就错了。

有毫秒和毫秒,一个很容易,另一个很难

我们运行一个1ms硬件定时器中断循环,处理必须在固体光栅上运行的东西(例如电机控制)。我们从这个例程中增加一个全局32位“ticks”值,然后可以使用它来计时需要在亚秒间隔发生的事情(例如每50毫秒轮询一次)

这与使用micro的硬件计时器作为计时基准不同,在这样的系统中,任何东西的精确度都存在问题-从时钟晶体的精确度到所有各种预分频器、中断延迟等等。现在,我们不在乎我们的马达控制程序是每秒运行999次还是每秒运行1001次,也不在乎我们是否每49.5毫秒而不是每50秒轮询一个引脚的状态,因为它足够接近,重要的是它能及时发生。在24小时的过程中,我们很可能会得到比一天中毫秒数更多的“滴答声”,这将成为一个糟糕的手表

例如,时钟预分频器是先计数到N再复位,还是先计数到N-1再复位?它是立即复位还是需要一个时钟周期?这类细节在微型计算机中造成了计时难题

我会将RTC用作一天中的时间参考,然后可能会将ms计数器与秒的滴答声同步(每1Hz RTC中断将“滴答声”重置为0),这意味着您的ms值相对于RTC只会略微偏离。您甚至可以直接读取RTC的输入时钟寄存器,以提取运行RTC的更快时钟(通常为32.768kHz时钟)。我们这样做是为了从1kHz定时器的预分频器时钟寄存器中获取微秒值。它不是完美的,我们不使用它来保持时间,只是为了捕捉次毫秒事件


或者,看看应用程序是否真的需要ms,或者你可以在100ms内编一个数字并报告,这不像JS是原子钟级别的计时方式,甚至不是米老鼠手表级别。如果你真的需要这种准确性,那你就错了。

你有操作系统吗?@JoachimPileborg,目前没有操作系统存在或代表?挑一个。@LightnessRacesinOrbit没关系,我可以用