如何在类中同时运行某些内容(在单线程平台中)?
How do I run something inside a class concurrently (in single threaded platform)?
>我必须编写一个实现以下给定接口的类。当我调用 start 函数时,它应该每 1 毫秒开始计数一次,当我调用 stop 函数时,它应该停止计数。read 函数应返回计数器的值。
我应该如何编写此实现,因为我正在为没有任何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平台/编译器上的std::chrono
,则可以使用以下代码。否则,解决方案是使用 HAL 或带中断的集成计时器。如P__J__所述
您可以使用两个时间戳之间的差异来实现此目的。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]);
我认为,此功能之一可以帮助您/
相关文章:
- 在C/C++中执行"_dl_init"(程序初始化)是单线程的吗
- 特定对象文件的单线程生成
- 如何在类中同时运行某些内容(在单线程平台中)?
- GDB 8.1 无法在单线程简单程序中跟踪 std::string 变量的值
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- OpenMP:共享同一算法的单线程和多线程实现
- std::原子布尔值或普通全局布尔值在单线程中很好吗?
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- C++多线程操作比单线程慢
- 多线程和单线程代码维护
- 线程池的计时测试:单线程 vs 回调 tp vs 未来 tp
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- C++多线程性能比单线程代码慢
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 从单线程到多线程图像处理
- 当发送多个同时请求时,单线程异步系统中Beast Boost异步HTTP客户端的行为
- 在单线程中使用 asio::async_write 时获得"the requested resource is in use"
- 在C++中,如何在并发读取和锁定的单线程写入uncodered_map之间进行交替
- wxWidgets-单线程多任务处理
- C:pthread的性能,比单线程低