是否可以在运行时在M0 +上设置ISR处理程序

我的SAMD21 ARM M0 +有一个“默认”resetVectors.c文件。 它有一些看起来像:

__attribute__ ((section(".vectors"))) const DeviceVectors exception_table = { ... }; 

在其中定义不同的处理程序存根的位置。 出于测试目的,我想使用其中一个未使用的外设IRQ。

默认情况下,未使用的设置为NULL地址。 我已向自己certificate我可以修改该文件,并在编译时更改我未使用的IRQ(21)以触发处理程序。 但是,是否可以在编译时间之外完成此操作?

我观察到该表似乎是基于偏移0.所以我尝试了这个:

 DeviceVectors *table = 0x0000000; table->pvReserved21 = PV21Handler; 

但这只是挂板。 是否有动态方式在运行时分配处理程序?

在Cortex-M中,可以在运行时设置向量表的地址。 因此,为了设置特定的向量,您需要将向量表定位到RAM中。

在这种情况下,最简单的方法是将exception_table指向的向量表复制到RAM,修改需要在RAM副本中更改的特定向量,然后将向量表切换到RAM副本。

但请注意,向量表偏移寄存器在Cortex-M0 +上是可选的,可能无法在所有器件上实现。 然而,它在SAMD21上实现(参见数据表摘要的 7.1.1)。

您可以将向量表放在RAM中,或者如果您不想要它,可以将其复制到FLASH存储器中的新位置,从而更改ISR向量。 然后,您可以更改向量表本身的地址。