如何在一个类里面并发运行一些东西(在单线程平台中)?

问题描述 投票:0回答:2

我要写一个类,实现下面给定的接口,当我调用启动函数时,它应该每1毫秒开始计数,当我调用停止函数时,它应该停止计数。当我调用start函数时,它应该每1毫秒开始计数,当我调用stop函数时,它应该停止计数。读取函数应该返回计数器的值。

我应该如何写这个实现,因为我是在一个没有任何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();
}
c++ c++17 microcontroller stm32 single-threaded
2个回答
1
投票

如果你使用HAL库。

class Counter{
public:
    void stop()
    {
        end = HAL_GetTick();
    }
    void start() 
    { 
        start = HAL_GetTick();
    }
    uint32_t read()  
    {
        return end-start;
    }
};

如果你想停止计数,就用任何硬件定时器来代替SysTick.


3
投票

如果你有访问 std::chrono 在你的MCU平台的编译器上,你可以使用下面的代码。否则,解决办法就是使用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{};
};

0
投票

可能是开发商的硬件支持 systime.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]);

我想,其中一个函数可以帮助你。

© www.soinside.com 2019 - 2024. All rights reserved.