问题描述
请考虑以下代码:
struct timer_s {
timer_s(void (*func)(void *),void *data,uint64_t period = 0)
: func(func),data(data),period(period) {}
void (*func)(void *);
void *data;
uint64_t period;
};
static std::map<uint64_t,std::unique_ptr<timer_s>> TIMERS;
extern "C" void default_machine_timer_interrupt_handler(void) {
auto mtime = interrupt_timer_mtime_get();
if (TIMERS.empty()) {
interrupt_timer_disable();
return;
}
auto it = TIMERS.begin();
it->second->func(it->second->data);
if (it->second->period) std::swap(TIMERS[mtime + it->second->period],it->second);
TIMERS.erase(it);
if (!TIMERS.empty()) {
interrupt_timer_cmp_set(TIMERS.begin()->first);
return;
}
interrupt_timer_disable();
}
void create_timer(void (*fun)(void *),uint32_t usec,timer_type_t timer_type) {
auto when = interrupt_timer_mtime_get() + usec;
auto enable = false;
if (TIMERS.empty()) enable = true;
TIMERS.insert(std::make_pair(when,std::unique_ptr<timer_s>(new timer_s(
fun,data,timer_type == TIMER_REPEAT ? usec : 0))));
interrupt_timer_cmp_set(TIMERS.begin()->first);
if (enable) interrupt_timer_enable();
}
我的问题是关于在ISR中使用STL之类的高级解决方案。为了讨论起见,让我们离开性能(在中断上下文中执行复杂的操作)。
default_machine_timer_interrupt_handler
是从ISR运行的,而 create_timer
是从主要上下文运行的。它工作正常。但为什么?映射TIMERS
不稳定,并且优化已启用。只是巧合吗?当我必须标记值为volatile
吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)