我如何同时 运行 class 中的某些内容(在单线程平台中)?
How do I run something inside a class concurrently (in single threaded platform)?
我必须编写一个 class 来实现下面给定的接口。当我调用 start 函数时,它应该每 1 毫秒开始计数一次,而当我调用 stop 函数时,它应该停止计数。读取函数应该 return 计数器的值。
我应该如何编写这个实现,因为我正在为没有任何 RTOS 的微控制器实现它。因此,这个项目是严格的单线程的,我没有看到如何在没有线程的情况下实现它。
class Counter{
public:
virtual void stop() = 0;
virtual void start() = 0;
virtual int read() = 0;
};
用法示例:
int main()
{
Counter *cnt = new Counter_Implemented();
cnt->start();
//do some heavy task here
cnt->stop();
int duration = cnt->read();
}
如果您可以在您的 MCU platform/compiler 上访问 std::chrono
,您可以使用下面的代码。否则,解决方案是使用 HAL 或带中断的集成定时器。如
所述
您可以使用两个时间戳之间的差异来实现此目的。让 start
存储当前时间戳,然后停止将存储结束时间戳。 read
然后会给你差异,或者如果计时器当前是 运行,那么得到 now
与起点的差异。那看起来像
class Counter{
public:
void stop()
{
end = std::chrono::steady_clock::now();
}
void start()
{
start = std::chrono::steady_clock::now();
}
int read()
{
if (start >= end) // timmer currently running
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count();
return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}
private
std::chrono::time_point<std::chrono::steady_clock> start{};
std::chrono::time_point<std::chrono::steady_clock> end{};
};
如果您使用 HAL 库:
class Counter{
public:
void stop()
{
end = HAL_GetTick();
}
void start()
{
start = HAL_GetTick();
}
uint32_t read()
{
return end-start;
}
};
如果您希望能够停止计数,只需为此目的使用任何硬件计时器而不是 SysTick。
可能是硬件开发者支持sys/time.h?
有实现:
int getitimer(int, struct itimerval *);
int setitimer(int, const struct itimerval *, struct itimerval *);
int gettimeofday(struct timeval *, void *);
int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
int utimes(const char *, const struct timeval [2]);
我想,其中一个功能可以帮助你/
我必须编写一个 class 来实现下面给定的接口。当我调用 start 函数时,它应该每 1 毫秒开始计数一次,而当我调用 stop 函数时,它应该停止计数。读取函数应该 return 计数器的值。
我应该如何编写这个实现,因为我正在为没有任何 RTOS 的微控制器实现它。因此,这个项目是严格的单线程的,我没有看到如何在没有线程的情况下实现它。
class Counter{
public:
virtual void stop() = 0;
virtual void start() = 0;
virtual int read() = 0;
};
用法示例:
int main()
{
Counter *cnt = new Counter_Implemented();
cnt->start();
//do some heavy task here
cnt->stop();
int duration = cnt->read();
}
如果您可以在您的 MCU platform/compiler 上访问 std::chrono
,您可以使用下面的代码。否则,解决方案是使用 HAL 或带中断的集成定时器。如
您可以使用两个时间戳之间的差异来实现此目的。让 start
存储当前时间戳,然后停止将存储结束时间戳。 read
然后会给你差异,或者如果计时器当前是 运行,那么得到 now
与起点的差异。那看起来像
class Counter{
public:
void stop()
{
end = std::chrono::steady_clock::now();
}
void start()
{
start = std::chrono::steady_clock::now();
}
int read()
{
if (start >= end) // timmer currently running
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start).count();
return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}
private
std::chrono::time_point<std::chrono::steady_clock> start{};
std::chrono::time_point<std::chrono::steady_clock> end{};
};
如果您使用 HAL 库:
class Counter{
public:
void stop()
{
end = HAL_GetTick();
}
void start()
{
start = HAL_GetTick();
}
uint32_t read()
{
return end-start;
}
};
如果您希望能够停止计数,只需为此目的使用任何硬件计时器而不是 SysTick。
可能是硬件开发者支持sys/time.h? 有实现:
int getitimer(int, struct itimerval *);
int setitimer(int, const struct itimerval *, struct itimerval *);
int gettimeofday(struct timeval *, void *);
int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
int utimes(const char *, const struct timeval [2]);
我想,其中一个功能可以帮助你/