在ISR中使用STL-嵌入式软件

问题描述

请考虑以下代码:

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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...