提问人:l3LAETTI 提问时间:11/9/2023 最后编辑:l3LAETTI 更新时间:11/9/2023 访问量:42
C++:在 NIOS II 上多次使用 alt_alarm
C++: Use alt_alarm multiple times on NIOS II
问:
我有一个计时器类,如下所示:
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;
}
这段代码对我来说看起来不错,但回调只会执行两次。感谢您的帮助。
答: 暂无答案
评论
void*
new
void*
new
loop
莫。而且你不需要智能指针来摆脱 ,就可以了alt_alarm_start
new
auto timer = CallbackTimer(1000, Communicator::update, communicator);
alt_alarm_start
long unsigned int, long unsigned int (*callback)(void*), void *context
loop
void*