静态模板成员用作中断服务例程

时间:2016-11-16 16:00:44

标签: c++ templates interrupt avr

在下面的Mapper类中,静态成员函数timer0CompA用作中断服务例程。它的名字是" __ vector_14"在中断向量中。

struct Mapper {
    static void timer0CompA() __asm__("__vector_14") __attribute__((__signal__, __used__, __externally_visible__));  
};
void Mapper::timer0CompA(){}

如果我尝试使用与模板类相同的approch

template<typename T>
struct Mapper {...};

模板成员函数未插入中断向量。

我知道如果它可以工作会有问题:不同的实例化会在汇编代码中得到相同的名称,因此我们会得到一个双重定义的符号。但就我而言,这将是有用的......

任何提示?

1 个答案:

答案 0 :(得分:0)

一种运行时解决方案,并非完全理想:

  1. 禁用设备上的中断。
  2. 建立一个将要使用的中断数组,其格式与isr向量数组相同。
  3. 覆盖ISR闪存部分。确保保存闪存页面中未使用的部分,并将其写回。
  4. 重新启用设备上的中断。

但是,由于您需要一次编写整个Flash页面,因此最好一次完成所有操作。

注意:您可能会发现自己不小心覆盖了应用程序代码,因此请确保用于执行更改的功能不在Flash的该部分中,并且应将未使用的页面部分写回。