C++:在 NIOS II 上多次使用 alt_alarm

C++: Use alt_alarm multiple times on NIOS II

提问人:l3LAETTI 提问时间:11/9/2023 最后编辑:l3LAETTI 更新时间:11/9/2023 访问量:42

问:

我有一个计时器类,如下所示:

class CallbackTimer {
public:
    CallbackTimer(unsigned int time, unsigned int (*callback) (void* context), void *context){
    m_time = time;
    m_callback = callback;
    m_context = context;
    }

    alt_alarm m_alarm;
    long unsigned int (*m_callback)(void *);
    void *m_context;
    long unsigned int m_time;
}

我想做一个每秒调用一次回调的循环函数。此函数如下所示:

// is static because it calls itself with alt_alarm
static long unsigned int CallbackTimer::loop(void* vpTimer){
    // void* gets used because alt_alarm_start requieres a void* as a param
    CallbackTimer* timer = static_cast<CallbackTimer*>(vpTimer);
    CallbackTimer* newTimer = new CallbackTimer(*timer);
    delete timer;

    newTimer->m_callback(newTimer->m_context);

    alt_alarm_stop(&(newTimer->m_alarm));
    alt_alarm_start(&(newTimer->m_alarm), newTimer->m_time, CallbackTimer::loop, 
                    static_cast<void*>(newTimer));
    return 0;
}

它将主要用于以下方面:

// Note that Communicator::update can be any static functionpointer and
// communicator can be a nullptr
CallbackTimer* timer = new CallbackTimer(1000, Communicator::update, communicator);
CallbackTimer::loop(static_cast<void*>(timer));

这实际上有效,但它非常丑陋,最后,当计时器停止时,您会有一个小的内存泄漏(如果我不使用智能指针)。

我想知道是否有一种方法可以多次使用,例如:alt_alarm

static long unsigned int CallbackTimer::loop(void* vpTimer){
    CallbackTimer* timer = static_cast<CallbackTimer*>(vpTimer);

    timer->m_callback(timer->m_context);

    alt_alarm_stop(&(timer->m_alarm));
    alt_alarm_start(&(timer->m_alarm), timer->m_time, CallbackTimer::loop, 
                    static_cast<void*>(timer));
    return 0;
}

这段代码对我来说看起来不错,但回调只会执行两次。感谢您的帮助。

C++ 定时器 英特尔-FPGA NIOS

评论

0赞 463035818_is_not_an_ai 11/9/2023
它丑陋,因为你使用,它泄漏,因为你使用.两者的解决方案都是干脆不这样做。void*new
0赞 463035818_is_not_an_ai 11/9/2023
对于不起作用的代码,请包括一个最小的可重现示例,并解释什么是“不起作用”
0赞 l3LAETTI 11/9/2023
@463035818_is_not_an_ai 我使用 a,因为这是 alt_alarm_start 中必需的参数类型。智能指针可以摆脱 ,但我认为有一种更有效的方法,而不是在每次迭代中创建一个新对象。void*new
0赞 463035818_is_not_an_ai 11/9/2023
loop莫。而且你不需要智能指针来摆脱 ,就可以了alt_alarm_startnewauto timer = CallbackTimer(1000, Communicator::update, communicator);
1赞 l3LAETTI 11/9/2023
@463035818_is_not_an_ai接受带有类型的三个参数,并且由于作为第二个参数传递,因此它需要具有 类型的一个参数。alt_alarm_startlong unsigned int, long unsigned int (*callback)(void*), void *contextloopvoid*

答: 暂无答案