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

Is it possible to set ISR Handler at runtime on M0+

我的 SAMD21 ARM M0+ 有一个 "default" resetVectors.c 文件。它看起来像:

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

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

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

我观察到 table 似乎基于偏移量 0。所以我尝试了这个:

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

但这只是挂起董事会。有没有在运行时动态分配处理程序的方法?

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

这种情况最简单的方法就是将exception_table指向的向量table拷贝到RAM中,在RAM拷贝中修改你需要改变的具体向量,然后切换向量table复制到RAM中。

但是请注意 Vector Table Offset Register is optional on Cortex-M0+ and may not be implemented on all devices. It is however implemented on SAMD21 (see 7.1.1 of the datasheet summary.

您可以将向量 table 放入 RAM 中,或者如果您不想要它,您可以将它复制到闪存中的新位置,更改 ISR 向量。然后你可以改变向量table本身的地址。